Проблема
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?