Eu quero que o clang compile meu C/C++
código em LLVM
bytecode, em vez de executável binário. Como posso conseguir isso? E se eu obtiver o LLVM
bytecode, como posso levá-lo para compilá-lo ainda mais no executável binário.
Basicamente, quero adicionar um pouco do meu próprio código ao LLVM
bytecode antes de compilar no executável binário.
Respostas:
Dado algum arquivo C / C ++
foo.c
:Produz
foo.ll
um arquivo IR LLVM.A
-emit-llvm
opção também pode ser passada diretamente para o front-end do compilador e não para o driver por meio de-cc1
:Produz
foo.ll
com o IR.-cc1
adiciona algumas opções legais como-ast-print
. Confira-cc1 --help
para mais detalhes.Para compilar o LLVM IR ainda mais na montagem, use a
llc
ferramenta:Produz
foo.s
com montagem (por padrão, na arquitetura da máquina em que você a executa).llc
é uma das ferramentas do LLVM - aqui está sua documentação .fonte
Usar
fonte
.o
deve se referir a arquivos de objetos binários, arquivos.s
de montagem e algo mais (por convenção.ll
) a arquivos IR do LLVM. Caso contrário, é fácil ficar confuso. O Clang / LLVM agora não possui vinculador próprio para objetos binários (embora um esteja em andamento). O vinculador LLVMllvm-ld
apenas junta vários arquivos de IR em um.bc
for usado; Além disso, mantenha em mente quellvm-ld
pode atuar como interface para o conjunto de ferramentas do sistema, ou seja, a minha resposta anterior usandollvm-ld -native
deve funcionar como esperado ....foo.bc
é um arquivo de código de bits LLVM #clang -emit-llvm -o test.bc -c test.c && file test.bc: test.bc: LLVM IR bitcode
.Se você possui vários arquivos de origem, provavelmente deseja usar a otimização do tempo do link para gerar um arquivo de código de bits para todo o programa. As outras respostas fornecidas farão com que você termine com um arquivo de código de bit para cada arquivo de origem.
Em vez disso, você deseja compilar com a otimização do tempo do link
e para a etapa final de vinculação, inclua o argumento -Wl, -plugin-opt = also-emit-llvm
Isto dá-lhe tanto um programa compilado eo bitcode correspondente a ele (program.bc). Você pode modificar o program.bc da maneira que desejar e recompilar o programa modificado a qualquer momento, executando
embora esteja ciente de que você precisa incluir todos os sinalizadores de vinculador necessários (para bibliotecas externas, etc.) nesta etapa novamente.
Observe que você precisa usar o vinculador dourado para que isso funcione. Se você deseja forçar o clang a usar um vinculador específico, crie um link simbólico para esse vinculador chamado "ld" em um diretório especial chamado "fakebin" em algum lugar do seu computador e adicione a opção
a todas as etapas de vinculação acima.
fonte
Se você possui vários arquivos e não deseja digitar cada arquivo, recomendo que você siga estas etapas simples (estou usando,
clang-3.8
mas você pode usar qualquer outra versão):gerar todos os
.ll
arquivosligá-los em um único
(Opcional) Otimize seu código (talvez alguma análise de alias)
Gerar montagem (gera um
optimised.s
arquivo)Criar executável (nomeado
a.out
)fonte
-S
opção (na etapa 2), especifiquei que gostaria de produzir a saída no LLVM IR. Basicamente, coloque todos os arquivos * .ll em um único. Faço isso para verificar se as otimizações realmente alteram o código, ou seja,single.ll
eoptimised.ll
agora devem parecer diferentes (em termos de código) e você também pode mostrar o relatório para ver se há alguma diferença.-basicaaa
é uma bandeira errada,-basicaa
deve ser usada.Você leu a
clang
documentação ? Você provavelmente está procurando-emit-llvm
.fonte