mar*_*guy 6 c gcc garbage-collection clang tcc
我正在尝试将历史功能语言解释器(EMAS的KRC)移植到现代系统(C for Unix),并且它有一个垃圾收集器,希望能够扫描堆栈以获取指向堆的指针,以了解它必须重新定位哪些指针在GC期间移动堆中的对象时.为此,必须在堆栈中找到指向堆的所有函数参数和局部变量.
现在,有一段时间"注册"关键字意味着"如果你愿意,你可以把这个变量放在寄存器中",否则它就在堆栈上,但现在所有(GCC,Clang,Tinyc/tcc)C编译器似乎无论如何都将局部变量放入寄存器中,无法禁用此行为,结果是GC错过了属于正在进行的函数的某些值,无法保留它们并破坏堆.
有没有办法告诉任何这些编译器使用原始的C语义,除非你说"注册",否则所有局部变量都在堆栈中?
我有一些狡猾的"解决方案":
这似乎都改善了问题,但是非常黑客和不可靠.
是否有更好的方法来实现所需的结果,确保所有函数参数和局部变量都在堆栈中?
我想你使用了一种“标记和清除”GC。在这种情况下,您只需要在标记阶段开始时保存寄存器。我的建议是检查您的 GC,找到“标记和清除”操作开始的位置,并在此处放置将所有寄存器放入可访问内存的代码。setjmp是实现此目的的半便携式方法(除非您正在使用 sparc)。