use*_*534 7 c++ architecture arm llvm clang
在Ubuntu 64位下,我得到了
llc --version
LLVM (http://llvm.org/):
LLVM version 3.1
Optimized build with assertions.
Built Oct 15 2012 (18:15:59).
Default target: x86_64-pc-linux-gnu
Host CPU: btver1
Registered Targets:
arm - ARM
mips - Mips
mips64 - Mips64 [experimental]
mips64el - Mips64el [experimental]
mipsel - Mipsel
thumb - Thumb
x86 - 32-bit X86: Pentium-Pro and above
x86-64 - 64-bit X86: EM64T and AMD64
Run Code Online (Sandbox Code Playgroud)
我不能这样做
clang -march=arm -x c++ /tmp/cpp.cpp
error: unknown target CPU 'arm'
Run Code Online (Sandbox Code Playgroud)
我在这里错过了一些东西?为什么我无法为ARM编译?
-march 是 LLVM 的内部工具命令行选项,根本与 clang 无关。如果需要为其他目标编译,则需要指定目标三元组。这可以通过多种方式完成(我不记得了,它们是否适用于 3.1,但它们肯定适用于 3.2):
-target选项,例如clang -target arm-none-linux-gnueabillvm链接器链接主机,它只是目标之一,它不会链接到列表中的每个目标.它肯定会为任何目标编译.基本上clang从C/C++转到字节码,然后llc接受字节码并为特定目标进行汇编(新的实验选项将字节码直接转换为目标文件)然后你需要得到一个交叉汇编器和一个交叉链接器来接受它最后一英里(我使用gnu binutils).不幸的是,我发现clang到字节码并不是完全通用的(我曾希望并期望它会),它实际上确实改变了基于目标的目标独立输出.以下示例使用host triple而不是using -march允许我的示例在更多主机上正确构建.
ARMGNU?=arm-none-eabi
LOPS = -Wall -m32 -emit-llvm -ccc-host-triple $(ARMGNU)
OOPS = -std-compile-opts
LLCOPS = -march=thumb -mtriple=$(ARMGNU)
clang $(LOPS) -c blinker03.c -o blinker03.clang.bc
opt $(OOPS) blinker03.clang.bc -o blinker03.clang.thumb.opt.bc
llc $(LLCOPS) blinker03.clang.thumb.opt.bc -o blinker03.clang.thumb.opt.s
$(ARMGNU)-as blinker03.clang.thumb.opt.s -o blinker03.clang.thumb.opt.o
$(ARMGNU)-ld -o blinker03.clang.thumb.opt.elf -T memmap vectors.o blinker03.clang.thumb.opt.o
Run Code Online (Sandbox Code Playgroud)
我没有,但不久之后将尝试直接使用这个对象(实际上我在一个简单的测试中尝试过,但没有在更大的任何东西上使用它或在任何地方发布它).
要获取clang编译器的选项列表,请使用
铛-cc1-帮助
要指定目标,请使用 -triple
clang -cc1 -triple“ arm-vendor-os”文件名
其中“ vendor”和“ os”应替换为实际的vendor和os名称。也可以用代替unknown。triple是形式为ARCHITECTURE-VENDOR-OS或的字符串ARCHITECTRUE-VENDOR-OS-ENVIRONMENT,例如:x86_64-apple-darwin10