diff --git a/llvm/include/llvm/DWARFLinker/DWARFLinker.h b/llvm/include/llvm/DWARFLinker/DWARFLinker.h index 8489538e9b9f7..e5797514165a2 100644 --- a/llvm/include/llvm/DWARFLinker/DWARFLinker.h +++ b/llvm/include/llvm/DWARFLinker/DWARFLinker.h @@ -269,9 +269,10 @@ class DWARFFile { public: using UnloadCallbackTy = std::function; DWARFFile(StringRef Name, std::unique_ptr Dwarf, - std::unique_ptr Addresses, UnloadCallbackTy = nullptr) + std::unique_ptr Addresses, + UnloadCallbackTy UnloadFunc = nullptr) : FileName(Name), Dwarf(std::move(Dwarf)), - Addresses(std::move(Addresses)) {} + Addresses(std::move(Addresses)), UnloadFunc(UnloadFunc) {} /// The object file name. StringRef FileName; @@ -281,6 +282,18 @@ class DWARFFile { /// Helpful address information(list of valid address ranges, relocations). std::unique_ptr Addresses; + + /// Callback to the module keeping object file to unload. + UnloadCallbackTy UnloadFunc; + + /// Unloads object file and corresponding AddressesMap and Dwarf Context. + void unload() { + Addresses.reset(); + Dwarf.reset(); + + if (UnloadFunc) + UnloadFunc(FileName); + } }; typedef std::map swiftInterfacesMap; @@ -529,7 +542,8 @@ class DWARFLinker { /// the debug object. void clear() { CompileUnits.clear(); - File.Addresses->clear(); + ModuleUnits.clear(); + File.unload(); } };