gpt4 book ai didi

c++ - 在 LLVM 中创建模块化语言?

转载 作者:太空狗 更新时间:2023-10-29 21:16:40 24 4
gpt4 key购买 nike

我正在开发一种新语言 LLVM使用编译为 objective-c ABI 的 C++ API。

我想通过允许最终用户构建有效的静态库来支持模块化编译。我注意到 LLVM C++ API 有一个 llvm::Linker我可以在编译期间使用它来组合源文件 (llvm::Module),但是我想通过元数据版本号或至少通过单独编译运行之间的公开接口(interface)来保证库兼容性。

metadata 上提供的大部分信息在 LLVM 中建议它应该只用于扩展信息,这些信息在静默删除时不会破坏正确性。

  1. llvmblog
  2. IntrinsicsMetadataAttributespdf

我不认为这会破坏交易,因为它可能是全局元数据,但在这一点上征求第二意见会很好。

我也知道IRReader to parseIRFile中有一个方法所以我可以加载一些以前构建的 bc 文件。我很好奇在加载这些文件时包含大小和 CRC 信息以进行比较是否合理。

我的语言具有类似于 C# 的概念,包括接口(interface)。我认为我可以通过导入/导出接口(interface)类型以及外部函数来允许模块化编译(很像 C++,我不将语言限制为仅类的方法)。

这种方法允许我在界面中包含特定于语言的信息,而无需在 IR 中对其进行编码,因为使用界面构建时需要库和调用代码。这再次要求接口(interface)兼容。

一种需要扩展信息的语言特性是函数中的命名参数。

我的语言是非常类型安全的,并且还要求命名参数,因此没有预先确定的函数参数顺序。这允许调用站点更加明确,编译器可以捕获错误的参数使用,并且作者可以更自由地确定默认参数,因为它们不限于函数的最后一个参数。

编译器需要知道这些参数的名称、修饰符、默认值等,以便在编译时正确映射调用,因此我认为接口(interface)方法在这里会很有效。

TL;DR

  1. LLVM 是否有任何用于构建静态库的预定义工具?
  2. 版本号、大小和 CRC 信息是否是 LLVM 元数据的合理用例?

最佳答案

这可能不是一个完整的答案……或者至少不是一个完整的答案。

我喜欢这个问题,因为我将来(在接下来的几个月或几年的某个时间)也需要为我的 Pascal 编译器提供解决方案。它支持“单位”,这意味着是一个单独编译的对象,但目前我所做的只是简单地拖入源文件并将其编译到主 llvm::Module - 这既不高效也不灵活(例如,不能使用链接器在某些代码的“Linux”和“Windows”版本之间进行选择 - 并不是说​​我认为我的编译器有 5% 的机会在 Windows 上运行而无需修改......)

但是,我不确定将“对象”文件存储为 LLVM IR 是否正确。我在想更好的方法是以某种序列化的形式存储你的 AST - 然后

  1. 您不依赖于更改 IR 格式的 LLVM 版本。
  2. 您可以添加任何您喜欢的元数据。不会有太多在您的链接阶段或从中生成 LLVM-IR 的区别在编译时构建 IR,然后读取 IR 以确定是否元数据是正确的。 [正如您可能已经发现的那样,缓慢的部分是优化和 MC 生成,无论哪种方式,您仍然必须这样做]

就像我开始时一样,我不确定这是一个答案,但到目前为止这是我对这个主题的想法。现在我要回去为我的 Pascal 编译器添加调试符号了……圣诞节前,我在 GDB 中看不到源代码。现在我可以一步了,但还没有查看变量...

关于c++ - 在 LLVM 中创建模块化语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34537555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com