2012-12-18 6 views
5

Ora uso clang build il mio file .c nel file .s. E ho usato l'API llvm per modificare l'IR. Tuttavia, ora non posso salvare il mio IR modificato in un file. Voglio usare "LLVMWriteBitcodeToFile", ma non riesco a trovare la struttura di "LLVMOpaqueModule"; Voglio usare "WriteBitcodeToFile", mi mostra sempre "type mismatch". E voglio anche sapere come costruire un file IR in un file eseguibile.Come salvare IR in un file e crearlo in un file eseguibile?

successivo sono due metodi che uso per salvare un modulo:

1, Primo utilizzo WriteBitcodeToFile

bool unbuffered = false; 
llvm::raw_ostream ro(unbuffered); 
WriteBitcodeToFile(m, ro); 

2, secondo uso LLVMWriteBitcodeToFile

const char *Path = "hello2.s"; 
int ans = LLVMWriteBitcodeToFile(m, Path); 

nota: m è un punto di Istanza di modulo

+0

La funzione corretta da utilizzare è effettivamente 'WriteBitcodeToFile' da' Bitcode/ReaderWriter.h'. Se non riesci a usarlo, dovresti fornire il codice che stai cercando di compilare in questa domanda. – Oak

+0

Sì, Follow è il prototipo di WriteBitcodeToFilevoid: WriteBitcodeToFile (const Module * M, raw_ostream &Out); –

+0

Sì, Follow è il prototipo di WriteBitcodeToFilevoid: WriteBitcodeToFile (const Module * M, raw_ostream &Out); quando avvio un raw_stream, non posso permettermi un .. tipo di corrispondenza parametro che ha un parametro di default –

risposta

3
  1. Per salvare l'IR in un file, vedere la risposta a questa domanda: writing module to .bc bitcode file
  2. Per la compilazione di IR in un file oggetto, esaminare lo strumento llc e seguire la funzione di main.
+0

Grazie, Ma quando inizio un'istanza di raw_ostream che è un parametro di WriteBitcodeToFile, posso ' t farlo. Nessuno richiama alcun parametro, né digita la mancata corrispondenza. –

+0

E un altro ricordo che l'implementazione di un assembly IR è appena possibile, possiamo solo allocare la piattaforma. –

+0

Avanti sono due metodi che uso per salvare un modulo: bool unbuffered = false; llvm :: raw_ostream ro (senza buffer); WriteBitcodeToFile (m, ro); \t \t const char * Path = "hello2.s"; int ans = LLVMWriteBitcodeToFile (m, Path); –

0

Partenza queste funzioni in llvm-c/TargetMachine.h:

/** Emits an asm or object file for the given module to the filename. This 
    wraps several c++ only classes (among them a file stream). Returns any 
    error in ErrorMessage. Use LLVMDisposeMessage to dispose the message. */ 
LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M, 
    char *Filename, LLVMCodeGenFileType codegen, char **ErrorMessage); 

/** Compile the LLVM IR stored in \p M and store the result in \p OutMemBuf. */ 
LLVMBool LLVMTargetMachineEmitToMemoryBuffer(LLVMTargetMachineRef T, LLVMModuleRef M, 
    LLVMCodeGenFileType codegen, char** ErrorMessage, LLVMMemoryBufferRef *OutMemBuf); 

Vedi anche How to generate machine code with llvm

1

per la scrittura LLVM codice binario che di presentare quello che faccio è:

std::error_code EC; 
llvm::raw_fd_ostream OS("module", EC, llvm::sys::fs::F_None); 
WriteBitcodeToFile(pBiFModule, OS); 
OS.flush(); 

e poi smontare utilizzando LLVM -dis.