如何从 LLVM IR 输出 ARM V8 程序集?
How to output ARM V8 assembly from LLVM IR?
我有这个 C 文件:
int mult() {
int a =5;
int b = 3;
int c = a * b;
return c;
}
我像这样将它编译成 LLVM IR:
$ clang -emit-llvm -S multiply.c -o multiply.ll
然后我将它编译成各种 x86 程序集,如下所示:
$ llc --filetype asm -o multiply.apple.s --aarch64-neon-syntax=apple multiply.ll
$ llc --filetype asm -o multiply.intel.s --x86-asm-syntax=intel multiply.ll
如何输出ARM V8汇编?有什么方法可以将 C 文件转换为输出 ARM V8 程序集,即使没有 LLVM IR 如果 LLVM IR 不能做到这一点?例如,我在 llc docs 中看不到它。
llc -march=aarch64 multiply.ll -o multiply.s
会做到的。
但是,您实际上不应该这样做,因为从 C 到 LLVM IR 的转换是 target-dependent。简单的事情会起作用,复杂的程序会以看似不可能的方式崩溃。
相反,使用 clang -target arm64
从 C 直接转到您的目标。随着您的程序变得越来越复杂,例如使用系统 headers,您将需要安装与目标平台相匹配的 SDK。即使 #include <stdlib.h>
在两个平台上也有很大不同。
我有这个 C 文件:
int mult() {
int a =5;
int b = 3;
int c = a * b;
return c;
}
我像这样将它编译成 LLVM IR:
$ clang -emit-llvm -S multiply.c -o multiply.ll
然后我将它编译成各种 x86 程序集,如下所示:
$ llc --filetype asm -o multiply.apple.s --aarch64-neon-syntax=apple multiply.ll
$ llc --filetype asm -o multiply.intel.s --x86-asm-syntax=intel multiply.ll
如何输出ARM V8汇编?有什么方法可以将 C 文件转换为输出 ARM V8 程序集,即使没有 LLVM IR 如果 LLVM IR 不能做到这一点?例如,我在 llc docs 中看不到它。
llc -march=aarch64 multiply.ll -o multiply.s
会做到的。
但是,您实际上不应该这样做,因为从 C 到 LLVM IR 的转换是 target-dependent。简单的事情会起作用,复杂的程序会以看似不可能的方式崩溃。
相反,使用 clang -target arm64
从 C 直接转到您的目标。随着您的程序变得越来越复杂,例如使用系统 headers,您将需要安装与目标平台相匹配的 SDK。即使 #include <stdlib.h>
在两个平台上也有很大不同。