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

проблема

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?

1 ответ

Решение

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

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

Другие вопросы по тегам