2012-12-18 6 views
5

Teraz używam clang kompilacji mój plik .c do pliku .s. I użyłem API llvm, modyfikując IR. Jednak teraz nie mogę zapisać zmodyfikowanego pliku IR do pliku. Chcę użyć "LLVMWriteBitcodeToFile", ale nie mogę znaleźć struktury "LLVMOpaqueModule"; Chcę użyć "WriteBitcodeToFile", zawsze pokazuje mi "niedopasowanie typu". Chcę również wiedzieć, jak zbudować plik IR do pliku wykonywalnego.Jak zapisać IR do pliku i zbudować go do pliku wykonywalnego?

Następny są dwie metody użyć, aby zapisać moduł:

1, użyj najpierw WriteBitcodeToFile

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

2, drugi wykorzystują LLVMWriteBitcodeToFile

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

uwaga: M jest punktem Instancja modułu

+0

Poprawną funkcją do użycia jest w rzeczywistości 'WriteBitcodeToFile' z' Bitcode/ReaderWriter.h'. Jeśli nie możesz go użyć, powinieneś podać kod, który próbujesz skompilować w tym pytaniu. – Oak

+0

Tak, podążaj za prototypem WriteBitcodeToFilevoid: WriteBitcodeToFile (const Module * M, raw_ostream &Out); –

+0

Tak, Follow to prototyp WriteBitcodeToFilevoid: WriteBitcodeToFile (const Module * M, raw_ostream &Out); kiedy uruchamiam rawStream, nie stać mnie na .. typ dopasowania parametr, który ma defaulted parametr –

Odpowiedz

3
  1. Aby zapisać IR w pliku, zobacz odpowiedź na to pytanie: writing module to .bc bitcode file
  2. Aby skompilować IR do pliku obiektowego, spójrz na narzędzie llc i wykonaj jego funkcję main.
+0

Dzięki, Ale kiedy zainicjuję instancję raw_ostream, która jest parametrem WriteBitcodeToFile, mogę ' t to zrobić. Nie pytaj o żaden parametr ani nie dopasowuj typu. –

+0

I jeszcze raz pamiętam, że llc po prostu sprawia, że ​​IR staje się zbiorem, możemy po prostu przydzielić platformę. –

+0

Następnie są dwie metody, których używam do zapisania modułu: bool unbuffered = false; llvm :: raw_ostream ro (niebuforowany); WriteBitcodeToFile (m, ro); \t \t const char * Ścieżka = "hello2.s"; int ans = LLVMWriteBitcodeToFile (m, Path); –

0

Sprawdź te funkcje w 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); 

Patrz także How to generate machine code with llvm

1

do pisania LLVM bitcode złożyć, co mogę zrobić, to:

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

a następnie zdemontować za pomocą LLVM -dis.