LLVM & Clang can't compile for a supported arch

后端 未结 6 1174
花落未央
花落未央 2020-12-30 10:07

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).
  Defa         


        
相关标签:
6条回答
  • 2020-12-30 10:48

    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

    0 讨论(0)
  • 2020-12-30 10:54

    -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
    0 讨论(0)
  • 2020-12-30 10:57

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

    0 讨论(0)
  • 2020-12-30 10:59

    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).

    0 讨论(0)
  • 2020-12-30 11:04

    "-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.

    0 讨论(0)
  • 2020-12-30 11:09

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

    0 讨论(0)
提交回复
热议问题