2016-01-16 3 views
2

с кодом, я могу генерировать битовый код файл LLVM из модуля:генерировать машинный код непосредственно через LLVM API

llvm::Module * module; 

// fill module with code 
module = ...; 

std::error_code ec; 
llvm::raw_fd_ostream out("anonymous.bc", ec, llvm::sys::fs::F_None); 

llvm::WriteBitcodeToFile(module, out); 

Затем я могу использовать этот файл битового кода для создания исполняемого машинного кода файла, например:

clang -o anonymous anonymous.bc 

В качестве альтернативы:

llc anonymous.bc 
gcc -o anonymous anonymous.s 

Теперь мой вопрос: могу ли я сгенерировать машинный код непосредственно на C++ с помощью LLVM API без необходимости писать файл битового кода?

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

+1

Я не понял. Вам нужен сценарий оболочки, который использует инструменты LLVM для генерации машинного кода без промежуточных файлов, или вы хотите сделать это через LLVM API? – arrowd

+0

Я признаю, формулировка вопроса была неоднозначной. Отредактировано для уточнения: я хочу сделать это через LLVM API. –

+0

Я голосую, чтобы закрыть этот вопрос как не относящийся к теме, потому что это не сайт-дай-код. Боюсь, что, хотя я могу ответить на ваш вопрос с легкостью, я, конечно, не буду. Сделайте свою работу. – Puppy

ответ

2

Посмотрите на llc tool source, spcifically compileModule() функция. Короче говоря, он создает Target, устанавливает для него некоторые опции через TargetOptions, затем использует его для addPassesToEmitFile() и, наконец, запрашивает PassManager для выполнения всех запланированных задач.

+0

Спасибо, это действительно помогло. Насколько я могу судить, таким образом я могу вывести собственный файл объекта «* .o» или «* .obj», но ссылки не связаны. Можно ли связать связь с LLVM напрямую, или это все еще работает? –

+0

Существует lld проект, который выполняет связывание и вполне применим в некоторых арках (OSX и Linux). Но недавно я увидел дискуссию по списку рассылки, касающуюся его архитектуры, не позволяющей использовать ее в качестве библиотеки. Было решено, что lld должен предоставить такой API, но я полагаю, что он все еще находится в процессе разработки, да. – arrowd

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