Как я могу сделать LLVM IR функции доступной для моей программы?

Я работаю над библиотекой, которая хотела бы, чтобы некоторые функции самоанализа были доступны. Допустим, я компилирую с помощью clang, поэтому у меня есть доступ к libtooling или что-то еще.

Что мне особенно хотелось бы, чтобы кто-то мог просматривать LLVM IR уже скомпилированной функции как часть программы. Я знаю, что при компиляции я могу использовать -emit-llvm для получения IR. Но это сохраняет его в файл. Я хотел бы, чтобы LLVM IR был встроен и извлечен из самой программы — например, my_function_object.llvm_ir ()

Это возможно? Спасибо!

1

Решение

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

Чтобы добиться такого эффекта, вы можете создать в своей программе глобальный словарь значений ключей, который будет открыт через экспортированную функцию — что-то вроде IRInstruction* retrieve_llvm_ir_stream(char* name),

Этот словарь будет отображать некоторый вид идентификатора (например, экспортированное имя) данной функции в массив в памяти, который представляет поток IR этой функции (каждая инструкция представлена ​​как пользовательская). IRInstruction структура, например). Типы и функции формата представления (например, пользовательские IRInstruction struct) должны быть включены в ваш источник.

На этапе генерации IR этот словарь будет пустым. Сразу после шага генерации IR вам нужно добавить пользовательский шаг сборки: открыть файл IR и заполнить словарь данными — для каждой экспортируемой функции вашей программы введите его имя в качестве ключа к словарю и его IR поток как значение. Поток IR будет генерироваться из определений ваших функций, как считывается вашим пользовательским инструментом сборки (который будет использовать API LLVM для чтения сгенерированного IR и преобразования его в ваш формат).

Затем перейдите к ассемблеру и компоновщику, как и раньше.

2

Другие решения


По вопросам рекламы [email protected]