summaryrefslogtreecommitdiffstats
path: root/llvm/tools/lto/LTOCodeGenerator.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2011-03-22 20:57:13 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2011-03-22 20:57:13 +0000
commit26b57ffa270333d377b8cbe82ae7d76621293882 (patch)
tree24d27d087bcd2d93d86aa51676de1e43fdbb02f0 /llvm/tools/lto/LTOCodeGenerator.cpp
parent822e7bc061ec77efd38154c6011403dfa92174ac (diff)
downloadbcm5719-llvm-26b57ffa270333d377b8cbe82ae7d76621293882.tar.gz
bcm5719-llvm-26b57ffa270333d377b8cbe82ae7d76621293882.zip
Add a lto_codegen_compile_to_file to avoid producing a file, reading it to
memory and writing it back to disk. llvm-svn: 128108
Diffstat (limited to 'llvm/tools/lto/LTOCodeGenerator.cpp')
-rw-r--r--llvm/tools/lto/LTOCodeGenerator.cpp95
1 files changed, 52 insertions, 43 deletions
diff --git a/llvm/tools/lto/LTOCodeGenerator.cpp b/llvm/tools/lto/LTOCodeGenerator.cpp
index 372cb31a4c2..d95f35405b2 100644
--- a/llvm/tools/lto/LTOCodeGenerator.cpp
+++ b/llvm/tools/lto/LTOCodeGenerator.cpp
@@ -176,54 +176,63 @@ bool LTOCodeGenerator::writeMergedModules(const char *path,
}
-const void* LTOCodeGenerator::compile(size_t* length, std::string& errMsg)
+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 NULL;
- }
- 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 NULL;
- }
- objFile.keep();
- if ( genResult ) {
- uniqueObjPath.eraseFromDisk();
- return NULL;
- }
+ // 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;
+ }
- const std::string& uniqueObjStr = uniqueObjPath.str();
- // remove old buffer if compile() called twice
- delete _nativeObjectFile;
+ _nativeObjectPath = uniqueObjPath.str();
+ *name = _nativeObjectPath.c_str();
+ return false;
+}
- // 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();
+const void* LTOCodeGenerator::compile(size_t* length, std::string& errMsg)
+{
+ const char *name;
+ if (compile_to_file(&name, errMsg))
+ return NULL;
+
+ // 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();
- // remove temp files
- uniqueObjPath.eraseFromDisk();
+ // remove temp files
+ sys::Path(_nativeObjectPath).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)
OpenPOWER on IntegriCloud