Как написать бэкэнд компилятора для генерации сборки для пользовательской архитектуры hw из кода C - PullRequest
4 голосов
/ 10 ноября 2011

Я работаю над проектом, в котором мне нужно определить новую аппаратную архитектуру процессора.Мне нужен компилятор для генерации ассемблерного кода для этой цели (у него есть собственный набор инструкций).

Программы для этого процессора будут написаны на C.

Моя идея сделать это - разобратькод C и сгенерировать абстрактное синтаксическое дерево (AST), затем из AST сгенерировать сборку.

Конечно, я хотел бы повторно использовать существующие компоненты (надеюсь, нет необходимости переписывать синтаксический анализатор C), но чтоинструменты или рамки можно использовать для выполнения этой задачи?

Спасибо.

Ответы [ 5 ]

6 голосов
/ 10 ноября 2011

Взгляните на LLVM .

Он состоит из отдельных модулей, которые можно создавать индивидуально и общаться на промежуточном языке. В вашем случае вам придется написать бэкэнд сборки и повторно использовать компилятор C других людей.

2 голосов
/ 10 ноября 2011

Я думаю, что набор инструментов GNU GCC 4.5.x превосходен, так как теперь он может иметь также плагины.Создайте foo.c и взгляните на сырые дампы дерева из gcc:

gcc -fdump-tree-original-raw ./foo.c

Склонное мнение

Я предпочитаю его LLVM для портирования, потому что он широко применяется и портирует.LLVM добавляет дополнительный уровень абстракции, который вам может не понадобиться для вашего проекта.Тем не менее, изучите и то, и другое: есть плюсы и минусы.

Более интересные вещи

http://dragonegg.llvm.org/

2 голосов
/ 10 ноября 2011

Вы должны посмотреть на LLVM (http://llvm.org).

Написание компилятора далеко не тривиально. Я бы не советовал делать это с нуля.

LLVM является модульным, и вам нужно будет только создать серверную часть сборки.

0 голосов
/ 10 ноября 2011

Clang + LLV - это один из вариантов.Кроме того, вы можете попробовать ретаргетинг lcc или Open64 .

lcc подходит для простых нестандартных архитектур с небольшой надеждой на правильную низкоуровневую оптимизацию.LLVM - лучший выбор для регистрационных машин (но он вызовет проблемы, если вам понадобится, скажем, сегментированная 16-битная память).Open64 предлагает примерно такой же уровень.

Перенацеливание gcc также является опцией, но это потребует гораздо больше мирского ручного труда, чем другие.

0 голосов
/ 10 ноября 2011

LLVM является одним из вариантов.Вы также можете написать gcc backend , но это будет намного сложнее, учитывая сложность GCC.

...