typedef StringMap<uint8_t> StringSet;
void initialize();
+ void destroyMergedModule();
std::unique_ptr<LLVMContext> OwnedContext;
LLVMContext &Context;
Linker IRLinker;
TargetOptions Options;
lto_diagnostic_handler_t DiagHandler;
void *DiagContext;
+ LTOModule *OwnedModule;
};
}
#endif
CodeModel = LTO_CODEGEN_PIC_MODEL_DEFAULT;
DiagHandler = nullptr;
DiagContext = nullptr;
+ OwnedModule = nullptr;
initializeLTOPasses();
}
+void LTOCodeGenerator::destroyMergedModule() {
+ if (OwnedModule) {
+ assert(IRLinker.getModule() == &OwnedModule->getModule() &&
+ "The linker's module should be the same as the owned module");
+ delete OwnedModule;
+ OwnedModule = nullptr;
+ } else if (IRLinker.getModule())
+ IRLinker.deleteModule();
+}
+
LTOCodeGenerator::~LTOCodeGenerator() {
+ destroyMergedModule();
+
delete TargetMach;
TargetMach = nullptr;
- IRLinker.deleteModule();
-
for (std::vector<char *>::iterator I = CodegenOptions.begin(),
E = CodegenOptions.end();
I != E; ++I)
"Expected module in same context");
// Delete the old merged module.
- if (IRLinker.getModule())
- IRLinker.deleteModule();
+ destroyMergedModule();
AsmUndefinedRefs.clear();
+ OwnedModule = Mod;
IRLinker.setModule(&Mod->getModule());
const std::vector<const char*> &Undefs = Mod->getAsmUndefinedRefs();