如何判断翻译单元是否正在使用分段堆栈进行编译

时间:2018-07-23 21:07:21

标签: c++ portability

在C ++中是否存在预处理器宏,常量或类似的东西可用于判断翻译单元是否正在使用分段堆栈(即,使用-fsplit-stack进行编译)?

任何编译器的答案都很好,但是我特别在寻找clang和gcc

2 个答案:

答案 0 :(得分:2)

根据this gcc wiki page,预处理器获取TARGET_SUPPORTS_SPLIT_STACK,运行时获取bool supports_split_stack()

答案 1 :(得分:0)

在撰写本文时,从GitHub mirror的master分支检查gcc源代码表明,flag_split_stack不会产生可见的副作用,除了在代码生成和链接级别上可能为时已晚。我没有像gcc那样深入地研究clang代码,但情况可能应该相似。

如果您还可以允许运行时检查,则可以为它们中的每一个编写特定于平台的检测(例如,通过检查代码进行__morestack() call检测;请参考morestack.S),但是从某种意义上说,它应该与objdump用法处于某种相似的状态,因为它不能在编译时诊断中加以利用。

最好的方法是向编译器供应商请求功能,或者,如果您可以控制构建系统,则可以使用-D-fsplit-stack本身来添加自定义宏。