如何使用 llvm 制作与目标无关的 IR

how to make target independent IR with llvm

我想用 LLVM 制作目标独立 IR。

clang -emit-llvm -S source.c -o source.ll

在source.ll

target datalayout = "e-m:e-i64:..."
target triple = "x86_64-pc-linux-gnu"
...

据说LLVM IR是Target-independent的,但是target的属性是在实际的IR文件中指定的。

如何在没有此目标的情况下创建 LLVM IR 属性?

简答:你不能

长答案:target-neutrality是输入语言的属性,不是LLVM IR。虽然理论上可以为某些输入制作更多或更少的 target-neutral LLVM IR,但对于 C/C++ 输入是不可能的。我只会提到一些阻止我们拥有这样的 LLVM IR 的事情:

  1. 预处理器。 Target-specific #ifdef 子句显然使结果 IR target-specific
  2. 指针大小。想想像 sizeof(void*) 这样的表达式。这些是 target-dependent compile-time 常量(是的,以后有办法推迟这些常量的计算,但这不是前端准备处理的事情,这也阻碍了许多优化)
  3. 结构布局。部分取决于 2。(想想 struct { int foo; void* bar; }
  4. 各种ABI-related 参数/结果传递的必要支持步骤等
  5. 我不会提及 target-specific 向量、target-specific 指令集的内置函数等