diff options
Diffstat (limited to 'lib/CodeGen/AsmPrinter/DwarfDebug.cpp')
| -rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 46 | 
1 files changed, 26 insertions, 20 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index d50e5e34c8eff..23752c4ba8420 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -124,7 +124,7 @@ public:  //===----------------------------------------------------------------------===//  /// DbgVariable - This class is used to track local variable information.  /// -class VISIBILITY_HIDDEN DbgVariable { +class DbgVariable {    DIVariable Var;                    // Variable Descriptor.    unsigned FrameIndex;               // Variable frame index.    bool InlinedFnVar;                 // Variable for an inlined function. @@ -142,7 +142,7 @@ public:  /// DbgScope - This class is used to track scope information.  ///  class DbgConcreteScope; -class VISIBILITY_HIDDEN DbgScope { +class DbgScope {    DbgScope *Parent;                   // Parent to this scope.    DIDescriptor Desc;                  // Debug info descriptor for scope.                                        // FIXME use WeakVH for Desc. @@ -1249,6 +1249,9 @@ CompileUnit &DwarfDebug::FindCompileUnit(DICompileUnit Unit) const {  DIE *DwarfDebug::CreateDbgScopeVariable(DbgVariable *DV, CompileUnit *Unit) {    // Get the descriptor.    const DIVariable &VD = DV->getVariable(); +  const char *Name = VD.getName(); +  if (!Name) +    return NULL;    // Translate tag to proper Dwarf tag.  The result variable is dropped for    // now. @@ -1267,7 +1270,6 @@ DIE *DwarfDebug::CreateDbgScopeVariable(DbgVariable *DV, CompileUnit *Unit) {    // Define variable debug information entry.    DIE *VariableDie = new DIE(Tag); -  const char *Name = VD.getName();    AddString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);    // Add source line info if available. @@ -1304,15 +1306,16 @@ DIE *DwarfDebug::CreateDbgScopeVariable(DbgVariable *DV, CompileUnit *Unit) {  ///  DbgScope *DwarfDebug::getDbgScope(MDNode *N, const MachineInstr *MI,                                    MDNode *InlinedAt) { -  DbgScope *&Slot = DbgScopeMap[N]; -  if (Slot) return Slot; +  ValueMap<MDNode *, DbgScope *>::iterator VI = DbgScopeMap.find(N); +  if (VI != DbgScopeMap.end()) +    return VI->second;    DbgScope *Parent = NULL;    if (InlinedAt) {      DILocation IL(InlinedAt);      assert (!IL.isNull() && "Invalid InlindAt location!"); -    DenseMap<MDNode *, DbgScope *>::iterator DSI =  +    ValueMap<MDNode *, DbgScope *>::iterator DSI =         DbgScopeMap.find(IL.getScope().getNode());      assert (DSI != DbgScopeMap.end() && "Unable to find InlineAt scope!");      Parent = DSI->second; @@ -1334,17 +1337,18 @@ DbgScope *DwarfDebug::getDbgScope(MDNode *N, const MachineInstr *MI,        assert (0 && "Unexpected scope info");    } -  Slot = new DbgScope(Parent, DIDescriptor(N), InlinedAt); -  Slot->setFirstInsn(MI); +  DbgScope *NScope = new DbgScope(Parent, DIDescriptor(N), InlinedAt); +  NScope->setFirstInsn(MI);    if (Parent) -    Parent->AddScope(Slot); +    Parent->AddScope(NScope);    else      // First function is top level function.      if (!FunctionDbgScope) -      FunctionDbgScope = Slot; +      FunctionDbgScope = NScope; -  return Slot; +  DbgScopeMap.insert(std::make_pair(N, NScope)); +  return NScope;  } @@ -1812,7 +1816,7 @@ void DwarfDebug::CollectVariableInfo() {      if (DV.isNull()) continue;      unsigned VSlot = VI->second;      DbgScope *Scope = NULL; -    DenseMap<MDNode *, DbgScope *>::iterator DSI =  +    ValueMap<MDNode *, DbgScope *>::iterator DSI =         DbgScopeMap.find(DV.getContext().getNode());      if (DSI != DbgScopeMap.end())         Scope = DSI->second; @@ -1884,8 +1888,10 @@ bool DwarfDebug::ExtractScopeInformation(MachineFunction *MF) {    // If a scope's last instruction is not set then use its child scope's    // last instruction as this scope's last instrunction. -  for (DenseMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(), +  for (ValueMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(),  	 DE = DbgScopeMap.end(); DI != DE; ++DI) { +    DbgScope *S = DI->second; +    if (!S) continue;      assert (DI->second->getFirstInsn() && "Invalid first instruction!");      DI->second->FixInstructionMarkers();      assert (DI->second->getLastInsn() && "Invalid last instruction!"); @@ -1895,10 +1901,10 @@ bool DwarfDebug::ExtractScopeInformation(MachineFunction *MF) {    // and end of a scope respectively. Create an inverse map that list scopes    // starts (and ends) with an instruction. One instruction may start (or end)    // multiple scopes. -  for (DenseMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(), +  for (ValueMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(),  	 DE = DbgScopeMap.end(); DI != DE; ++DI) {      DbgScope *S = DI->second; -    assert (S && "DbgScope is missing!"); +    if (!S) continue;      const MachineInstr *MI = S->getFirstInsn();      assert (MI && "DbgScope does not have first instruction!"); @@ -2172,7 +2178,7 @@ void DwarfDebug::RecordVariable(MDNode *N, unsigned FrameIndex) {      if (!SP.isNull()) {        // SP is inserted into DbgAbstractScopeMap when inlined function        // start was recorded by RecordInlineFnStart. -      DenseMap<MDNode *, DbgScope *>::iterator +      ValueMap<MDNode *, DbgScope *>::iterator          I = DbgAbstractScopeMap.find(SP.getNode());        if (I != DbgAbstractScopeMap.end()) {          InlinedVar = true; @@ -2249,7 +2255,7 @@ unsigned DwarfDebug::RecordInlinedFnStart(DISubprogram &SP, DICompileUnit CU,    LexicalScopeStack.back()->AddConcreteInst(ConcreteScope);    // Keep track of the concrete scope that's inlined into this function. -  DenseMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator +  ValueMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator      SI = DbgConcreteScopeMap.find(Node);    if (SI == DbgConcreteScopeMap.end()) @@ -2258,7 +2264,7 @@ unsigned DwarfDebug::RecordInlinedFnStart(DISubprogram &SP, DICompileUnit CU,      SI->second.push_back(ConcreteScope);    // Track the start label for this inlined function. -  DenseMap<MDNode *, SmallVector<unsigned, 4> >::iterator +  ValueMap<MDNode *, SmallVector<unsigned, 4> >::iterator      I = InlineInfo.find(Node);    if (I == InlineInfo.end()) @@ -2281,7 +2287,7 @@ unsigned DwarfDebug::RecordInlinedFnEnd(DISubprogram &SP) {      DebugTimer->startTimer();    MDNode *Node = SP.getNode(); -  DenseMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator +  ValueMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator      I = DbgConcreteScopeMap.find(Node);    if (I == DbgConcreteScopeMap.end()) { @@ -2989,7 +2995,7 @@ void DwarfDebug::EmitDebugInlineInfo() {    Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");    Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)"); -  for (DenseMap<MDNode *, SmallVector<unsigned, 4> >::iterator +  for (ValueMap<MDNode *, SmallVector<unsigned, 4> >::iterator           I = InlineInfo.begin(), E = InlineInfo.end(); I != E; ++I) {      MDNode *Node = I->first;      SmallVector<unsigned, 4> &Labels = I->second;  | 
