Llvm ir обратно к человеко-читаемому исходному языку?

Есть ли простой способ перехода от llvm ir к исходному исходному коду?

В частности, я хотел бы начать с простого кода на С++, который просто модифицирует POD (в основном массивы int, floats и т.д.), конвертирует его в llvm ir, выполняет простой анализ и перевод на нем, а затем преобразует его обратно в код С++?

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

Ответ 1

Здесь есть проблема... возможно, было бы невозможно легко представить IR обратно в язык.

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

Проблема в том, что IR не касается семантики высокого уровня и без нее...

Я бы посоветовал вам научиться читать ИК. Я могу немного почитать это без особых усилий, и я далек от того, чтобы быть экспертом llvm.

В противном случае вы можете использовать код C из IR. Он не будет более похожим на ваш код на С++, но вы, возможно, почувствуете себя лучше без узлов ssa и phi.

Ответ 2

На самом деле существует множество вариантов. 2, которые вам, вероятно, будут интересны, это -march=c и -march=cpp, которые являются параметрами для llc.

Run:

llc -march=c -o code.c code.ll

Это преобразует бит-код LLVM в code.ll обратно в C и поместит его в code.c.

также:

llc -march=cpp -o code.cpp code.ll

Это отличается от механизма вывода C. На самом деле он выпишет код С++, который можно запустить для восстановления IR. Я использую эту личную информацию для встраивания LLVM IR в программу без необходимости разбирать файлы биткода или что-то еще.

-march=cpp имеет больше опций, которые вы можете увидеть с помощью llc --help, например -cppgen=, который контролирует, какая часть IR восстанавливается на выходе С++.

Ответ 3

CppBackend удален. У нас нет параметров -march = cpp и -march = c с 2016-05-05, r268631.