如何在GCC编译器源代码中获取结构字段数据类型并进行修改?

问题描述

如果我有这样的结构:

var sentence = 'Hello my friends';
var words = sentence.split;
var longWordLength = 0;
var longword = 'i';

function findLongWord (sentence){ 
for (a = 0; a < words.length; a++){
  if (words[a].length > longWordLength){
    longWordLength = words[a].length;
    longWord = words [a];
    return longWord}
  }
  console.log(longWord);

如何修改GCC编译器源代码,使其如下所示:

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

我现在有这样的要求,我需要修改gcc源代码,以便当他编译某种模式的结构时,他可以将其类型更改为指定的类型。

谢谢!

解决方法

您的目标非常雄心勃勃!

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

我的建议:

  • 预算您的工作时间数月(也许是几年)-至少有6个月的时间才能获得“概念验证”的东西,而这在大多数代码中都是失败的碱基(以C表示)。对于C ++,请再添加一整年。

  • 请仔细阅读C11标准n1570(如果目标是C)和C ++ 11标准n3337(如果目标是C ++)。仅此一项工作就可能需要您一个月的时间。

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

  • 定位到GCC的最新可用版本。在2020年9月,这意味着GCC 10。插件和GCC API不能兼容地从一个版本更改为另一个版本。如果您需要特别遵守GCC 8,请准备为AdaCore之类的公司花费大量资金。

  • 仔细阅读documentation on GCC internals。您需要了解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(或Clang)并将工具设计为C to C transpiler

#define float double之后加上#undef float这样的聪明的预处理器技巧可能就足够了。