如果我有这样的结构:</p>
struct test{
float c,
f,
ops;
};
如何修改GCC编译器源代码,使其如下:</p>
struct test{
double c,
f,
ops;
};
我现在有这样一个需求,我需要修改gcc源码,让他在编译某种模式的结构时,把它的类型改成指定的类型。
谢谢!</p>
如果我有这样的结构:</p>
struct test{
float c,
f,
ops;
};
如何修改GCC编译器源代码,使其如下:</p>
struct test{
double c,
f,
ops;
};
我现在有这样一个需求,我需要修改gcc源码,让他在编译某种模式的结构时,把它的类型改成指定的类型。
谢谢!</p>
一种可能的方法是开发自己的GCC 插件来完成这项工作。
我的建议:
为这项工作预留几个月的时间(也许是几年)——至少需要 6 个月的全职时间来获得在大多数代码库(在 C 中)会失败的“概念证明”。对于 C++,再增加一整年。
仔细阅读 C11 标准n1570(如果您以 C 为目标)和 C++11 标准n3337(如果您以 C++ 为目标)。仅此一项努力就可能需要您整整一个月的时间。
以最新可用版本的 GCC 为目标。在 2020 年 9 月,这意味着GCC 10。插件和 GCC API 不兼容地从一个版本更改为下一个版本。如果您需要特别坚持使用 GCC 8,请准备好为 AdaCore 等公司花费大量资金。
仔细阅读GCC internals 的文档。您需要了解GENERIC表示。
仔细研究 GCC 源代码的gcc/tree.def
andgcc/treestruct.def
和gcc/gimple.def
files。您需要基本了解其中的每一行。
仔细研究gcc/passes.def
GCC 源代码的文件。同样,您需要了解该文件中的每一行。
学习从源代码编译 GCC。你当然想用g++ -Wall -Wextra -g -O1
阅读这份报告草稿。
gcc@gcc.gnu.org
在邮件列表上用书面英语寻求帮助,但之前有一些工作插件。
考虑从这项工作中获得博士学位。这是值得的。法国的 Alexandre Lissy 获得了一个非常相似主题的博士学位。
如果您的代码库是 C 语言,请考虑使用Frama-C(或Clang)并将您的工具设计为C 到 C 转换器。
也许聪明的预处理器技巧就像#define float double
follow#undef float
可能就足够了。