2014-09-05 5 views
3

Я хотел бы взять строковое представление функции C++ лямбда, как это:C++ для LLVM IR

string fun = "[](int x) { return x + 5;}"; 
string llvm_ir = clang.get_llvm_ir(fun); // does something like this exist? 

и преобразовать его в LLVM IR с использованием Clang изнутри C++. Есть ли способ сделать это напрямую, используя внутренний API Clang?

ответ

4

Насколько я знаю, для этого не существует стабильного, официально поддерживаемого API. Clang C API предоставляет информацию уровня интерфейса (уровень исходного кода). Это также делает инструментарий Clang.

У вас есть хорошие варианты. Самый простой способ - просто вызвать интерфейс Clang в качестве подпроцесса clang -cc1 -emit-llvm ...<other options>. Это приведет к созданию IR-файла LLVM, который вы затем можете прочитать. На практике это довольно распространенная практика в компиляторах - сам драйвер Clang делает это - он вызывает интерфейс и множество других инструментов (таких как компоновщик) в зависимости от конкретной задачи компиляции.

В качестве альтернативы, если вы считаете, что для этого у вас должен быть программный API, вы можете выкопать код интерфейсного Clang (вызов -cc1, упомянутый выше), чтобы узнать, как он его выполняет, и собрать биты и куски код. Будьте готовы написать огромное количество лесов, потому что эти API не предназначены для использования снаружи.

Чтобы повторить, это - возможно использование внутренних API-интерфейсов, но по этому пути нет простого или рекомендуемого способа.

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