llc: неподдерживаемое перемещение по символу

Проблема

llc выдает следующую ошибку:

ОШИБКА LLVM: неподдерживаемое перемещение символа

Подробный процесс компиляции

Я реализую интерфейс LLVM для IR среднего уровня (MIR) компилятора, и после того, как я конвертирую различные методы во множество файлов биткода, я связываю их (llvm-link), оптимизирую их (opt), конвертирую их в машинный код (llc ), сделать их разделяемой библиотекой (clang для оболочки компоновщика) и динамически загружать их. Шаг llc не выполняется для некоторых методов, которые я компилирую!

Шаг 1: llvm-link: объединить много файлов битового кода

У меня может быть много функций, вызывающих друг друга, поэтому я llvm-link использую разные файлы битового кода, которые могут взаимодействовать друг с другом. Этот шаг не имеет проблем. Пример:

llvm-link function1.bc function2.bc -o lnk.bc

Шаг 2: opt: Запустите этапы оптимизации

На данный момент я использую следующее:

opt -O3 lnk.bc -o opt.bc

Этот шаг выполняется без проблем, но именно он ПРИЧИНАЕТ проблему! Кроме того, это необходимо, потому что в будущем мне понадобится этот шаг для прохождения дополнительных проходов, например. loop-unroll

Шаг 3: llc: Генерация машинного кода (PIC)

Я использую следующую команду:

llc -march=thumb -arm-reserve-r9 -mcpu=cortex-a9 -filetype=obj -relocation-model pic opt.bc -o obj.o

Я сохранил флаги для конкретных арок, которые я установил, на случай, если они усугубят проблему. Я использую Position Independent Code, потому что на следующем этапе я буду создавать shared object. Эта команда завершается с ошибкой, которую я написал поверх этого ответа.

Шаг 4: clang: Создание общего объекта

Для случаев, когда Step 3 терпит неудачу, этот шаг не достигается. Если llc удастся, этот шаг тоже будет успешным!

Дополнительная информация

Конфигурация

Следующее выполняется на llvm3.6, который работает на устройстве arm.

Вещи, которые я заметил

  • Если я пропущу -O3 (или любой другой уровень) с шагом opt, тогда будет работать llc.
  • Если я этого не сделаю и вместо этого уберу их из llc, llc все равно не удастся. Это наводит меня на мысль, что opt -O<level> вызывает проблему.
  • Если я использую llc напрямую, это сработает, но я не смогу запускать определенные проходы, которые позволяет мне opt, так что это не вариант для меня.
  • Я столкнулся с этой проблемой ТОЛЬКО с двумя функциями, которые я скомпилировал до сих пор (из их исходного MIR), которые используют циклы. Остальные производят рабочий код!
  • Если я не использую модель pic в llc, она может сгенерировать obj.o, но тогда у меня будут проблемы с созданием из нее .so!

Вопросы

  1. Почему это происходит??!!

  2. Почему opt имеет вариант -relocation-model? Разве это не должно быть просто llc вещью? Я пытался установить это как на opt, так и на llc на pic, но все равно не получается.

  3. Я использую clang, потому что у него есть оболочка для компоновщика, чтобы получить .so. Есть ли способ сделать этот шаг с помощью инструмента LLVM?


person Paschalis    schedule 25.07.2017    source источник


Ответы (1)


Во-первых, не пользуйтесь ни ооо, ни опт. Это инструменты на стороне разработчика, которые никогда не следует использовать в производственной среде. Вместо этого реализуйте собственную правильную среду выполнения для оптимизации и генерации кода с помощью библиотек LLVM.

Что касается этой конкретной ошибки - генератор кода большого пальца может содержать некоторые ошибки. Пожалуйста, уменьшите проблему и сообщите о ней. Или вообще не используйте режим Thumb :)

person Anton Korobeynikov    schedule 25.07.2017