Add a lto_codegen_compile_to_file to avoid producing a file, reading it to

memory and writing it back to disk.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128108 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2011-03-22 20:57:13 +00:00
parent 97ab5803df
commit 6421a8815e
6 changed files with 69 additions and 72 deletions

View File

@@ -176,54 +176,63 @@ bool LTOCodeGenerator::writeMergedModules(const char *path,
}
bool LTOCodeGenerator::compile_to_file(const char** name, std::string& errMsg)
{
// make unique temp .o file to put generated object file
sys::PathWithStatus uniqueObjPath("lto-llvm.o");
if ( uniqueObjPath.createTemporaryFileOnDisk(false, &errMsg) ) {
uniqueObjPath.eraseFromDisk();
return true;
}
sys::RemoveFileOnSignal(uniqueObjPath);
// generate object file
bool genResult = false;
tool_output_file objFile(uniqueObjPath.c_str(), errMsg);
if (!errMsg.empty())
return NULL;
genResult = this->generateObjectFile(objFile.os(), errMsg);
objFile.os().close();
if (objFile.os().has_error()) {
objFile.os().clear_error();
return true;
}
objFile.keep();
if ( genResult ) {
uniqueObjPath.eraseFromDisk();
return true;
}
_nativeObjectPath = uniqueObjPath.str();
*name = _nativeObjectPath.c_str();
return false;
}
const void* LTOCodeGenerator::compile(size_t* length, std::string& errMsg)
{
// make unique temp .o file to put generated object file
sys::PathWithStatus uniqueObjPath("lto-llvm.o");
if ( uniqueObjPath.createTemporaryFileOnDisk(false, &errMsg) ) {
uniqueObjPath.eraseFromDisk();
return NULL;
}
sys::RemoveFileOnSignal(uniqueObjPath);
const char *name;
if (compile_to_file(&name, errMsg))
return NULL;
// generate object file
bool genResult = false;
tool_output_file objFile(uniqueObjPath.c_str(), errMsg);
if (!errMsg.empty())
return NULL;
genResult = this->generateObjectFile(objFile.os(), errMsg);
objFile.os().close();
if (objFile.os().has_error()) {
objFile.os().clear_error();
return NULL;
}
objFile.keep();
if ( genResult ) {
uniqueObjPath.eraseFromDisk();
return NULL;
}
// remove old buffer if compile() called twice
delete _nativeObjectFile;
const std::string& uniqueObjStr = uniqueObjPath.str();
// remove old buffer if compile() called twice
delete _nativeObjectFile;
// read .o file into memory buffer
OwningPtr<MemoryBuffer> BuffPtr;
if (error_code ec = MemoryBuffer::getFile(name, BuffPtr, -1, false)) {
errMsg = ec.message();
return NULL;
}
_nativeObjectFile = BuffPtr.take();
// read .o file into memory buffer
OwningPtr<MemoryBuffer> BuffPtr;
if (error_code ec = MemoryBuffer::getFile(uniqueObjStr.c_str(), BuffPtr,
-1, false)) {
errMsg = ec.message();
return NULL;
}
_nativeObjectFile = BuffPtr.take();
// remove temp files
sys::Path(_nativeObjectPath).eraseFromDisk();
// remove temp files
uniqueObjPath.eraseFromDisk();
// return buffer, unless error
if ( _nativeObjectFile == NULL )
return NULL;
*length = _nativeObjectFile->getBufferSize();
return _nativeObjectFile->getBufferStart();
// return buffer, unless error
if ( _nativeObjectFile == NULL )
return NULL;
*length = _nativeObjectFile->getBufferSize();
return _nativeObjectFile->getBufferStart();
}
bool LTOCodeGenerator::determineTarget(std::string& errMsg)