LLVM和Clang无法编译支持的arch

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编译?

Ant*_*kov 9

-march 是 LLVM 的内部工具命令行选项,根本与 clang 无关。如果需要为其他目标编译,则需要指定目标三元组。这可以通过多种方式完成(我不记得了,它们是否适用于 3.1,但它们肯定适用于 3.2):

  • 建立从 clang 到 your-target-triple-clang 的链接,例如到 arm-none-linux-gnueabi-clang 并通过它编译所有内容
  • 提供-target选项,例如clang -target arm-none-linux-gnueabi


old*_*mer 5

llvm链接器链接主机,它只是目标之一,它不会链接到列表中的每个目标.它肯定会为任何目标编译.基本上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)

我没有,但不久之后将尝试直接使用这个对象(实际上我在一个简单的测试中尝试过,但没有在更大的任何东西上使用它或在任何地方发布它).


Lei*_*Mou 5

要获取clang编译器的选项列表,请使用

铛-cc1-帮助

要指定目标,请使用 -triple

clang -cc1 -triple“ arm-vendor-os”文件名

其中“ vendor”和“ os”应替换为实际的vendor和os名称。也可以用代替unknowntriple是形式为ARCHITECTURE-VENDOR-OS或的字符串ARCHITECTRUE-VENDOR-OS-ENVIRONMENT,例如:x86_64-apple-darwin10


use*_*534 2

如此评论所说,目前 Linux 下尚不支持此选项。