user1849534
user1849534

Reputation: 2407

LLVM & Clang can't compile for a supported arch

Under Ubuntu 64 bit I got

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

I can't do this

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

I'm missing something here ? Why I can't compile for ARM ?

Upvotes: 12

Views: 32972

Answers (7)

Syclone0044
Syclone0044

Reputation: 128

Starting Clang 11 (trunk), the list of supported target architectures could be handily printed using the newly added -print-targets flag.

Upvotes: 0

Lei Mou
Lei Mou

Reputation: 2592

To get a list of options of the clang compiler, use:

clang -cc1 -help

To specify the target, use -triple:

clang -cc1 -triple "arm-vendor-os" filename

where "vendor" and "os" should be replaced with the actual vendor and OS name. It can also be replaced with unknown.

-triple is a string of the form ARCHITECTURE-VENDOR-OS or ARCHITECTURE-VENDOR-OS-ENVIRONMENT. For example: x86_64-apple-darwin10

Upvotes: 7

old_timer
old_timer

Reputation: 71576

the llvm linker links for the host, which is only one of the targets, it wont link to every target in the list. it will definitely compile for any target. Basically clang goes from C/C++ to bytecode, then llc takes bytecode and makes assembly for the specific target (new experrimental option to take the bytecode straight to object file) then you need to get a cross assembler and a cross linker to take it the final mile (I use gnu binutils). Unfortunately I found that clang to bytecode is not completely generic (I had hoped and expected that it would be), it does in fact change the target independent output based on the target. The example below using the host triple instead of using -march allowed for my examples to build properly on more hosts.

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

I have not, but before long will experiment with using the llc straight to object (actually I tried it on a simple test but have not used it on anything larger or posted it anywhere).

Upvotes: 6

LeoTh3o
LeoTh3o

Reputation: 137

"-arch arm" is equivalent to "-arch armv4t" in clang. I suppose that a generic "arm" target is not allowed with "-march=", which should require something more precise, such as "armv6", "thumbv7", "armv4t", ...

Try selecting a specific subarch.

Upvotes: 0

user1849534
user1849534

Reputation: 2407

As this comment says this option it's not supported yet under linux, for now.

Upvotes: 2

Anton Korobeynikov
Anton Korobeynikov

Reputation: 9324

-march is LLVM's internal tools command line option and is not connected with clang at all. If you need to compile for other target you need to specify the target triplet. This can be done in several ways (I do not remember offhand, whether they work with 3.1, but they definitely work with 3.2):

  • Make a link from clang to your-target-triple-clang, e.g. to arm-none-linux-gnueabi-clang and compile everything via it
  • Provide -target option, e.g. clang -target arm-none-linux-gnueabi

Upvotes: 11

Lily Ballard
Lily Ballard

Reputation: 185811

You're confusing your flags. clang's -march= wants a processor family. You probably meant to use clang -arch arm instead.

Upvotes: 3

Related Questions