From 55baeefd54b1e89551545b01b82c5fbf041bb0ad Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Thu, 15 Mar 2018 21:12:21 +0000 Subject: [PATCH] [codeview] Delete FunctionInfo copy ctor and move out of DenseMap We were unnecessarily copying a bunch of these FunctionInfo objects around when rehashing the DenseMap. Furthermore, r327620 introduced pointers referring to objects owned by FunctionInfo, and the default copy ctor did the wrong thing in this case, leading to use-after-free when the DenseMap gets rehashed. I will rebase r327620 on this next and recommit it. llvm-svn: 327665 --- llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | 9 +++++---- llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h | 7 ++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index 59b6c99..1ffc589 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -470,7 +470,7 @@ void CodeViewDebug::endModule() { // Emit per-function debug information. for (auto &P : FnDebugInfo) if (!P.first->isDeclarationForLinker()) - emitDebugInfoForFunction(P.first, P.second); + emitDebugInfoForFunction(P.first, *P.second); // Emit global variable debug information. setCurrentSubprogram(nullptr); @@ -1162,8 +1162,9 @@ void CodeViewDebug::collectVariableInfo(const DISubprogram *SP) { void CodeViewDebug::beginFunctionImpl(const MachineFunction *MF) { const Function &GV = MF->getFunction(); - assert(FnDebugInfo.count(&GV) == false); - CurFn = &FnDebugInfo[&GV]; + auto Insertion = FnDebugInfo.insert({&GV, llvm::make_unique()}); + assert(!Insertion.second && "emitting function twice"); + CurFn = Insertion.first->second.get(); CurFn->FuncId = NextFuncId++; CurFn->Begin = Asm->getFunctionBegin(); @@ -2365,7 +2366,7 @@ void CodeViewDebug::emitLocalVariable(const LocalVariable &Var) { void CodeViewDebug::endFunctionImpl(const MachineFunction *MF) { const Function &GV = MF->getFunction(); assert(FnDebugInfo.count(&GV)); - assert(CurFn == &FnDebugInfo[&GV]); + assert(CurFn == FnDebugInfo[&GV].get()); collectVariableInfo(GV.getSubprogram()); diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h index fdc8dd4..0833d21 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h @@ -110,6 +110,11 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase { // For each function, store a vector of labels to its instructions, as well as // to the end of the function. struct FunctionInfo { + FunctionInfo() = default; + + // Uncopyable. + FunctionInfo(const FunctionInfo &FI) = delete; + /// Map from inlined call site to inlined instructions and child inlined /// call sites. Listed in program order. std::unordered_map InlineSites; @@ -159,7 +164,7 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase { /// Remember some debug info about each function. Keep it in a stable order to /// emit at the end of the TU. - MapVector FnDebugInfo; + MapVector> FnDebugInfo; /// Map from full file path to .cv_file id. Full paths are built from DIFiles /// and are stored in FileToFilepathMap; -- 2.7.4