mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
C API: Add LLVMTargetMachineEmitToMemoryBuffer()
llvm-svn: 179648
This commit is contained in:
parent
e343d842fd
commit
cbb7544fa4
@ -114,6 +114,9 @@ LLVMTargetDataRef LLVMGetTargetMachineData(LLVMTargetMachineRef T);
|
||||
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);
|
||||
|
||||
|
||||
|
||||
|
@ -149,8 +149,8 @@ LLVMTargetDataRef LLVMGetTargetMachineData(LLVMTargetMachineRef T) {
|
||||
return wrap(unwrap(T)->getDataLayout());
|
||||
}
|
||||
|
||||
LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M,
|
||||
char* Filename, LLVMCodeGenFileType codegen, char** ErrorMessage) {
|
||||
static LLVMBool LLVMTargetMachineEmit(LLVMTargetMachineRef T, LLVMModuleRef M,
|
||||
formatted_raw_ostream &OS, LLVMCodeGenFileType codegen, char **ErrorMessage) {
|
||||
TargetMachine* TM = unwrap(T);
|
||||
Module* Mod = unwrap(M);
|
||||
|
||||
@ -176,14 +176,7 @@ LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M,
|
||||
ft = TargetMachine::CGFT_ObjectFile;
|
||||
break;
|
||||
}
|
||||
raw_fd_ostream dest(Filename, error, raw_fd_ostream::F_Binary);
|
||||
formatted_raw_ostream destf(dest);
|
||||
if (!error.empty()) {
|
||||
*ErrorMessage = strdup(error.c_str());
|
||||
return true;
|
||||
}
|
||||
|
||||
if (TM->addPassesToEmitFile(pass, destf, ft)) {
|
||||
if (TM->addPassesToEmitFile(pass, OS, ft)) {
|
||||
error = "TargetMachine can't emit a file of this type";
|
||||
*ErrorMessage = strdup(error.c_str());
|
||||
return true;
|
||||
@ -191,7 +184,35 @@ LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M,
|
||||
|
||||
pass.run(*Mod);
|
||||
|
||||
destf.flush();
|
||||
dest.flush();
|
||||
OS.flush();
|
||||
return false;
|
||||
}
|
||||
|
||||
LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M,
|
||||
char* Filename, LLVMCodeGenFileType codegen, char** ErrorMessage) {
|
||||
std::string error;
|
||||
raw_fd_ostream dest(Filename, error, raw_fd_ostream::F_Binary);
|
||||
formatted_raw_ostream destf(dest);
|
||||
if (!error.empty()) {
|
||||
*ErrorMessage = strdup(error.c_str());
|
||||
return true;
|
||||
}
|
||||
bool Result = LLVMTargetMachineEmit(T, M, destf, codegen, ErrorMessage);
|
||||
dest.flush();
|
||||
return Result;
|
||||
}
|
||||
|
||||
LLVMBool LLVMTargetMachineEmitToMemoryBuffer(LLVMTargetMachineRef T,
|
||||
LLVMModuleRef M, LLVMCodeGenFileType codegen, char** ErrorMessage,
|
||||
LLVMMemoryBufferRef *OutMemBuf) {
|
||||
std::string CodeString;
|
||||
raw_string_ostream OStream(CodeString);
|
||||
formatted_raw_ostream Out(OStream);
|
||||
bool Result = LLVMTargetMachineEmit(T, M, Out, codegen, ErrorMessage);
|
||||
OStream.flush();
|
||||
|
||||
std::string &Data = OStream.str();
|
||||
*OutMemBuf = LLVMCreateMemoryBufferWithMemoryRangeCopy(Data.c_str(),
|
||||
Data.length(), "");
|
||||
return Result;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user