如何从 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> 在两个平台上也有很大不同。