Como substituir llvm-ld com clang?
Resumo: llvm-ld
foi removido doLançamento do LLVM 3.2. Eu estou tentando descobrir como usar o clang em seu lugar no meu sistema de compilação.
Note que eu descobri a resposta para a minha própria pergunta enquanto escrevo, mas ainda estou postando no caso de ser útil para qualquer outra pessoa. Respostas alternativas também são bem vindas.
Detalhes:
Eu tenho um processo de compilação que primeiro gera bitcode usandoclang++ -emit-llvm
. Então eu pego os arquivos bitcode e os vinculo comllvm-link
. Então eu aplico alguns passes de otimização padrão comopt
. Então eu aplico outro passo de compilador personalizado comopt
. Então eu aplico a otimização padrão passa novamente usandoopt
uma terceira vez. Finalmente eu tomo a saída da última corrida deopt
E usellvm-link
para vincular com bibliotecas apropriadas para gerar meu executável. Quando tentei substituirllvm-link
comclang++
Nesse processo, recebo a mensagem de erro:file not recognized: File format not recognized
Para tornar essa questão mais concreta, criei um exemplo simplificado do que estou tentando fazer. Primeiro, existem dois arquivos que eu quero compilar e vincular
test1.cpp:
#include <stdio.h>
int getNum();
int main()
{
int value = getNum();
printf("value is %d\n", value);
return 0;
}
test2.cpp
int getNum()
{
return 5;
}
Eu executei a seguinte sequência de comandos:
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
(Note que atualmente eu estou executando o llvm 3.1, mas estou tentando descobrir as etapas que funcionarão para o llvm 3.2. Eu suponho que eu deveria ser capaz de fazer a versão do LLVM 3.1 funcionar corretamente usando clang ao invés de llvm-ld)
Então, se eu correr:
llvm-ld test.bc2 -o a.out -native
está tudo bem ea.out
imprime 5.
No entanto, se eu correr:
clang++ test.bc2 -o a.out
Então eu recebo a mensagem de erro:
test.bc2: file not recognized: File format not recognized clang-3:
error: linker command failed with exit code 1 (use -v to see invocation)
Obviamente, sei que posso produzir um arquivo executável executando clang diretamente nos arquivos .cpp. Mas eu estou querendo saber qual é a melhor maneira de integrarclang
comopt
é.