ООО: неподдерживаемое перемещение по символу
проблема
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
от него!
Вопросы
Почему это происходит??!!
Зачем
opt
имеет-relocation-model
вариант? Разве это не должно быть простоllc
вещь? Я пытался установить это как вopt
а такжеllc
вpic
, но все равно не удается.я использую
clang
потому что он имеет обертку для компоновщика, чтобы получить.so
, Есть ли способ сделать этот шаг с помощью инструмента LLVM?
1 ответ
Прежде всего, не используйте ни ООО, ни ОПТ. Это инструменты на стороне разработчика, которые никогда не должны использоваться ни в одной производственной среде. Вместо этого реализуйте свою собственную надлежащую среду оптимизации и генерации кода с помощью библиотек LLVM.
Что касается этой конкретной ошибки - генератор кода большого пальца может содержать некоторые ошибки. Пожалуйста, уменьшите проблему и сообщите о ней. Или вообще не используйте режим Thumb:)