mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-25 04:39:44 +00:00
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:
parent
97ab5803df
commit
6421a8815e
@ -272,6 +272,13 @@ lto_codegen_write_merged_modules(lto_code_gen_t cg, const char* path);
|
||||
extern const void*
|
||||
lto_codegen_compile(lto_code_gen_t cg, size_t* length);
|
||||
|
||||
/**
|
||||
* Generates code for all added modules into one native object file.
|
||||
* The name of the file is written to name. Returns true on error.
|
||||
*/
|
||||
extern bool
|
||||
lto_codegen_compile_to_file(lto_code_gen_t cg, const char** name);
|
||||
|
||||
|
||||
/**
|
||||
* Sets options to help debug codegen bugs.
|
||||
|
@ -398,38 +398,10 @@ static ld_plugin_status all_symbols_read_hook(void) {
|
||||
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();
|
||||
if (lto_codegen_compile_to_file(code_gen, &objPath)) {
|
||||
(*message)(LDPL_ERROR, "Could not produce a combined object file\n");
|
||||
}
|
||||
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;
|
||||
}
|
||||
objFile.keep();
|
||||
|
||||
lto_codegen_dispose(code_gen);
|
||||
for (std::list<claimed_file>::iterator I = Modules.begin(),
|
||||
|
@ -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)
|
||||
|
@ -41,6 +41,7 @@ struct LTOCodeGenerator {
|
||||
void addMustPreserveSymbol(const char* sym);
|
||||
bool writeMergedModules(const char* path,
|
||||
std::string& errMsg);
|
||||
bool compile_to_file(const char** name, std::string& errMsg);
|
||||
const void* compile(size_t* length, std::string& errMsg);
|
||||
void setCodeGenDebugOptions(const char *opts);
|
||||
private:
|
||||
@ -66,6 +67,7 @@ private:
|
||||
llvm::MemoryBuffer* _nativeObjectFile;
|
||||
std::vector<const char*> _codegenOptions;
|
||||
std::string _mCpu;
|
||||
std::string _nativeObjectPath;
|
||||
};
|
||||
|
||||
#endif // LTO_CODE_GENERATOR_H
|
||||
|
@ -293,6 +293,12 @@ lto_codegen_compile(lto_code_gen_t cg, size_t* length)
|
||||
return cg->compile(length, sLastErrorString);
|
||||
}
|
||||
|
||||
extern bool
|
||||
lto_codegen_compile_to_file(lto_code_gen_t cg, const char **name)
|
||||
{
|
||||
return cg->compile_to_file(name, sLastErrorString);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Used to pass extra options to the code generator
|
||||
|
@ -26,3 +26,4 @@ lto_codegen_debug_options
|
||||
lto_codegen_set_assembler_args
|
||||
lto_codegen_set_assembler_path
|
||||
lto_codegen_set_cpu
|
||||
lto_codegen_compile_to_file
|
||||
|
Loading…
Reference in New Issue
Block a user