10

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

4

6 回答 6

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
于 2012-12-19T17:26:38.073 回答
7

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

铿锵声 -cc1 -help

要指定目标,请使用-triple

clang -cc1 -triple "arm-vendor-os" 文件名

其中“供应商”和“操作系统”应替换为实际的供应商和操作系统名称。它也可以替换为unknown.

-triple是一个形式为ARCHITECTURE-VENDOR-OSor的字符串ARCHITECTURE-VENDOR-OS-ENVIRONMENT。例如:x86_64-apple-darwin10

于 2012-12-19T02:29:53.353 回答
6

主机的 llvm 链接器链接,它只是目标之一,它不会链接到列表中的每个目标。它肯定会为任何目标编译。基本上clang从C / C ++到字节码,然后llc获取字节码并为特定目标进行组装(新的实验选项将字节码直接获取到目标文件)然后你需要一个交叉汇编器和一个交叉链接器来获取它最后一英里(我使用 gnu binutils)。不幸的是,我发现 clang 到字节码并不完全通用(我曾希望并期望它会如此),它实际上确实根据目标改变了与目标无关的输出。下面使用主机三元组而不是使用 -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

我没有,但不久将尝试直接使用 llc 来反对(实际上我在一个简单的测试中尝试过它,但没有在任何更大的东西上使用它或将它张贴在任何地方)。

于 2012-12-19T02:15:18.313 回答
2

你混淆了你的旗帜。clang-march=想要一个处理器系列。您可能打算clang -arch arm改用。

于 2012-12-19T01:51:49.733 回答
2

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

于 2012-12-22T06:41:22.900 回答
0

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

尝试选择特定的子架构。

于 2013-09-29T09:40:41.580 回答