由于一些丑陋的原因,我不会在这里讨论,我需要对我的 C 编译器(gcc/clang)如何将函数生成的程序集组合在一起进行一些控制。假设我在函数 f
中有一段代码,由一对标签 start
标记和stop
:
void f() {
...
start:
x = 0;
y = -1;
return;
stop:
...
}
我希望为上述 block 生成的程序集是连续的指令序列,就像 C 指令一样。但 C 编译器可能会选择优化,例如,如果同一指令在源程序中重复多次,则共享同一指令的汇编代码。上面的例子中,如果f
中有很多其他地方哪里y = -1; return
,情况可能是编译器决定为这一对 C 语句仅生成一个汇编指令序列,并在任何时候找到 y = -1; return
时向其发出跳转指令。 。除了将语句包含在函数中(这在我的用例中会非常麻烦)或汇编编程(这会在可能的情况下违背使用高级语言的目的)之外,是否有其他方法可以防止这种情况发生?还是我完全没有希望了?
最佳答案
我怀疑这确实是一个 X-Y 问题,但由于您似乎不愿意讨论想要按照您所说的去做的原因,所以我将回答您实际提出的问题。
您提示用汇编语言编写代码会“违背使用高级语言的目的”,但事实上这正是您想要做的。如果您关心函数的汇编代码的细节,那么您应该用汇编语言编写。如果您使用高级编译语言编写,那么您就可以说您同意编译器选择机器代码详细信息。无论如何,除了禁用优化(无论如何不能 100% 保证做你想做的事情)之外,GCC 和 clang 不提供任何方法来对 C 源代码生成进行你所描述的控制。
但是,您不一定需要用汇编语言编写整个函数,并且您当然不需要为了不需要如此精细控制的部分而放弃 C。 GCC/clang 支持内联汇编,使用它您可以在汇编中只编写您特别关心的部分。据我所知,您可以将内联汇编视为黑盒——不受任何优化,并且不会相对于周围代码重新排序。
关于c - 有没有办法告诉 gcc/clang 将一些代码块放在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40133185/