X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fgold%2Fgold-plugin.cpp;h=a42ce4f3e8d98187e08d3788b646ae05d5f32865;hb=c170f5f31cd697818bf470b57b72c11a1da78010;hp=e959d9566b297ec76190970c774df025d53d2a58;hpb=d36fb9b5d44b5df27e3d6559e04d44f2cbc6be94;p=oota-llvm.git diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp index e959d9566b2..a42ce4f3e8d 100644 --- a/tools/gold/gold-plugin.cpp +++ b/tools/gold/gold-plugin.cpp @@ -50,6 +50,7 @@ namespace { ld_plugin_add_input_file add_input_file = NULL; ld_plugin_add_input_library add_input_library = NULL; ld_plugin_set_extra_library_path set_extra_library_path = NULL; + ld_plugin_get_view get_view = NULL; ld_plugin_message message = discard_message; int api_version = 0; @@ -205,6 +206,9 @@ ld_plugin_status onload(ld_plugin_tv *tv) { case LDPT_SET_EXTRA_LIBRARY_PATH: set_extra_library_path = tv->tv_u.tv_set_extra_library_path; break; + case LDPT_GET_VIEW: + get_view = tv->tv_u.tv_get_view; + break; case LDPT_MESSAGE: message = tv->tv_u.tv_message; break; @@ -232,48 +236,27 @@ static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file, int *claimed) { lto_module_t M; - if (file->offset) { - // Gold has found what might be IR part-way inside of a file, such as - // an .a archive. - if (lseek(file->fd, file->offset, SEEK_SET) == -1) { - (*message)(LDPL_ERROR, - "Failed to seek to archive member of %s at offset %d: %s\n", - file->name, - file->offset, sys::StrError(errno).c_str()); - return LDPS_ERR; - } - void *buf = malloc(file->filesize); - if (!buf) { - (*message)(LDPL_ERROR, - "Failed to allocate buffer for archive member of size: %d\n", - file->filesize); - return LDPS_ERR; - } - if (read(file->fd, buf, file->filesize) != file->filesize) { - (*message)(LDPL_ERROR, - "Failed to read archive member of %s at offset %d: %s\n", - file->name, - file->offset, - sys::StrError(errno).c_str()); - free(buf); + if (get_view) { + const void *view; + if (get_view(file->handle, &view) != LDPS_OK) { + (*message)(LDPL_ERROR, "Failed to get a view of %s", file->name); return LDPS_ERR; } - if (!lto_module_is_object_file_in_memory(buf, file->filesize)) { - free(buf); - return LDPS_OK; - } - M = lto_module_create_from_memory(buf, file->filesize); - if (!M) { - (*message)(LDPL_ERROR, "Failed to create LLVM module: %s", - lto_get_error_message()); - return LDPS_ERR; - } - free(buf); + M = lto_module_create_from_memory(view, file->filesize); + } else if (file->offset) { + // Gold has found what might be IR part-way inside of a file, such as + // an .a archive. + M = lto_module_create_from_fd_at_offset(file->fd, file->name, -1, + file->filesize, file->offset); } else { - lseek(file->fd, 0, SEEK_SET); M = lto_module_create_from_fd(file->fd, file->name, file->filesize); - if (!M) - return LDPS_OK; + } + if (!M) { + if (const char* msg = lto_get_error_message()) { + (*message)(LDPL_ERROR, "Failed to create LTO module: %s", msg); + return LDPS_ERR; + } + return LDPS_OK; } *claimed = 1; @@ -382,6 +365,8 @@ static ld_plugin_status all_symbols_read_hook(void) { bool anySymbolsPreserved = false; for (std::list::iterator I = Modules.begin(), E = Modules.end(); I != E; ++I) { + if (I->syms.empty()) + continue; (*get_symbols)(I->handle, I->syms.size(), &I->syms[0]); for (unsigned i = 0, e = I->syms.size(); i != e; i++) { if (I->syms[i].resolution == LDPR_PREVAILING_DEF) { @@ -430,39 +415,10 @@ static ld_plugin_status all_symbols_read_hook(void) { if (options::generate_bc_file == options::BC_ONLY) exit(0); } - size_t bufsize = 0; - const char *buffer = static_cast(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::iterator I = Modules.begin(),