我正在使用C ++ API在LLVM中开发一种新语言,该API编译为目标C ABI。
我想通过允许最终用户构建有效的静态库来支持模块化编译。我注意到LLVM C ++ API有一个llvm::Linker类,我可以在编译时使用它来组合源文件(llvm::Module),但我想通过元数据版本号或至少公开的接口来保证库的兼容性在单独的编译运行之间。
LLVM中metadata上提供的大部分信息表明它只应用于在无声删除时不会破坏正确性的扩展信息。
我不认为这会成为一个交易破坏者,因为它可能是全局元数据,但在这一点上得到第二个意见会很好。
我也知道IRReader to parseIRFile中有一个方法,所以我可以加载一些以前构建的bc文件。如果在加载这些文件时包含大小和CRC信息以进行比较是合理的做法,我会很好奇。
我的语言具有类似于C#的概念,包括接口。我想我可以通过导入/导出接口类型以及外部函数来允许模块化编译(很像C ++,我不会将语言限制为只有类的方法)。
这种方法允许我在接口中包含特定于语言的信息,而不需要在IR中对其进行编码,因为需要使用接口构建库和调用代码。这又要求接口兼容。
需要扩展信息的一种语言功能将被命名为函数中的参数。
我的语言非常类型安全,并且还要求命名参数,因此没有预定的函数参数顺序。这允许调用站点更明确,编译器捕获错误的参数使用,并且作者在确定默认参数时具有更多自由,因为它们不限于函数的最后参数。
编译器需要知道这些参数的名称,修饰符,默认值等,才能在编译时正确映射调用,所以我认为接口方法在这里工作得很好。
答案 0 :(得分:3)
这可能不是一个答案......或者至少不是一个完整的答案。
我喜欢这个问题,因为我的Pascal编译器将来也需要一个解决方案(在接下来的几个月或几年的某个时间)。它支持"单位"这是一个单独编译的对象,但目前我所做的只是拖入源文件并将其编译到主llvm::Module
- 这既不高效也不灵活(不能使用)链接器可以在某些代码的" Linux"和#34;版本之间进行选择 - 而不是我认为我的编译器有5%的可能性在没有修改的情况下在Windows上工作...)
但是,我不确定存储"对象"作为LLVM IR的文件是正确的做法。我认为更好的方法是将AST以某种序列化形式存储 - 然后
就像我刚开始时一样,我不确定这是一个答案,但到目前为止我对这个问题的想法。现在我回去向我的Pascal编译器添加调试符号...在圣诞节前,我无法在GDB中看到源代码。现在我可以迈出一步,但还没有查看变量......