小编mar*_*guy的帖子

如何坚持C编译器将局部变量放在堆栈上,而不是寄存器中

我正在尝试将历史功能语言解释器(EMAS的KRC)移植到现代系统(C for Unix),并且它有一个垃圾收集器,希望能够扫描堆栈以获取指向堆的指针,以了解它必须重新定位哪些指针在GC期间移动堆中的对象时.为此,必须在堆栈中找到指向堆的所有函数参数和局部变量.

现在,有一段时间"注册"关键字意味着"如果你愿意,你可以把这个变量放在寄存器中",否则它就在堆栈上,但现在所有(GCC,Clang,Tinyc/tcc)C编译器似乎无论如何都将局部变量放入寄存器中,无法禁用此行为,结果是GC错过了属于正在进行的函数的某些值,无法保留它们并破坏堆.

有没有办法告诉任何这些编译器使用原始的C语义,除非你说"注册",否则所有局部变量都在堆栈中?

我有一些狡猾的"解决方案":

  • 在任何地方添加额外的代码来获取每个面向堆的局部变量的地址并将其传递给虚函数,作为强制它在内存位置的一种方式;
  • 使所有静态函数全局化,以避免函数内联以及内联函数参数的优化输出;
  • 将GC()函数括在一个存根中,该存根将所有机器寄存器压入堆栈,调用真正的GC()函数然后弹出它们;

这似乎都改善了问题,但是非常黑客和不可靠.

是否有更好的方法来实现所需的结果,确保所有函数参数和局部变量都在堆栈中?

c gcc garbage-collection clang tcc

6
推荐指数
1
解决办法
1425
查看次数

标签 统计

c ×1

clang ×1

garbage-collection ×1

gcc ×1

tcc ×1