контекст
Я пишу компилятор для языка, который требует много функций времени исполнения. Я использую LLVM в качестве моего бэкэнд, поэтому для codegen нужны типы для всех этих типов времени выполнения (функции, структуры и т.д.), И вместо того, чтобы определять все из них вручную с помощью API LLVM или почерка LLVM IR, я бы хотел написать заголовки в C и скомпилировать бит-код, который компилятор может использовать с LLVMParseBitcodeInContext2
.
вопрос
Проблема, с которой я сталкиваюсь, заключается в том, что clang, похоже, не содержит никаких объявлений типов, которые не используются никакими определениями функций. У Clang есть -femit-all-decls
который звучит так, как будто он должен его решить, но, к сожалению, это не так, и Googling предлагает это неправильно, поскольку это затрагивает только неиспользуемые определения, а не декларации.
Затем я подумал, что, если я скомпилирую заголовки только в .gch
файлы, я мог бы .gch
их с помощью LLVMParseBitcodeInContext2
одинаково (поскольку документы говорят, что они используют "тот же" формат битового кода ", однако это делает ошибки с error: Invalid bitcode signature
поэтому что-то должно быть по-другому. Может быть, разница достаточно мала, чтобы обходиться?
Любые предложения или относительно легкие обходные пути, которые могут быть автоматизированы для сложной среды выполнения? Мне также было бы интересно, если у кого-то есть абсолютно альтернативное предложение о приближении к этому общему прецеденту, имея в виду, что я не хочу статически связывать тела тела выполнения для каждого отдельного файла объекта, который я генерирую, только типы. Я предполагаю, что это то, что нужно другим компиляторам, поэтому я не удивлюсь, если я подхожу к этому неправильно.
например, с учетом этого ввода:
runtime.h
struct Foo {
int a;
int b;
};
struct Foo * something_with_foo(struct Foo *foo);
Мне нужен биткодовый файл с этим эквивалентным IR
runtime.ll
; ...etc...
%struct.Foo = type { i32, i32 }
declare %struct.Foo* @something_with_foo(%struct.Foo*)
; ...etc...
Я мог бы написать все это вручную, но это было бы дублирующим, поскольку мне также нужно создавать заголовки C для другого взаимодействия, и было бы идеально, если бы не синхронизировать их вручную. Время выполнения довольно велико. Я думаю, что я мог бы также делать все наоборот: писать объявления в LLVM IR и генерировать заголовки C.
Кто-то еще спросил об этом годах назад, но предлагаемые решения довольно хаки и довольно непрактичны для среды выполнения такого размера и сложности: Clang - компиляция заголовка C для LLVM IR/bitcode