LLVM& Clang无法编译支持的arch

时间:2012-12-19 01:35:56

标签: 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

我不能这样做

clang -march=arm -x c++ /tmp/cpp.cpp 
error: unknown target CPU 'arm'

我在这里遗漏了什么?为什么我无法为ARM编译?

6 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:4)

使用

获取clang编译器的选项列表
  

clang -cc1 -help

要指定目标,请使用-triple

  

clang -cc1 -triple“arm-vendor-os”filename

其中“vendor”和“os”应替换为实际的供应商和操作系统名称。它也可以替换为unknowntripleARCHITECTURE-VENDOR-OSARCHITECTRUE-VENDOR-OS-ENVIRONMENT形式的字符串,例如:x86_64-apple-darwin10

答案 2 :(得分:4)

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

  • 建立从clang到你的目标三重铿锵的链接,例如:至 arm-none-linux-gnueabi-clang并通过它编译所有内容
  • 提供-target选项,例如clang -target arm-none-linux-gnueabi

答案 3 :(得分:1)

你正困惑你的旗帜。 clang的-march=想要一个处理器系列。您可能打算使用clang -arch arm代替。

答案 4 :(得分:1)

由于this comment说这个选项,目前在linux下还不支持。

答案 5 :(得分:0)

“ - arch arm”相当于clang中的“-arch armv4t”。我认为“-march =”不允许使用通用的“arm”目标,这应该需要更精确的东西,例如“armv6”,“thumbv7”,“armv4t”,......

尝试选择特定的子搜索。