我知道这很难做到,我应该避免这样做,但我有我的理由。 我想在编译时修改一些字段声明的顺序,例如:
class A {
char c;
int i;
}
必须转向:
class A {
int i;
char c;
}
如果我选择更换i
和c
的顺序,
我想知道如何更改具有location
tree
任何人都知道我该怎么做? 谢谢!
我使用g ++ 4.9.2版本的插件
答案 0 :(得分:2)
如果我要尝试这个,我会尝试两种不同的方法。
挂钩到PLUGIN_FINISH_TYPE
事件并在那里重写类型。要重写它,重新排序字段并强制重新排序类型。您必须阅读一些GCC源代码,以了解如何使布局无效并强制使用新布局。
如果这样做不起作用,请添加一个在gimplification之后运行的新传递,并尝试重写那里的类型。我怀疑这不太可行。
答案 1 :(得分:0)
- 连接到PLUGIN_FINISH_TYPE事件并在那里重写类型。要重写它,请对字段重新排序并强制重新布局该类型。您必须阅读一些GCC资料,以了解如何使布局无效并强制使用新的布局。
这是在Linux内核的randomize_layout_plugin.c中实现的。
此解决方案有效,但可以分解侏儒调试信息。实际上,在调试信息中,成员的顺序与源代码中最初定义的顺序相同,但是在二进制文件中结构被很好地改组了。