#include "llvm/Config/config.h" // plugin-api.h requires HAVE_STDINT_H
#include "plugin-api.h"
-
#include "llvm-c/lto.h"
-
#include "llvm/ADT/OwningPtr.h"
-#include "llvm/Support/system_error.h"
-#include "llvm/Support/MemoryBuffer.h"
-#include "llvm/Support/ToolOutputFile.h"
#include "llvm/Support/Errno.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/Program.h"
-
+#include "llvm/Support/ToolOutputFile.h"
+#include "llvm/Support/system_error.h"
#include <cerrno>
#include <cstdlib>
#include <cstring>
lto_codegen_model output_type = LTO_CODEGEN_PIC_MODEL_STATIC;
std::string output_name = "";
std::list<claimed_file> Modules;
- std::vector<sys::Path> Cleanup;
+ std::vector<std::string> Cleanup;
lto_code_gen_t code_gen = NULL;
}
}
}
- // If we don't preserve any symbols, libLTO will assume that all symbols are
- // needed. Keep all symbols unless we're producing a final executable.
- bool anySymbolsPreserved = false;
for (std::list<claimed_file>::iterator I = Modules.begin(),
E = Modules.end(); I != E; ++I) {
if (I->syms.empty())
for (unsigned i = 0, e = I->syms.size(); i != e; i++) {
if (I->syms[i].resolution == LDPR_PREVAILING_DEF) {
lto_codegen_add_must_preserve_symbol(code_gen, I->syms[i].name);
- anySymbolsPreserved = true;
if (options::generate_api_file)
api_file << I->syms[i].name << "\n";
if (options::generate_api_file)
api_file.close();
- if (!anySymbolsPreserved) {
- // All of the IL is unnecessary!
- lto_codegen_dispose(code_gen);
- return LDPS_OK;
- }
-
lto_codegen_set_pic_model(code_gen, output_type);
lto_codegen_set_debug_model(code_gen, LTO_DEBUG_MODEL_DWARF);
if (!options::mcpu.empty())
}
if (options::obj_path.empty())
- Cleanup.push_back(sys::Path(objPath));
+ Cleanup.push_back(objPath);
return LDPS_OK;
}
static ld_plugin_status cleanup_hook(void) {
- std::string ErrMsg;
-
- for (int i = 0, e = Cleanup.size(); i != e; ++i)
- if (Cleanup[i].eraseFromDisk(false, &ErrMsg))
+ for (int i = 0, e = Cleanup.size(); i != e; ++i) {
+ error_code EC = sys::fs::remove(Cleanup[i]);
+ if (EC)
(*message)(LDPL_ERROR, "Failed to delete '%s': %s", Cleanup[i].c_str(),
- ErrMsg.c_str());
+ EC.message().c_str());
+ }
return LDPS_OK;
}