使用gcc插件修改变量声明的顺序

时间:2015-04-07 09:57:03

标签: c++ gcc plugins g++ gimple

我知道这很难做到,我应该避免这样做,但我有我的理由。 我想在编译时修改一些字段声明的顺序,例如:

class A {
  char c;
  int i;
}

必须转向:

class A {
      int i;
      char c;
}

如果我选择更换ic的顺序, 我想知道如何更改具有location

的字段声明的tree

任何人都知道我该怎么做? 谢谢!

我使用g ++ 4.9.2版本的插件

2 个答案:

答案 0 :(得分:2)

如果我要尝试这个,我会尝试两种不同的方法。

  1. 挂钩到PLUGIN_FINISH_TYPE事件并在那里重写类型。要重写它,重新排序字段并强制重新排序类型。您必须阅读一些GCC源代码,以了解如何使布局无效并强制使用新布局。

  2. 如果这样做不起作用,请添加一个在gimplification之后运行的新传递,并尝试重写那里的类型。我怀疑这不太可行。

答案 1 :(得分:0)

  
      
  1. 连接到PLUGIN_FINISH_TYPE事件并在那里重写类型。要重写它,请对字段重新排序并强制重新布局该类型。您必须阅读一些GCC资料,以了解如何使布局无效并强制使用新的布局。
  2.   

这是在Linux内核的randomize_layout_plugin.c中实现的。

此解决方案有效,但可以分解侏儒调试信息。实际上,在调试信息中,成员的顺序与源代码中最初定义的顺序相同,但是在二进制文件中结构被很好地改组了。