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