LLVM & amp; 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?

7

Решение

линкер llvm связывает хост, который является только одной из целей, он не будет ссылаться на каждую цель в списке. он определенно скомпилируется для любой цели. По сути, clang переходит из C / C ++ в байт-код, затем llc берет байт-код и выполняет сборку для конкретной цели (новая экспериментальная опция для переноса байт-кода прямо в объектный файл), затем вам нужно получить кросс-ассемблер и кросс-линкер, чтобы получить его Последняя миля (я использую GNU binutils). К сожалению, я обнаружил, что clang to bytecode не является полностью универсальным (я надеялся и ожидал, что так и будет), он фактически изменяет целевой независимый вывод в зависимости от цели. Приведенный ниже пример использования тройки хостов вместо использования -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 прямо к объекту (на самом деле я попробовал это на простом тесте, но не использовал его ни на чем более крупном и нигде не публиковал).

5

Другие решения

Чтобы получить список опций компилятора clang, используйте

clang -cc1 -help

Чтобы указать цель, используйте -triple

clang -cc1-тройное имя файла «arm-vendor-os»

где «vendor» и «os» должны быть заменены фактическим vendor и названием os. Его также можно заменить на unknown, triple это строка в форме ARCHITECTURE-VENDOR-OS или же ARCHITECTRUE-VENDOR-OS-ENVIRONMENT, например: x86_64-apple-darwin10

4

-march — это опция командной строки LLVM для внутренних инструментов, которая вообще не связана с clang. Если вам нужно скомпилировать для другой цели, вам нужно указать целевой триплет. Это может быть сделано несколькими способами (я не помню наизусть, работают ли они с 3.1, но они определенно работают с 3.2):

  • Сделайте ссылку из clang на your-target-triple-clang, например, в
    arm-none-linux-gnueabi-clang и скомпилируйте все через него
  • Предоставлять -target вариант, например clang -target arm-none-linux-gnueabi
4

Ты путаешь свои флаги. лязг-х -march= хочет семейство процессоров. Вы, вероятно, хотели использовать clang -arch arm вместо.

1

Как этот комментарий говорит, что эта опция пока не поддерживается в Linux.

1

«-arch arm» эквивалентно «-arch armv4t» в clang. Я полагаю, что общая цель «arm» недопустима с «-march =», для чего нужно что-то более точное, например, «armv6», «thumbv7», «armv4t», …

Попробуйте выбрать определенный подархив.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector