GCC编译器源码中如何获取结构域数据类型并修改?

How to get the structure field data type in the GCC compiler source code and modify it?

如果我有这样的结构:

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

如何修改GCC编译器源码使之如下:

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

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

谢谢!

你的目标很有野心!

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

我的建议:

  • 为这项工作预算几个月的时间(也许几年)- 至少 6 个月的全职时间来获得“概念验证”在大多数代码库(C 中)上会失败的事情。对于 C++,再添加一整年。

  • 仔细阅读 C11 标准 n1570 (if you target C), and the C++11 standard n3337(如果您的目标是 C++)。仅此一项努力就可能需要您整整一个月的时间。

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

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

  • 仔细阅读documentation on GCC internals. You need to understand the GENERIC表示。

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

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

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

    来构建它
  • 阅读this draft报告。

  • gcc@gcc.gnu.org mailing list 上用书面英语寻求帮助,但之前有一些可用的插件。

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

如果您的代码库是 C 语言,请考虑使用 Frama-C (or Clang) and design your tool as a C to C transpiler

也许像 #define float double 后跟 #undef float 这样聪明的预处理器技巧就足够了。