Как заменить 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 как обычно.


В общем я нашел, что

llvm-ld x.bc y.bc

можно заменить на

llc x.bc
llc y.bc
clang x.s y.s