Я создаю пропуск уровня IR для LLVM, который снабжает функции вызовами моей библиотеки времени выполнения. До сих пор я использовал следующие строки, чтобы скомпилировать любой файл C с моим пропуском и связать его с библиотекой времени выполнения и гарантировать, что вызовы функций библиотеки времени выполнения являются встроенными.
Compiling source to IR...
clang -S -emit-llvm example.c -o example-codeIR.ll -I ../runtime
Running Pass with opt...
opt -load=../build/PSS/libPSSPass.so -PSSPass -overwrite -always-inline -S -o example-codeOpt.ll example-codeIR.ll
Linking IR with runtime library...
llvm-link -o example-linked.bc example-codeOpt.ll ../runtime/obj/PSSutils.ll
Compiling bitcode to binary...
clang -ldl -O3 -o example example-linked.bc ../initializer/so/shim.so
Теперь я хотел бы протестируйте мой проход с помощью тестового набора LLVM, и единственное, что я могу сделать, это передать флаги тестовому набору. Я не могу контролировать шаги компиляции и генерировать так много файлов для каждого теста.
Есть ли способ сделать то же самое, что и выше, без необходимости сохранять промежуточные файлы и при этом сохранять порядок шагов ?
Я попробовал следующее:
clang -ldl -Xclang -load -Xclang ../build/PSS/libPSSPass.so ../initializer/so/shim.so ../runtime/obj/PSSutils.ll $<
Но я столкнулся с проблемой, что не могу скомпилировать файлы IR и. c. Если я скомпилирую библиотеку времени выполнения в объектный файл, функции в ней больше не будут встроены, что является главной целью описанных выше шагов.