-1

如果我有这样的结构:</p>

struct test{
   float c,
         f,
         ops;
};

如何修改GCC编译器源代码,使其如下:</p>

struct test{
  double c,
         f,
         ops;
};

我现在有这样一个需求,我需要修改gcc源码,让他在编译某种模式的结构时,把它的类型改成指定的类型。

谢谢!</p>

4

1 回答 1

2

你的目标非常雄心勃勃!

一种可能的方法是开发自己的GCC 插件来完成这项工作。

我的建议:

  • 为这项工作预留几个月的时间(也许是几年)——至少需要 6 个月的全职时间来获得在大多数代码库(在 C 中)会失败的“概念证明”。对于 C++,再增加一整年。

  • 仔细阅读 C11 标准n1570(如果您以 C 为目标)和 C++11 标准n3337(如果您以 C++ 为目标)。仅此一项努力就可能需要您整整一个月的时间。

  • 使您的插件成为开源软件,并将其代码快速(例如在 LGPL 许可下)放在某个存储库上,例如githubgitlab

  • 以最新可用版本的 GCC 为目标。在 2020 年 9 月,这意味着GCC 10。插件和 GCC API 不兼容地从一个版本更改为下一个版本。如果您需要特别坚持使用 GCC 8,请准备好为 AdaCore 等公司花费大量资金。

  • 仔细阅读GCC internals 的文档。您需要了解GENERIC表示。

  • 仔细研究 GCC 源代码的gcc/tree.defandgcc/treestruct.defgcc/gimple.deffiles。您需要基本了解其中的每一行。

  • 仔细研究gcc/passes.defGCC 源代码的文件。同样,您需要了解该文件中的每一行。

  • 学习从源代码编译 GCC。你当然想用g++ -Wall -Wextra -g -O1

  • 阅读这份报告草稿

  • gcc@gcc.gnu.org在邮件列表上用书面英语寻求帮助,但之前有一些工作插件。

  • 考虑从这项工作中获得博士学位。这是值得的。法国的 Alexandre Lissy 获得了一个非常相似主题的博士学位。

如果您的代码库是 C 语言,请考虑使用Frama-C(或Clang)并将您的工具设计为C 到 C 转换器

也许聪明的预处理器技巧就像#define float doublefollow#undef float可能就足够了。

于 2020-09-20T12:48:16.513 回答