我正在使用具有有限且不相交的程序存储器的嵌入式项目。
我遇到一个问题,优化器有时会为case语句创建跳转表,它会调用__switch
并在调用后放置一个偏移表。
这个想法是__switch
计算表中的偏移量,将其添加到其地址并执行短的相对jmp。
问题是调用__switch
函数的case语句可能是0x600xxxxx而_switch是0x80xxxxx,创建的短相对jmp无法返回到0x600xxxxx。
我可以使用脚本来检测这个并使构建失败,我们可以使用if语句而不是case语句来解决。
我想要的是告诉链接器如果距离很远则不使用_switch
,即不要从code::_switch
调用code2::xx
。
专有编译器基于gnu gcc 4.7.3。
有什么想法吗?
备选答案可能是在两个部分中生成给定函数(__switch
)的副本,以及使优化器选择最接近的方法。
更新
我找到--fno-jump-tables
选项,听起来像是一个很好的解决方法。
编译器理解它,但它对生成的代码没有任何影响。
我正在使用LTO,所以链接器可能需要了解它,但是我会退出,将其视为未知选项。
同样-fno-tree-switch-conversion
,会更改大量生成的代码,但不会删除我的问题。