exit(0);
}
size_t bufsize = 0;
- const char *buffer = static_cast<const char *>(lto_codegen_compile(code_gen,
- &bufsize));
-
- std::string ErrMsg;
-
const char *objPath;
- sys::Path uniqueObjPath("/tmp/llvmgold.o");
- if (!options::obj_path.empty()) {
- objPath = options::obj_path.c_str();
- } else {
- if (uniqueObjPath.createTemporaryFileOnDisk(true, &ErrMsg)) {
- (*message)(LDPL_ERROR, "%s", ErrMsg.c_str());
- return LDPS_ERR;
- }
- objPath = uniqueObjPath.c_str();
- }
- tool_output_file objFile(objPath, ErrMsg,
- raw_fd_ostream::F_Binary);
- if (!ErrMsg.empty()) {
- (*message)(LDPL_ERROR, "%s", ErrMsg.c_str());
- return LDPS_ERR;
- }
-
- objFile.os().write(buffer, bufsize);
- objFile.os().close();
- if (objFile.os().has_error()) {
- (*message)(LDPL_ERROR, "Error writing output file '%s'",
- objPath);
- objFile.os().clear_error();
- return LDPS_ERR;
+ if (lto_codegen_compile_to_file(code_gen, &objPath)) {
+ (*message)(LDPL_ERROR, "Could not produce a combined object file\n");
}
- objFile.keep();
lto_codegen_dispose(code_gen);
for (std::list<claimed_file>::iterator I = Modules.begin(),
}
-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)