2016-08-16 2 views
2

Когда я пытаюсь построить бэкенд LLVM без определения RegisterClass экземпляров в TableGen файл, он выдает следующее сообщение об ошибке:Как написать LLVM-бэкэнд для стековой машины?

error:No 'RegisterClass' subclasses defined 

Как определить цель стеки машины для LLVM (т.е. не используют регистры)?

+0

[родственный вопрос] (http://stackoverflow.com/questions/6203323/llvm-backend-for-stack-based-machine) – KolesnichenkoDS

ответ

2

Только не делайте этого. LLVM DAG разработан специально для регистрационных машин и имеет небольшое значение для компиляции машинного оборудования. Вместо этого вам понадобится пользовательский бэкэнд.

Один из подходов, я использовал для аналогичной задачи (LLVM IR -> стек мягкое ядро ​​на ПЛИС) имеет следующий вид:

1) Из SSA (reg2mem)

2) Создание промежуточного дерева представление (т. е. сквот все одноразовые назначения регистров в деревья, если позволяет порядок). Это основное узкое место оптимизации, чем меньше у вас увольняются задания, тем лучше.

3) «Регистрировать распределение» для остальных регистров, которые все теперь представлены как распределенные по стеклу переменные (надеюсь, что ваш стековый компьютер ISA позволяет это).

4) Перевести дерево напрямую, без какого-либо выбора команды (вы можете сделать это на уровне LLVM IR вместо встроенного и настраиваемого прохода instcombine).

РЕДАКТИРОВАТЬ: Это нелегко сделать с помощью базы данных на основе DAG, поэтому ее никогда не использовали таким образом.

Ближайшая вещь, о которой я могу думать, заключается в том, чтобы использовать сервер DAG для генерации кода промежуточной регистрационной машины, а затем использовать проход для последующей обработки, чтобы, если это было возможно, повторно заказывать инструкции и вводить альтернативные переменные, принадлежащие стеку, в противном случае. I.e., представляют каждую из инструкций машины стека как псевдо-инструкцию с 1 или 2 аргументами регистра и 1 результат регистрации.

+0

Спасибо за ваш ответ, но моя цель - выяснить, возможно ли это без запись пользовательских бэкэнд. Поэтому, если вы знаете ** какой-либо ** способ сделать это, напишите обновление своего ответа, пожалуйста. – KolesnichenkoDS

+0

Я все еще изучаю LLVM, и мне непонятно, почему DAG плохо для машины на основе стека. Документы говорят, что SelectionDAG выглядит так: '(fadd: f32 (fmul: f32 (fadd: f32 W, X), Y), Z)' - точно так же, как lisp;) Таким образом, нетрудно перевести это в стек основанный на машинах код. – KolesnichenkoDS

+0

И, например, X86 ** ** основан на стеке, потому что, насколько я понимаю, если число аргументов больше числа регистров, аргументы передаются в стек. Итак, если мое понимание правильное, я должен просто избегать передачи аргументов в регистры и передавать непосредственно в стек. Теперь я создал один реестр, который я не использую, и бэкэнд не работает (потому что он еще не завершен), но я не вижу большой проблемы. – KolesnichenkoDS

Смежные вопросы