Как заменить llvm-ld на clang?
резюме: llvm-ld
был удален из LLVM 3.2 release. Я пытаюсь понять, как использовать clang на своем месте в моей системе сборки.
обратите внимание, что я выяснил ответ на свой вопрос во время его написания, но я все еще публикую его в случае, если он полезен кому-либо еще. Также приветствуются альтернативные ответы.
подробности:
у меня есть процесс сборки, который сначала генерирует биткод с помощью clang++ -emit-llvm
. Затем я беру файлы bitcode и связываю их вместе с llvm-link
. Затем я применяю некоторые стандартные проходы оптимизации с opt
. Затем я применяю другой пользовательский проход компилятора с opt
. Затем я снова применяю стандартные проходы оптимизации, используя opt
в третий раз. Наконец, я беру вывод из последнего запуска opt
и использовать llvm-link
для связи с соответствующими библиотеками для создания моего исполняемого файла. Когда я попытался заменить llvm-link
С clang++
в этом процесс я получаю сообщение об ошибке: file not recognized: File format not recognized
test1.cpp:
#include <stdio.h>
int getNum();
int main()
{
int value = getNum();
printf("value is %dn", value);
return 0;
}
условие_2.cpp
int getNum()
{
return 5;
}
я выполнил следующую последовательность команд:
clang++ -emit-llvm -c test1.cpp test2.cpp
llvm-link -o test.bc1 test1.o test2.o
opt test.bc1 -o test.bc2 -std-compile-opts
(обратите внимание, что в настоящее время я запускаю llvm 3.1, но я попытка выяснить шаги, которые будут работать для llvm 3.2. Я предполагаю, что я должен быть в состоянии заставить версию LLVM 3.1 работать правильно, используя clang вместо llvm-ld)
тогда, если я запускаю:
llvm-ld test.bc2 -o a.out -native
все в порядке и a.out
выводит 5.
однако, если я бегу:
clang++ test.bc2 -o a.out
затем я получаю сообщение об ошибке:
test.bc2: file not recognized: File format not recognized clang-3:
error: linker command failed with exit code 1 (use -v to see invocation)
очевидно, я знаю, что могу создать исполняемый файл, запустив clang непосредственно на этот.cpp-файлы. Но мне интересно, какой лучший способ интеграции clang
С opt
есть.
2 ответов
тестовый пример, описанный в вопросе, может быть скомпилирован с помощью следующих шагов:
clang++ -emit-llvm -c test1.cpp test2.cpp
llvm-link -o test.bc1 test1.o test2.o
opt test.bc1 -o test.bc2 -std-compile-opts
llc -filetype=obj test.bc2 -o test.o
clang++ test.o
это производит работы .
кажется,llc
необходимо преобразовать из bitcode в машинный код, который затем может быть обработан clang
как обычно.