是否可以为移动GC实现生成具有类型信息的ansi C函数



我想知道有什么方法可以将类型信息添加到生成的C方法中。我正在将一种更高级的编程语言转换为C,我想添加一个移动垃圾收集器。然而,要做到这一点,我需要方法变量具有键入信息,否则我可以修改一个看起来像指针的基元值。

一种明显的方法是将所有(基元和非基元)变量封装在一个结构中,该结构具有用于键入信息的额外(枚举)变量,但这会导致内存和性能开销,即传输的代码适用于嵌入式平台。如果我接受内存开销,那么显而易见的选择是对所有对象使用堆句柄,然后我就可以自由移动堆块了。然而,我想知道是否有更有效、更好的方法。

我已经想出了一个潜在的解决方案,即根据变量是否为基元来预先声明和分组变量(我可以在transplaner中这样做),并在最后为每个方法添加一个偏移变量(我需要在扫描堆栈区域时能够准确地找到它),这告诉我非基元变量从哪里开始,从哪里结束,所以我只能扫描它们。这意味着每个方法都将使用额外的16/32位内存(取决于arch),但这仍然应该比堆句柄方法更高效。

示例:

void my_func() {
int i = 5;
int z = 3;
bool b = false;
void* person;
void* person_info = ...;
.... // logic
volatile int offset = 0x034;
}

我的目标是在GCC编译器中通用,因此我关心的是:

  • 编译器是否可以根据变量在源代码
  • 我可以强制编译器在方法的堆栈框架(使用volatile)
  • 扫描堆栈时,我能准确地找到偏移吗

我希望避免汇编,这样这种方法就可以(默认情况下)在多个平台上工作,但我对方法持开放态度,即使它们涉及汇编(如果它们是可靠的)。

键入信息可以以某种方式编码在C函数名中;这是由C++和其他实现完成的,称为名称篡改。

事实上,由于所有的C代码都是生成的,您可以决定采用一种不同的约定:生成长的C标识符,这些标识符实际上是唯一的,在程序范围内是随机的,例如tiziw_7oa7eIzzcxv03TmmZ,并将它们的键入信息保存在其他地方(例如一些数据库)。在Linux上,这种方法对libbacktrace和dlsym(3)+dladdr(3。

键入信息实际上与调用约定和ABI有关。例如,Linux的x86-64 ABI要求不同的处理器寄存器用于传递浮点或指针。

阅读垃圾收集手册或至少阅读p.Wilson的Uniprocessor垃圾收集技术调查。您可以决定使用带标记的整数而不是装箱,也可以决定使用保守的GC(例如Boehm的GC)而不是精确的GC。在我以前的GCCMELT项目中,我为一代复制GC生成了C或C++代码。Bismon和RefPerSys中都使用了类似的技术。

由于您正在转换到C,所以还可以考虑其他选项,例如libgccjit或LLVM。调查libjit和asmjit。

还研究了其他transfiler(C的编译器)的实现,包括Chicken/Scheme和Bigloo。

GCC编译器能否根据变量在源代码中的声明方式对其进行重新排序?

当然可以,这取决于您所要求的优化。有些变量甚至不存在于二进制文件中(例如,那些留在寄存器中的变量)。

我可以强制编译器将一些数据放入方法的堆栈帧中吗(使用volatile)?

最好生成一个包含所有语言变量的单个struct变量,并将优化留给编译器。你会感到惊讶(见这份报告草稿)。

扫描堆栈时,我能准确地找到偏移量吗?

这是最困难的,并且在很大程度上取决于编译器优化(例如,如果您在生成的C代码上使用-O1-O3运行gcc;在某些情况下,最近的GCC(例如Linux的x86-64上的GCC 9或GCC 10)能够进行尾调用优化;通过使用gcc -O3 -S -fverbose-asm进行编译,然后查看生成的汇编代码进行检查)。如果您接受一些小型目标处理器和编译器特定的技巧,这是可行的。研究Ocaml编译器的实现。

给我发一封电子邮件(到basile@starynkevitch.net)进行讨论。请在其中提及您问题的URL。

如果您想拥有一个具有多线程的高效世代复制GC,事情就会变得非常棘手。那么问题来了,你能负担得起多少年的发展。

如果你的语言有例外,也要格外小心。您可以非常谨慎地生成对longjmp的调用。

当然,看看我的答案。

使用transpiling技术,邪恶在于细节

在Linux上(特别是!)还可以参阅我的manydl.c程序。它展示了在Linux x86-64笔记本电脑上,您可以在实践中生成数十万个dlopen(3)-ed插件。然后阅读如何编写共享库

还研究了SBCL和GNU Prolog的实现,至少可以获得启发。

PS。一个完全与体系结构无关、与操作系统无关的转发器的梦想是一种幻觉。

最新更新