2012-12-16 11 views
5

ho presunto che il dumping di un file .bc da un modulo era un'operazione banale, ma ora, prima volta devo effettivamente farlo dal codice, per la vita di me i non riesce a trovare un passo mancante nel processo:scrittura del modulo nel file .bc bitcode

static void WriteModule (const Module * M, BitstreamWriter & Stream) 

http://llvm.org/docs/doxygen/html/BitcodeWriter_8cpp.html#a828cec7a8fed9d232556420efef7ae89

a scrivere quel modulo, prima ho bisogno di un BistreamWriter

BitstreamWriter::BitstreamWriter (SmallVectorImpl<char> &O) 

http://llvm.org/docs/doxygen/html/classllvm_1_1BitstreamWriter.html

e per un BitstreamWriter ho bisogno di SmallVectorImpl. Ma, e poi? Devo scrivere il contenuto di SmallVectorImpl byte per byte su un gestore di file ? c'è un llvm api per questo? ho bisogno di qualcosa altro?

+3

[C api] (http://llvm.org/docs/doxygen/html/BitWriter_8cpp_source.html) fornisce un modo semplice per farlo. Usalo direttamente o vedi come funziona e fai lo stesso. –

risposta

9

La funzione WriteModule è statico entro lib/Bitcode/Writer/BitcodeWriter.cpp, il che significa che non è lì per il consumo al di fuori (non è possibile anche accedervi).

Lo stesso file è un'altra funzione, tuttavia, chiamato WriteBitcodeToFile, con questa interfaccia:

/// WriteBitcodeToFile - Write the specified module to the specified output 
/// stream. 
void llvm::WriteBitcodeToFile(const Module *M, raw_ostream &Out); 

Non riesco a immaginare un'interfaccia più conveniente. A proposito, il file di intestazione che lo dichiara è ./include/llvm/Bitcode/ReaderWriter.h.

0

Io uso seguente codice:

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.