2012-12-16 6 views
5

Ich habe angenommen, dass eine BMC-Datei von einem Modul zu entladen war eine triviale Operation, aber jetzt, ersten Mal muss ich es tatsächlich aus dem Code tun, für das Leben von mir ich kann nicht einen fehlenden Schritt in dem Prozess finden:Schreiben von Modul auf .bc Bitcode-Datei

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

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

dieses Modul zu schreiben, zuerst muß ich ein BistreamWriter

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

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

und für einen BitstreamWriter brauche ich einen SmallVectorImpl. Aber was als nächstes? Sollte ich den Inhalt der SmallVectorImpl Byte für Byte auf einem Dateihandler selbst schreiben? Gibt es eine llvm api dafür? brauche ich etwas sonst?

+3

[C api] (http://llvm.org/docs/doxygen/html/BitWriter_8cpp_source.html) bietet eine einfache Möglichkeit, dies zu tun. Verwenden Sie es direkt oder sehen Sie, wie es funktioniert und das Gleiche tun. –

Antwort

9

Die WriteModule Funktion ist statische innerhalb lib/Bitcode/Writer/BitcodeWriter.cpp, die es dort nicht außerhalb Verbrauch bedeutet (Sie nicht einmal darauf zugreifen können).

Die gleiche Datei eine andere Funktion hat, die so genannte jedoch WriteBitcodeToFile, mit dieser Schnittstelle:

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

ich nicht eine bequemere Schnittstelle vorstellen kann. Die Header-Datei deklariert es übrigens ./include/llvm/Bitcode/ReaderWriter.h.

0

Ich benutze folgenden Code:

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

und dann zerlegen llvm-dis verwenden.