LLVM作为不同语言的基本编译器

Bha*_*waj 5 c llvm dynamic-linking llc rust

我是LLVM编译器和基础架构的新手.我有以下想法.Clang是C/C++的LLVM前端,类似Rustc for Rust编程语言.两者都可以发出LLVM IR代码,并且可以将发出的代码编译为可执行应用程序.

我的问题是可以链接不同的编程语言吗?示例如下 -

/* Code in C */
int add(int, int);
int main()
{
  printf("%d", add(5 ,6));
}
Run Code Online (Sandbox Code Playgroud)

以Rust中定义的函数为例

// Code in Rust
fn main()
{
  println!("{}", add(5, 6));
}

fn add (x: i32, y: i32) -> i32
{
  x + y
}
Run Code Online (Sandbox Code Playgroud)

从两个源文件生成IR后,是否可以链接它们并创建单个应用程序?

我很想知道这是否有效,请告诉我.

Mat*_* M. 5

简短回答:是的.


答案很长:是的,只要满足一些要求.

兼容性有两种:API(应用程序接口)和ABI(应用程序二进制接口).本质上,API指示您的程序是否编译,而ABI指示它是否链接,加载和运行.

由于Rust具有C FFI,因此Rust可以发出通常可以与C交互的代码(对于所考虑的平台,它具有适当的C ABI).这很明显,Rust二进制文件可以调用C库.

如果您使用该Rust二进制文件的LLVM IR,该C库的LLVM IR,将它们合并在一起,并使用LLVM生成新的二进制文件,那么您将获得单个二进制文件(无依赖关系).

因此,"唯一"的要求是您的两段代码必须能够首先独立地链接/加载/运行.


获得独立于LLVM的单个二进制文件的另一种方法是静态链接 ; 在Rust中,您可以使用静态链接与C标准库的musl实现.在LLVM IR上合并的主要优点是,您可以在合并的IR上运行LLVM优化传递,因此可以从跨语言内联(和其他优化)中受益.


Ben*_*eff 3

首先,Rust 和 C 可以通过 Rust 的 FFI(外部函数接口)进行对话。对于非常基本的功能,我想可以将两种语言编译为 LLVM 并具有某种功能,但我们正在谈论 hello world 长度的程序(尽管可能甚至没有达到那个级别)。一般来说,必须有某种ABI来实现您的建议。然而,即使使用 ABI,实现也是在前端级别完成的。

简而言之,LLVM 无法表示所有语言特定的构造。所以你不能仅仅链接两个程序的 LLVM IR 并希望它能工作。前端必须要做一些工作来保证两种语言之间的兼容性。