2013-05-09 18 views
5

A partire da un modulo LLVM *Mod contenente alcuni IR: Come utilizzare un back-end specifico per generare da esso un assemblatore specifico per target? Sfortunatamente il tutorial di Kaleidoscope non fornisce dettagli su questo. Usa il motore di esecuzione solo per compilare il programma JIT (sulla build, l'architettura di destinazione), ma in realtà non seleziona uno specifico back-end per generare un assemblatore specifico per target. Nemmeno le esercitazioni di LLVM, dato che non descrivono dettagliatamente la costruzione di un compilatore statico, suppongo. Quindi, questa domanda può fornire questa informazione mancante.Generazione di codice statico utilizzando l'API LLVM

Dal momento che vogliamo creare un compilatore statico, non vogliamo utilizzare gli strumenti da riga di comando come llc, ecc. Per completare il lavoro. Vogliamo utilizzare l'API LLVM.

Per rendere più concreto questo, cominciamo con questo codice:

LLVMContext &Context = getGlobalContext(); 
SMDiagnostic Err; 
Module *Mod = ParseIRFile(argv[1], Err, Context); 

Il nome del file (proposta dal 1 ° argomento) è stato analizzato correttamente a IR. Ora saltiamo i passaggi di ottimizzazione e creiamo un assemblatore con uno specifico back-end, ad es. il back-end PTX (disponibile dalla versione 3.2).

risposta

8

Basta cercare nel codice sorgente di tools/llc/llc.cpp. Fa tutto questo, ed è piuttosto breve e non difficile da capire. Se hai domande specifiche su alcune cose che non capisci, sentiti libero di chiedere.

+0

Okay, ci ho pensato anch'io, ma ho mangiato perché ho appena iniziato con LLVM. Comunque la tua risposta sembra incoraggiante. Post scriptum Mi è piaciuta la vita di una istruzione! – ritter

+0

Conoscendo l'architettura di destinazione (ad esempio nvptx64), è necessario utilizzare la classe Triple per creare l'architettura di destinazione? – ritter

+1

@Frank: questo è un modo semplice per farlo. llc lo fa in 'compileModule', chiamando' setTargetTrople' sul modulo –