In primo luogo, per correggere un evidente fraintendimento: LLVM è un framework per la manipolazione del codice in formato IR. Non ci sono AST in vista (*): si legge IR, si trasforma/manipola/si analizza e si scrive di nuovo IR.
lettura IR è davvero semplice:
int main(int argc, char** argv)
{
if (argc < 2) {
errs() << "Expected an argument - IR file name\n";
exit(1);
}
LLVMContext &Context = getGlobalContext();
SMDiagnostic Err;
Module *Mod = ParseIRFile(argv[1], Err, Context);
if (!Mod) {
Err.print(argv[0], errs());
return 1;
}
[...]
}
Questo codice accetta un nome di file. Questo dovrebbe essere un file IR LLVM (testuale). Passa quindi ad analizzarlo in un Module
, che rappresenta un modulo di IR nel formato interno di memoria di LLVM. Questo può quindi essere manipolato con i vari pass LLVM o aggiunti da soli. Dai un'occhiata ad alcuni esempi nella base di codice LLVM (come lib/Transforms/Hello/Hello.cpp
) e leggi questo - http://llvm.org/docs/WritingAnLLVMPass.html.
L'emissione di IR in un file è ancora più semplice. La classe Module
appena si scrive ad un flusso:
some_stream << *Mod;
Questo è tutto.
Ora, se avete specifici domande su specifiche modifiche che si desidera fare per codice IR, si dovrebbe davvero chiedere qualcosa di più mirato. Spero che questa risposta ti mostri come analizzare IR e scriverlo di nuovo.
(*) IR non ha una rappresentazione AST all'interno LLVM, perché è un semplice linguaggio assembly-like. Se vai avanti di un passo, in C o C++, puoi usare Clang per analizzarlo in AST e poi fare manipolazioni a livello AST. Clang quindi sa come produrre LLVM IR dal suo AST. Tuttavia, devi iniziare con C/C++ qui, e non con LLVM IR. Se LLVM IR è tutto ciò che ti interessa, dimentica gli AST.
fonte
2012-02-07 06:11:15
Grazie Eli. La tua risposta è stata molto utile. – MetallicPriest
Heads up, penso che dovrebbe essere "parseIRFile" con una p minuscola. http://llvm.org/docs/doxygen/html/IRReader_2IRReader_8h_source.html – user2027722
@ user2027722: sì, le API LLVM cambiano così spesso che è difficile mantenere aggiornati i campioni. Ho un repository Github per questo: https://github.com/eliben/llvm-clang-samples che mantengo il più sincronizzato possibile, ed è più una fonte di verità che un SO casuale risponde all'errore –