diff options
| author | Devang Patel <dpatel@apple.com> | 2009-01-13 23:54:55 +0000 | 
|---|---|---|
| committer | Devang Patel <dpatel@apple.com> | 2009-01-13 23:54:55 +0000 | 
| commit | 3c82aa0209071d2e3bb0ce9df1fc90ef5c56575f (patch) | |
| tree | ec2335c9a1e3c0583a5f6044574bde990d3f5e96 /llvm/lib/CodeGen | |
| parent | b0a78f8fa12b9b590b959e899374045c1b767d04 (diff) | |
| download | bcm5719-llvm-3c82aa0209071d2e3bb0ce9df1fc90ef5c56575f.tar.gz bcm5719-llvm-3c82aa0209071d2e3bb0ce9df1fc90ef5c56575f.zip | |
Removoe MachineModuleInfo methods (and related DebugInfoDesc class  hierarchy) that were used to handle debug info.
llvm-svn: 62199
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp | 750 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MachineModuleInfo.cpp | 1711 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 2 | 
3 files changed, 10 insertions, 2453 deletions
| diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp index e17dd527c5e..ec17c480df7 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp @@ -749,10 +749,6 @@ public:  /// with a source file.  class CompileUnit {  private: -  /// Desc - Compile unit debug descriptor. -  /// -  CompileUnitDesc *Desc; -    /// ID - File identifier for source.    ///    unsigned ID; @@ -761,14 +757,12 @@ private:    ///    DIE *Die; -  /// DescToDieMap - Tracks the mapping of unit level debug informaton -  /// descriptors to debug information entries. -  std::map<DebugInfoDesc *, DIE *> DescToDieMap; +  /// GVToDieMap - Tracks the mapping of unit level debug informaton +  /// variables to debug information entries.    DenseMap<GlobalVariable *, DIE *> GVToDieMap; -  /// DescToDIEntryMap - Tracks the mapping of unit level debug informaton +  /// GVToDIEntryMap - Tracks the mapping of unit level debug informaton    /// descriptors to debug information entries using a DIEntry proxy. -  std::map<DebugInfoDesc *, DIEntry *> DescToDIEntryMap;    DenseMap<GlobalVariable *, DIEntry *> GVToDIEntryMap;    /// Globals - A map of globally visible named entities for this unit. @@ -785,23 +779,10 @@ private:  public:    CompileUnit(unsigned I, DIE *D) -    : ID(I), Die(D), DescToDieMap(), GVToDieMap(), DescToDIEntryMap(), +    : ID(I), Die(D), GVToDieMap(),        GVToDIEntryMap(), Globals(), DiesSet(InitDiesSetSize), Dies()    {} -  CompileUnit(CompileUnitDesc *CUD, unsigned I, DIE *D) -  : Desc(CUD) -  , ID(I) -  , Die(D) -  , DescToDieMap() -  , GVToDieMap() -  , DescToDIEntryMap() -  , GVToDIEntryMap() -  , Globals() -  , DiesSet(InitDiesSetSize) -  , Dies() -  {} -    ~CompileUnit() {      delete Die; @@ -810,7 +791,6 @@ public:    }    // Accessors. -  CompileUnitDesc *getDesc() const { return Desc; }    unsigned getID()           const { return ID; }    DIE* getDie()              const { return Die; }    std::map<std::string, DIE *> &getGlobals() { return Globals; } @@ -828,19 +808,13 @@ public:    }    /// getDieMapSlotFor - Returns the debug information entry map slot for the -  /// specified debug descriptor. -  DIE *&getDieMapSlotFor(DebugInfoDesc *DID) { -    return DescToDieMap[DID]; -  } +  /// specified debug variable.    DIE *&getDieMapSlotFor(GlobalVariable *GV) {      return GVToDieMap[GV];    }    /// getDIEntrySlotFor - Returns the debug information entry proxy slot for the -  /// specified debug descriptor. -  DIEntry *&getDIEntrySlotFor(DebugInfoDesc *DID) { -    return DescToDIEntryMap[DID]; -  } +  /// specified debug variable.    DIEntry *&getDIEntrySlotFor(GlobalVariable *GV) {      return GVToDIEntryMap[GV];    } @@ -1204,7 +1178,7 @@ public:    /// operator== - Used by UniqueVector to locate entry.    /// -  bool operator==(const SourceFileInfo &SI) const { +  bool operator==(const SrcFileInfo &SI) const {      return getDirectoryID() == SI.getDirectoryID() && getName() == SI.getName();    } @@ -1317,10 +1291,6 @@ private:    ///    UniqueVector<std::string> StringPool; -  /// UnitMap - Map debug information descriptor to compile unit. -  /// -  std::map<DebugInfoDesc *, CompileUnit *> DescToUnitMap; -    /// SectionMap - Provides a unique id per text section.    ///    UniqueVector<const Section*> SectionMap; @@ -1574,17 +1544,6 @@ private:    /// AddSourceLine - Add location information to specified debug information    /// entry. -  void AddSourceLine(DIE *Die, CompileUnitDesc *File, unsigned Line) { -    if (File && Line) { -      CompileUnit *FileUnit = FindCompileUnit(File); -      unsigned FileID = FileUnit->getID(); -      AddUInt(Die, DW_AT_decl_file, 0, FileID); -      AddUInt(Die, DW_AT_decl_line, 0, Line); -    } -  } - -  /// AddSourceLine - Add location information to specified debug information -  /// entry.    void AddSourceLine(DIE *Die, DIVariable *V) {      unsigned FileID = 0;      unsigned Line = V->getLineNumber(); @@ -1690,46 +1649,6 @@ private:    }    /// AddType - Add a new type attribute to the specified entity. -  /// -  void AddType(DIE *Entity, TypeDesc *TyDesc, CompileUnit *Unit) { -    if (!TyDesc) { -      AddBasicType(Entity, Unit, "", DW_ATE_signed, sizeof(int32_t)); -    } else { -      // Check for pre-existence. -      DIEntry *&Slot = Unit->getDIEntrySlotFor(TyDesc); - -      // If it exists then use the existing value. -      if (Slot) { -        Entity->AddValue(DW_AT_type, DW_FORM_ref4, Slot); -        return; -      } - -      if (SubprogramDesc *SubprogramTy = dyn_cast<SubprogramDesc>(TyDesc)) { -        // FIXME - Not sure why programs and variables are coming through here. -        // Short cut for handling subprogram types (not really a TyDesc.) -        AddPointerType(Entity, Unit, SubprogramTy->getName()); -      } else if (GlobalVariableDesc *GlobalTy = -                                         dyn_cast<GlobalVariableDesc>(TyDesc)) { -        // FIXME - Not sure why programs and variables are coming through here. -        // Short cut for handling global variable types (not really a TyDesc.) -        AddPointerType(Entity, Unit, GlobalTy->getName()); -      } else { -        // Set up proxy. -        Slot = NewDIEntry(); - -        // Construct type. -        DIE Buffer(DW_TAG_base_type); -        ConstructType(Buffer, TyDesc, Unit); - -        // Add debug information entry to entity and unit. -        DIE *Die = Unit->AddDie(Buffer); -        SetDIEntry(Slot, Die); -        Entity->AddValue(DW_AT_type, DW_FORM_ref4, Slot); -      } -    } -  } - -  /// AddType - Add a new type attribute to the specified entity.    void AddType(CompileUnit *DW_Unit, DIE *Entity, DIType Ty) {      if (Ty.isNull()) {        AddBasicType(Entity, DW_Unit, "", DW_ATE_signed, sizeof(int32_t)); @@ -2040,332 +1959,6 @@ private:      Buffer.AddChild(MemberDie);    } -  /// ConstructType - Adds all the required attributes to the type. -  /// -  void ConstructType(DIE &Buffer, TypeDesc *TyDesc, CompileUnit *Unit) { -    // Get core information. -    const std::string &Name = TyDesc->getName(); -    uint64_t Size = TyDesc->getSize() >> 3; - -    if (BasicTypeDesc *BasicTy = dyn_cast<BasicTypeDesc>(TyDesc)) { -      // Fundamental types like int, float, bool -      Buffer.setTag(DW_TAG_base_type); -      AddUInt(&Buffer, DW_AT_encoding,  DW_FORM_data1, BasicTy->getEncoding()); -    } else if (DerivedTypeDesc *DerivedTy = dyn_cast<DerivedTypeDesc>(TyDesc)) { -      // Fetch tag. -      unsigned Tag = DerivedTy->getTag(); -      // FIXME - Workaround for templates. -      if (Tag == DW_TAG_inheritance) Tag = DW_TAG_reference_type; -      // Pointers, typedefs et al. -      Buffer.setTag(Tag); -      // Map to main type, void will not have a type. -      if (TypeDesc *FromTy = DerivedTy->getFromType()) -        AddType(&Buffer, FromTy, Unit); -    } else if (CompositeTypeDesc *CompTy = dyn_cast<CompositeTypeDesc>(TyDesc)){ -      // Fetch tag. -      unsigned Tag = CompTy->getTag(); - -      // Set tag accordingly. -      if (Tag == DW_TAG_vector_type) -        Buffer.setTag(DW_TAG_array_type); -      else -        Buffer.setTag(Tag); - -      std::vector<DebugInfoDesc *> &Elements = CompTy->getElements(); - -      switch (Tag) { -      case DW_TAG_vector_type: -        AddUInt(&Buffer, DW_AT_GNU_vector, DW_FORM_flag, 1); -        // Fall thru -      case DW_TAG_array_type: { -        // Add element type. -        if (TypeDesc *FromTy = CompTy->getFromType()) -          AddType(&Buffer, FromTy, Unit); - -        // Don't emit size attribute. -        Size = 0; - -        // Construct an anonymous type for index type. -        DIE Buffer(DW_TAG_base_type); -        AddUInt(&Buffer, DW_AT_byte_size, 0, sizeof(int32_t)); -        AddUInt(&Buffer, DW_AT_encoding, DW_FORM_data1, DW_ATE_signed); -        DIE *IndexTy = Unit->AddDie(Buffer); - -        // Add subranges to array type. -        for (unsigned i = 0, N = Elements.size(); i < N; ++i) { -          SubrangeDesc *SRD = cast<SubrangeDesc>(Elements[i]); -          int64_t Lo = SRD->getLo(); -          int64_t Hi = SRD->getHi(); -          DIE *Subrange = new DIE(DW_TAG_subrange_type); - -          // If a range is available. -          if (Lo != Hi) { -            AddDIEntry(Subrange, DW_AT_type, DW_FORM_ref4, IndexTy); -            // Only add low if non-zero. -            if (Lo) AddSInt(Subrange, DW_AT_lower_bound, 0, Lo); -            AddSInt(Subrange, DW_AT_upper_bound, 0, Hi); -          } - -          Buffer.AddChild(Subrange); -        } -        break; -      } -      case DW_TAG_structure_type: -      case DW_TAG_union_type: { -        // Add elements to structure type. -        for (unsigned i = 0, N = Elements.size(); i < N; ++i) { -          DebugInfoDesc *Element = Elements[i]; - -          if (DerivedTypeDesc *MemberDesc = dyn_cast<DerivedTypeDesc>(Element)){ -            // Add field or base class. -            unsigned Tag = MemberDesc->getTag(); - -            // Extract the basic information. -            const std::string &Name = MemberDesc->getName(); -            uint64_t Size = MemberDesc->getSize(); -            uint64_t Align = MemberDesc->getAlign(); -            uint64_t Offset = MemberDesc->getOffset(); - -            // Construct member debug information entry. -            DIE *Member = new DIE(Tag); - -            // Add name if not "". -            if (!Name.empty()) -              AddString(Member, DW_AT_name, DW_FORM_string, Name); - -            // Add location if available. -            AddSourceLine(Member, MemberDesc->getFile(), MemberDesc->getLine()); - -            // Most of the time the field info is the same as the members. -            uint64_t FieldSize = Size; -            uint64_t FieldAlign = Align; -            uint64_t FieldOffset = Offset; - -            // Set the member type. -            TypeDesc *FromTy = MemberDesc->getFromType(); -            AddType(Member, FromTy, Unit); - -            // Walk up typedefs until a real size is found. -            while (FromTy) { -              if (FromTy->getTag() != DW_TAG_typedef) { -                FieldSize = FromTy->getSize(); -                FieldAlign = FromTy->getAlign(); -                break; -              } - -              FromTy = cast<DerivedTypeDesc>(FromTy)->getFromType(); -            } - -            // Unless we have a bit field. -            if (Tag == DW_TAG_member && FieldSize != Size) { -              // Construct the alignment mask. -              uint64_t AlignMask = ~(FieldAlign - 1); -              // Determine the high bit + 1 of the declared size. -              uint64_t HiMark = (Offset + FieldSize) & AlignMask; -              // Work backwards to determine the base offset of the field. -              FieldOffset = HiMark - FieldSize; -              // Now normalize offset to the field. -              Offset -= FieldOffset; - -              // Maybe we need to work from the other end. -              if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size); - -              // Add size and offset. -              AddUInt(Member, DW_AT_byte_size, 0, FieldSize >> 3); -              AddUInt(Member, DW_AT_bit_size, 0, Size); -              AddUInt(Member, DW_AT_bit_offset, 0, Offset); -            } - -            // Add computation for offset. -            DIEBlock *Block = new DIEBlock(); -            AddUInt(Block, 0, DW_FORM_data1, DW_OP_plus_uconst); -            AddUInt(Block, 0, DW_FORM_udata, FieldOffset >> 3); -            AddBlock(Member, DW_AT_data_member_location, 0, Block); - -            // Add accessibility (public default unless is base class. -            if (MemberDesc->isProtected()) { -              AddUInt(Member, DW_AT_accessibility, 0, DW_ACCESS_protected); -            } else if (MemberDesc->isPrivate()) { -              AddUInt(Member, DW_AT_accessibility, 0, DW_ACCESS_private); -            } else if (Tag == DW_TAG_inheritance) { -              AddUInt(Member, DW_AT_accessibility, 0, DW_ACCESS_public); -            } - -            Buffer.AddChild(Member); -          } else if (GlobalVariableDesc *StaticDesc = -                                        dyn_cast<GlobalVariableDesc>(Element)) { -            // Add static member. - -            // Construct member debug information entry. -            DIE *Static = new DIE(DW_TAG_variable); - -            // Add name and mangled name. -            const std::string &Name = StaticDesc->getName(); -            const std::string &LinkageName = StaticDesc->getLinkageName(); -            AddString(Static, DW_AT_name, DW_FORM_string, Name); -            if (!LinkageName.empty()) { -              AddString(Static, DW_AT_MIPS_linkage_name, DW_FORM_string, -                                LinkageName); -            } - -            // Add location. -            AddSourceLine(Static, StaticDesc->getFile(), StaticDesc->getLine()); - -            // Add type. -            if (TypeDesc *StaticTy = StaticDesc->getType()) -              AddType(Static, StaticTy, Unit); - -            // Add flags. -            if (!StaticDesc->isStatic()) -              AddUInt(Static, DW_AT_external, DW_FORM_flag, 1); -            AddUInt(Static, DW_AT_declaration, DW_FORM_flag, 1); - -            Buffer.AddChild(Static); -          } else if (SubprogramDesc *MethodDesc = -                                            dyn_cast<SubprogramDesc>(Element)) { -            // Add member function. - -            // Construct member debug information entry. -            DIE *Method = new DIE(DW_TAG_subprogram); - -            // Add name and mangled name. -            const std::string &Name = MethodDesc->getName(); -            const std::string &LinkageName = MethodDesc->getLinkageName(); - -            AddString(Method, DW_AT_name, DW_FORM_string, Name); -            bool IsCTor = TyDesc->getName() == Name; - -            if (!LinkageName.empty()) { -              AddString(Method, DW_AT_MIPS_linkage_name, DW_FORM_string, -                                LinkageName); -            } - -            // Add location. -            AddSourceLine(Method, MethodDesc->getFile(), MethodDesc->getLine()); - -            // Add type. -            if (CompositeTypeDesc *MethodTy = -                   dyn_cast_or_null<CompositeTypeDesc>(MethodDesc->getType())) { -              // Get argument information. -              std::vector<DebugInfoDesc *> &Args = MethodTy->getElements(); - -              // If not a ctor. -              if (!IsCTor) { -                // Add return type. -                AddType(Method, dyn_cast<TypeDesc>(Args[0]), Unit); -              } - -              // Add arguments. -              for (unsigned i = 1, N = Args.size(); i < N; ++i) { -                DIE *Arg = new DIE(DW_TAG_formal_parameter); -                AddType(Arg, cast<TypeDesc>(Args[i]), Unit); -                AddUInt(Arg, DW_AT_artificial, DW_FORM_flag, 1); -                Method->AddChild(Arg); -              } -            } - -            // Add flags. -            if (!MethodDesc->isStatic()) -              AddUInt(Method, DW_AT_external, DW_FORM_flag, 1); -            AddUInt(Method, DW_AT_declaration, DW_FORM_flag, 1); - -            Buffer.AddChild(Method); -          } -        } -        break; -      } -      case DW_TAG_enumeration_type: { -        // Add enumerators to enumeration type. -        for (unsigned i = 0, N = Elements.size(); i < N; ++i) { -          EnumeratorDesc *ED = cast<EnumeratorDesc>(Elements[i]); -          const std::string &Name = ED->getName(); -          int64_t Value = ED->getValue(); -          DIE *Enumerator = new DIE(DW_TAG_enumerator); -          AddString(Enumerator, DW_AT_name, DW_FORM_string, Name); -          AddSInt(Enumerator, DW_AT_const_value, DW_FORM_sdata, Value); -          Buffer.AddChild(Enumerator); -        } - -        break; -      } -      case DW_TAG_subroutine_type: { -        // Add prototype flag. -        AddUInt(&Buffer, DW_AT_prototyped, DW_FORM_flag, 1); -        // Add return type. -        AddType(&Buffer, dyn_cast<TypeDesc>(Elements[0]), Unit); - -        // Add arguments. -        for (unsigned i = 1, N = Elements.size(); i < N; ++i) { -          DIE *Arg = new DIE(DW_TAG_formal_parameter); -          AddType(Arg, cast<TypeDesc>(Elements[i]), Unit); -          Buffer.AddChild(Arg); -        } - -        break; -      } -      default: break; -      } -    } - -    // Add name if not anonymous or intermediate type. -    if (!Name.empty()) AddString(&Buffer, DW_AT_name, DW_FORM_string, Name); - -    // Add size if non-zero (derived types might be zero-sized.) -    if (Size) -      AddUInt(&Buffer, DW_AT_byte_size, 0, Size); -    else if (isa<CompositeTypeDesc>(TyDesc)) { -      // If TyDesc is a composite type, then add size even if it's zero unless -      // it's a forward declaration. -      if (TyDesc->isForwardDecl()) -        AddUInt(&Buffer, DW_AT_declaration, DW_FORM_flag, 1); -      else -        AddUInt(&Buffer, DW_AT_byte_size, 0, 0); -    } - -    // Add source line info if available and TyDesc is not a forward -    // declaration. -    if (!TyDesc->isForwardDecl()) -      AddSourceLine(&Buffer, TyDesc->getFile(), TyDesc->getLine()); -  } - -  /// NewCompileUnit - Create new compile unit and it's debug information entry. -  /// -  CompileUnit *NewCompileUnit(CompileUnitDesc *UnitDesc, unsigned ID) { -    // Construct debug information entry. -    DIE *Die = new DIE(DW_TAG_compile_unit); -    AddSectionOffset(Die, DW_AT_stmt_list, DW_FORM_data4, -              DWLabel("section_line", 0), DWLabel("section_line", 0), false); -    AddString(Die, DW_AT_producer,  DW_FORM_string, UnitDesc->getProducer()); -    AddUInt  (Die, DW_AT_language,  DW_FORM_data1,  UnitDesc->getLanguage()); -    AddString(Die, DW_AT_name,      DW_FORM_string, UnitDesc->getFileName()); -    if (!UnitDesc->getDirectory().empty()) -      AddString(Die, DW_AT_comp_dir,  DW_FORM_string, UnitDesc->getDirectory()); - -    // Construct compile unit. -    CompileUnit *Unit = new CompileUnit(UnitDesc, ID, Die); - -    // Add Unit to compile unit map. -    DescToUnitMap[UnitDesc] = Unit; - -    return Unit; -  } - -  /// GetBaseCompileUnit - Get the main compile unit. -  /// -  CompileUnit *GetBaseCompileUnit() const { -    CompileUnit *Unit = CompileUnits[0]; -    assert(Unit && "Missing compile unit."); -    return Unit; -  } - -  /// FindCompileUnit - Get the compile unit for the given descriptor. -  /// -  CompileUnit *FindCompileUnit(CompileUnitDesc *UnitDesc) { -    CompileUnit *Unit = DescToUnitMap[UnitDesc]; -    assert(Unit && "Missing compile unit."); -    return Unit; -  } -    /// FindCompileUnit - Get the compile unit for the given descriptor.                        ///                                                                                         CompileUnit *FindCompileUnit(DICompileUnit Unit) { @@ -2374,136 +1967,7 @@ private:      return DW_Unit;    } -  /// NewGlobalVariable - Add a new global variable DIE. -  /// -  DIE *NewGlobalVariable(GlobalVariableDesc *GVD) { -    // Get the compile unit context. -    CompileUnitDesc *UnitDesc = -      static_cast<CompileUnitDesc *>(GVD->getContext()); -    CompileUnit *Unit = GetBaseCompileUnit(); - -    // Check for pre-existence. -    DIE *&Slot = Unit->getDieMapSlotFor(GVD); -    if (Slot) return Slot; - -    // Get the global variable itself. -    GlobalVariable *GV = GVD->getGlobalVariable(); - -    const std::string &Name = GVD->getName(); -    const std::string &FullName = GVD->getFullName(); -    const std::string &LinkageName = GVD->getLinkageName(); -    // Create the global's variable DIE. -    DIE *VariableDie = new DIE(DW_TAG_variable); -    AddString(VariableDie, DW_AT_name, DW_FORM_string, Name); -    if (!LinkageName.empty()) { -      AddString(VariableDie, DW_AT_MIPS_linkage_name, DW_FORM_string, -                             LinkageName); -    } -    AddType(VariableDie, GVD->getType(), Unit); -    if (!GVD->isStatic()) -      AddUInt(VariableDie, DW_AT_external, DW_FORM_flag, 1); - -    // Add source line info if available. -    AddSourceLine(VariableDie, UnitDesc, GVD->getLine()); - -    // Add address. -    DIEBlock *Block = new DIEBlock(); -    AddUInt(Block, 0, DW_FORM_data1, DW_OP_addr); -    AddObjectLabel(Block, 0, DW_FORM_udata, Asm->getGlobalLinkName(GV)); -    AddBlock(VariableDie, DW_AT_location, 0, Block); - -    // Add to map. -    Slot = VariableDie; - -    // Add to context owner. -    Unit->getDie()->AddChild(VariableDie); - -    // Expose as global. -    // FIXME - need to check external flag. -    Unit->AddGlobal(FullName, VariableDie); - -    return VariableDie; -  } - -  /// NewSubprogram - Add a new subprogram DIE. -  /// -  DIE *NewSubprogram(SubprogramDesc *SPD) { -    // Get the compile unit context. -    CompileUnitDesc *UnitDesc = -      static_cast<CompileUnitDesc *>(SPD->getContext()); -    CompileUnit *Unit = GetBaseCompileUnit(); - -    // Check for pre-existence. -    DIE *&Slot = Unit->getDieMapSlotFor(SPD); -    if (Slot) return Slot; - -    // Gather the details (simplify add attribute code.) -    const std::string &Name = SPD->getName(); -    const std::string &FullName = SPD->getFullName(); -    const std::string &LinkageName = SPD->getLinkageName(); - -    DIE *SubprogramDie = new DIE(DW_TAG_subprogram); -    AddString(SubprogramDie, DW_AT_name, DW_FORM_string, Name); -    if (!LinkageName.empty()) { -      AddString(SubprogramDie, DW_AT_MIPS_linkage_name, DW_FORM_string, -                               LinkageName); -    } -    if (SPD->getType()) AddType(SubprogramDie, SPD->getType(), Unit); -    if (!SPD->isStatic()) -      AddUInt(SubprogramDie, DW_AT_external, DW_FORM_flag, 1); -    AddUInt(SubprogramDie, DW_AT_prototyped, DW_FORM_flag, 1); - -    // Add source line info if available. -    AddSourceLine(SubprogramDie, UnitDesc, SPD->getLine()); - -    // Add to map. -    Slot = SubprogramDie; - -    // Add to context owner. -    Unit->getDie()->AddChild(SubprogramDie); - -    // Expose as global. -    Unit->AddGlobal(FullName, SubprogramDie); - -    return SubprogramDie; -  } - -  /// NewScopeVariable - Create a new scope variable. -  /// -  DIE *NewScopeVariable(DebugVariable *DV, CompileUnit *Unit) { -    // Get the descriptor. -    VariableDesc *VD = DV->getDesc(); - -    // Translate tag to proper Dwarf tag.  The result variable is dropped for -    // now. -    unsigned Tag; -    switch (VD->getTag()) { -    case DW_TAG_return_variable:  return NULL; -    case DW_TAG_arg_variable:     Tag = DW_TAG_formal_parameter; break; -    case DW_TAG_auto_variable:    // fall thru -    default:                      Tag = DW_TAG_variable; break; -    } - -    // Define variable debug information entry. -    DIE *VariableDie = new DIE(Tag); -    AddString(VariableDie, DW_AT_name, DW_FORM_string, VD->getName()); - -    // Add source line info if available. -    AddSourceLine(VariableDie, VD->getFile(), VD->getLine()); - -    // Add variable type. -    AddType(VariableDie, VD->getType(), Unit); - -    // Add variable address. -    MachineLocation Location; -    Location.set(RI->getFrameRegister(*MF), -                 RI->getFrameIndexOffset(*MF, DV->getFrameIndex())); -    AddAddress(VariableDie, DW_AT_location, Location); - -    return VariableDie; -  } - -  /// NewScopeVariable - Create a new scope variable. +  /// NewDbgScopeVariable - Create a new scope variable.    ///    DIE *NewDbgScopeVariable(DbgVariable *DV, CompileUnit *Unit) {      // Get the descriptor. @@ -2688,125 +2152,6 @@ private:  #endif    } -  /// ConstructScope - Construct the components of a scope. -  /// -  void ConstructScope(DebugScope *ParentScope, -                      unsigned ParentStartID, unsigned ParentEndID, -                      DIE *ParentDie, CompileUnit *Unit) { -    // Add variables to scope. -    std::vector<DebugVariable *> &Variables = ParentScope->getVariables(); -    for (unsigned i = 0, N = Variables.size(); i < N; ++i) { -      DIE *VariableDie = NewScopeVariable(Variables[i], Unit); -      if (VariableDie) ParentDie->AddChild(VariableDie); -    } - -    // Add nested scopes. -    std::vector<DebugScope *> &Scopes = ParentScope->getScopes(); -    for (unsigned j = 0, M = Scopes.size(); j < M; ++j) { -      // Define the Scope debug information entry. -      DebugScope *Scope = Scopes[j]; -      // FIXME - Ignore inlined functions for the time being. -      if (!Scope->getParent()) continue; - -      unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID()); -      unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID()); - -      // Ignore empty scopes. -      if (StartID == EndID && StartID != 0) continue; -      if (Scope->getScopes().empty() && Scope->getVariables().empty()) continue; - -      if (StartID == ParentStartID && EndID == ParentEndID) { -        // Just add stuff to the parent scope. -        ConstructScope(Scope, ParentStartID, ParentEndID, ParentDie, Unit); -      } else { -        DIE *ScopeDie = new DIE(DW_TAG_lexical_block); - -        // Add the scope bounds. -        if (StartID) { -          AddLabel(ScopeDie, DW_AT_low_pc, DW_FORM_addr, -                             DWLabel("label", StartID)); -        } else { -          AddLabel(ScopeDie, DW_AT_low_pc, DW_FORM_addr, -                             DWLabel("func_begin", SubprogramCount)); -        } -        if (EndID) { -          AddLabel(ScopeDie, DW_AT_high_pc, DW_FORM_addr, -                             DWLabel("label", EndID)); -        } else { -          AddLabel(ScopeDie, DW_AT_high_pc, DW_FORM_addr, -                             DWLabel("func_end", SubprogramCount)); -        } - -        // Add the scope contents. -        ConstructScope(Scope, StartID, EndID, ScopeDie, Unit); -        ParentDie->AddChild(ScopeDie); -      } -    } -  } - -  /// ConstructRootScope - Construct the scope for the subprogram. -  /// -  void ConstructRootScope(DebugScope *RootScope) { -    // Exit if there is no root scope. -    if (!RootScope) return; - -    // Get the subprogram debug information entry. -    SubprogramDesc *SPD = cast<SubprogramDesc>(RootScope->getDesc()); - -    // Get the compile unit context. -    CompileUnit *Unit = GetBaseCompileUnit(); - -    // Get the subprogram die. -    DIE *SPDie = Unit->getDieMapSlotFor(SPD); -    assert(SPDie && "Missing subprogram descriptor"); - -    // Add the function bounds. -    AddLabel(SPDie, DW_AT_low_pc, DW_FORM_addr, -                    DWLabel("func_begin", SubprogramCount)); -    AddLabel(SPDie, DW_AT_high_pc, DW_FORM_addr, -                    DWLabel("func_end", SubprogramCount)); -    MachineLocation Location(RI->getFrameRegister(*MF)); -    AddAddress(SPDie, DW_AT_frame_base, Location); - -    ConstructScope(RootScope, 0, 0, SPDie, Unit); -  } - -  /// ConstructDefaultScope - Construct a default scope for the subprogram. -  /// -  void ConstructDefaultScope(MachineFunction *MF) { -    // Find the correct subprogram descriptor. -    std::vector<SubprogramDesc *> Subprograms; -    MMI->getAnchoredDescriptors<SubprogramDesc>(*M, Subprograms); - -    for (unsigned i = 0, N = Subprograms.size(); i < N; ++i) { -      SubprogramDesc *SPD = Subprograms[i]; - -      if (SPD->getName() == MF->getFunction()->getName()) { -        // Get the compile unit context. -        CompileUnit *Unit = GetBaseCompileUnit(); - -        // Get the subprogram die. -        DIE *SPDie = Unit->getDieMapSlotFor(SPD); -        assert(SPDie && "Missing subprogram descriptor"); - -        // Add the function bounds. -        AddLabel(SPDie, DW_AT_low_pc, DW_FORM_addr, -                 DWLabel("func_begin", SubprogramCount)); -        AddLabel(SPDie, DW_AT_high_pc, DW_FORM_addr, -                 DWLabel("func_end", SubprogramCount)); - -        MachineLocation Location(RI->getFrameRegister(*MF)); -        AddAddress(SPDie, DW_AT_frame_base, Location); -        return; -      } -    } -#if 0 -    // FIXME: This is causing an abort because C++ mangled names are compared -    // with their unmangled counterparts. See PR2885. Don't do this assert. -    assert(0 && "Couldn't find DIE for machine function!"); -#endif -  } -    /// EmitInitial - Emit initial Dwarf declarations.  This is necessary for cc    /// tools to recognize the object file contains Dwarf information.    void EmitInitial() { @@ -3443,18 +2788,6 @@ private:      }    } -  /// ConstructCompileUnitDIEs - Create a compile unit DIE for each source and -  /// header file. -  void ConstructCompileUnitDIEs() { -    const UniqueVector<CompileUnitDesc *> CUW = MMI->getCompileUnits(); - -    for (unsigned i = 1, N = CUW.size(); i <= N; ++i) { -      unsigned ID = MMI->RecordSource(CUW[i]); -      CompileUnit *Unit = NewCompileUnit(CUW[i], ID); -      CompileUnits.push_back(Unit); -    } -  } -    /// ConstructGlobalVariableDIEs - Create DIEs for each of the externally     /// visible global variables.    void ConstructGlobalVariableDIEs() { @@ -3502,18 +2835,6 @@ private:      }    } -  /// ConstructGlobalDIEs - Create DIEs for each of the externally visible -  /// global variables. -  void ConstructGlobalDIEs() { -    std::vector<GlobalVariableDesc *> GlobalVariables; -    MMI->getAnchoredDescriptors<GlobalVariableDesc>(*M, GlobalVariables); - -    for (unsigned i = 0, N = GlobalVariables.size(); i < N; ++i) { -      GlobalVariableDesc *GVD = GlobalVariables[i]; -      NewGlobalVariable(GVD); -    } -  } -    /// ConstructSubprograms - Create DIEs for each of the externally visible    /// subprograms.    void ConstructSubprograms() { @@ -3553,18 +2874,6 @@ private:      }    } -  /// ConstructSubprogramDIEs - Create DIEs for each of the externally visible -  /// subprograms. -  void ConstructSubprogramDIEs() { -    std::vector<SubprogramDesc *> Subprograms; -    MMI->getAnchoredDescriptors<SubprogramDesc>(*M, Subprograms); - -    for (unsigned i = 0, N = Subprograms.size(); i < N; ++i) { -      SubprogramDesc *SPD = Subprograms[i]; -      NewSubprogram(SPD); -    } -  } -  public:    //===--------------------------------------------------------------------===//    // Main entry points. @@ -3577,7 +2886,6 @@ public:    , ValuesSet(InitValuesSetSize)    , Values()    , StringPool() -  , DescToUnitMap()    , SectionMap()    , SectionSourceLines()    , didInitial(false) @@ -3632,47 +2940,6 @@ public:        EmitInitial();    } -  /// SetModuleInfo - Set machine module information when it's known that pass -  /// manager has created it.  Set by the target AsmPrinter. -  void SetModuleInfo(MachineModuleInfo *mmi) { -    assert (0 && "Who is this?"); -    // Make sure initial declarations are made. -    if (!MMI && mmi->hasDebugInfo()) { -      MMI = mmi; -      shouldEmit = true; - -      // Create all the compile unit DIEs. -      ConstructCompileUnitDIEs(); - -      // Create DIEs for each of the externally visible global variables. -      ConstructGlobalDIEs(); - -      // Create DIEs for each of the externally visible subprograms. -      ConstructSubprogramDIEs(); - -      // Prime section data. -      SectionMap.insert(TAI->getTextSection()); - -      // Print out .file directives to specify files for .loc directives. These -      // are printed out early so that they precede any .loc directives. -      if (TAI->hasDotLocAndDotFile()) { -        const UniqueVector<SourceFileInfo> &SourceFiles = MMI->getSourceFiles(); -        const UniqueVector<std::string> &Directories = MMI->getDirectories(); -        for (unsigned i = 1, e = SourceFiles.size(); i <= e; ++i) { -          sys::Path FullPath(Directories[SourceFiles[i].getDirectoryID()]); -          bool AppendOk = FullPath.appendComponent(SourceFiles[i].getName()); -          assert(AppendOk && "Could not append filename to directory!"); -          AppendOk = false; -          Asm->EmitFile(i, FullPath.toString()); -          Asm->EOL(); -        } -      } - -      // Emit initial sections -      EmitInitial(); -    } -  } -    /// BeginModule - Emit all Dwarf sections that should come prior to the    /// content.    void BeginModule(Module *M) { @@ -4991,3 +4258,4 @@ unsigned DwarfWriter::getRecordSourceLineCount() {  void DwarfWriter::RecordVariable(GlobalVariable *GV, unsigned FrameIndex) {    DD->RecordVariable(GV, FrameIndex);  } + diff --git a/llvm/lib/CodeGen/MachineModuleInfo.cpp b/llvm/lib/CodeGen/MachineModuleInfo.cpp index 5fe59d4e5a7..724c113b79b 100644 --- a/llvm/lib/CodeGen/MachineModuleInfo.cpp +++ b/llvm/lib/CodeGen/MachineModuleInfo.cpp @@ -33,1598 +33,11 @@ X("machinemoduleinfo", "Module Information");  char MachineModuleInfo::ID = 0;  //===----------------------------------------------------------------------===// - -/// getGlobalVariablesUsing - Return all of the GlobalVariables which have the -/// specified value in their initializer somewhere. -static void -getGlobalVariablesUsing(Value *V, std::vector<GlobalVariable*> &Result) { -  // Scan though value users. -  for (Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I) { -    if (GlobalVariable *GV = dyn_cast<GlobalVariable>(*I)) { -      // If the user is a GlobalVariable then add to result. -      Result.push_back(GV); -    } else if (Constant *C = dyn_cast<Constant>(*I)) { -      // If the user is a constant variable then scan its users -      getGlobalVariablesUsing(C, Result); -    } -  } -} - -/// getGlobalVariablesUsing - Return all of the GlobalVariables that use the -/// named GlobalVariable. -static void -getGlobalVariablesUsing(Module &M, const std::string &RootName, -                        std::vector<GlobalVariable*> &Result) { -  std::vector<const Type*> FieldTypes; -  FieldTypes.push_back(Type::Int32Ty); -  FieldTypes.push_back(Type::Int32Ty); - -  // Get the GlobalVariable root. -  GlobalVariable *UseRoot = M.getGlobalVariable(RootName, -                                                StructType::get(FieldTypes)); - -  // If present and linkonce then scan for users. -  if (UseRoot && UseRoot->hasLinkOnceLinkage()) -    getGlobalVariablesUsing(UseRoot, Result); -} -   -/// isStringValue - Return true if the given value can be coerced to a string. -/// -static bool isStringValue(Value *V) { -  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V)) { -    if (GV->hasInitializer() && isa<ConstantArray>(GV->getInitializer())) { -      ConstantArray *Init = cast<ConstantArray>(GV->getInitializer()); -      return Init->isString(); -    } -  } else if (Constant *C = dyn_cast<Constant>(V)) { -    if (GlobalValue *GV = dyn_cast<GlobalValue>(C)) -      return isStringValue(GV); -    else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) { -      if (CE->getOpcode() == Instruction::GetElementPtr) { -        if (CE->getNumOperands() == 3 && -            cast<Constant>(CE->getOperand(1))->isNullValue() && -            isa<ConstantInt>(CE->getOperand(2))) { -          return isStringValue(CE->getOperand(0)); -        } -      } -    } -  } -  return false; -} - -/// getGlobalVariable - Return either a direct or cast Global value. -/// -static GlobalVariable *getGlobalVariable(Value *V) { -  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V)) { -    return GV; -  } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { -    if (CE->getOpcode() == Instruction::BitCast) { -      return dyn_cast<GlobalVariable>(CE->getOperand(0)); -    } else if (CE->getOpcode() == Instruction::GetElementPtr) { -      for (unsigned int i=1; i<CE->getNumOperands(); i++) { -        if (!CE->getOperand(i)->isNullValue()) -          return NULL; -      } -      return dyn_cast<GlobalVariable>(CE->getOperand(0)); -    } -  } -  return NULL; -} - -/// isGlobalVariable - Return true if the given value can be coerced to a -/// GlobalVariable. -static bool isGlobalVariable(Value *V) { -  if (isa<GlobalVariable>(V) || isa<ConstantPointerNull>(V)) { -    return true; -  } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { -    if (CE->getOpcode() == Instruction::BitCast) { -      return isa<GlobalVariable>(CE->getOperand(0)); -    } else if (CE->getOpcode() == Instruction::GetElementPtr) { -      for (unsigned int i=1; i<CE->getNumOperands(); i++) { -        if (!CE->getOperand(i)->isNullValue()) -          return false; -      } -      return isa<GlobalVariable>(CE->getOperand(0)); -    } -  } -  return false; -} - -/// getUIntOperand - Return ith operand if it is an unsigned integer. -/// -static ConstantInt *getUIntOperand(GlobalVariable *GV, unsigned i) { -  // Make sure the GlobalVariable has an initializer. -  if (!GV->hasInitializer()) return NULL; -   -  // Get the initializer constant. -  ConstantStruct *CI = dyn_cast<ConstantStruct>(GV->getInitializer()); -  if (!CI) return NULL; -   -  // Check if there is at least i + 1 operands. -  unsigned N = CI->getNumOperands(); -  if (i >= N) return NULL; - -  // Check constant. -  return dyn_cast<ConstantInt>(CI->getOperand(i)); -} - -//===----------------------------------------------------------------------===// - -static unsigned CountFields(DebugInfoDesc *DD) { -  unsigned Count = 0; - -  switch (DD->getTag()) { -  case DW_TAG_anchor:           // AnchorDesc -    // Tag -    // AnchorTag -    Count = 2; -    break; -  case DW_TAG_compile_unit:     // CompileUnitDesc -    // [DW_TAG_anchor] -    // if (Version == 0) DebugVersion -    // Language -    // FileName -    // Directory -    // Producer -    Count = 6; -   -    // Handle cases out of sync with compiler. -    if (DD->getVersion() == 0) -      ++Count; - -    break; -  case DW_TAG_variable:         // GlobalVariableDesc -    // [DW_TAG_anchor] -    // Context -    // Name -    // FullName -    // LinkageName -    // File -    // Line -    // TyDesc -    // IsStatic -    // IsDefinition -    // Global -    Count = 12; -    break; -  case DW_TAG_subprogram:       // SubprogramDesc -    // [DW_TAG_anchor] -    // Context -    // Name -    // FullName -    // LinkageName -    // File -    // Line -    // TyDesc -    // IsStatic -    // IsDefinition -    Count = 11; -    break; -  case DW_TAG_lexical_block:    // BlockDesc -    // Tag -    // Context -    Count = 2; -    break; -  case DW_TAG_base_type:        // BasicTypeDesc -    // Tag -    // Context -    // Name -    // File -    // Line -    // Size -    // Align -    // Offset -    // if (Version > LLVMDebugVersion4) Flags -    // Encoding -    Count = 9; - -    if (DD->getVersion() > LLVMDebugVersion4) -      ++Count; - -    break; -  case DW_TAG_typedef: -  case DW_TAG_pointer_type:         -  case DW_TAG_reference_type: -  case DW_TAG_const_type: -  case DW_TAG_volatile_type:         -  case DW_TAG_restrict_type: -  case DW_TAG_member: -  case DW_TAG_inheritance:      // DerivedTypeDesc -    // Tag -    // Context -    // Name -    // File -    // Line -    // Size -    // Align -    // Offset -    // if (Version > LLVMDebugVersion4) Flags -    // FromType -    Count = 9; - -    if (DD->getVersion() > LLVMDebugVersion4) -      ++Count; - -    break; -  case DW_TAG_array_type: -  case DW_TAG_structure_type: -  case DW_TAG_union_type: -  case DW_TAG_enumeration_type: -  case DW_TAG_vector_type: -  case DW_TAG_subroutine_type:  // CompositeTypeDesc -    // Tag -    // Context -    // Name -    // File -    // Line -    // Size -    // Align -    // Offset -    // if (Version > LLVMDebugVersion4) Flags -    // FromType -    // Elements -    Count = 10; - -    if (DD->getVersion() > LLVMDebugVersion4) -      ++Count; - -    break; -  case DW_TAG_subrange_type:    // SubrangeDesc -    // Tag -    // Lo -    // Hi -    Count = 3; -    break; -  case DW_TAG_enumerator:       // EnumeratorDesc -    // Tag -    // Name -    // Value -    Count = 3; -    break; -  case DW_TAG_return_variable: -  case DW_TAG_arg_variable: -  case DW_TAG_auto_variable:    // VariableDesc -    // Tag -    // Context -    // Name -    // File -    // Line -    // TyDesc -    Count = 6; -    break; -  default: -    break; -  } - -  return Count; -} - -//===----------------------------------------------------------------------===// - -/// ApplyToFields - Target the visitor to each field of the debug information -/// descriptor. -void DIVisitor::ApplyToFields(DebugInfoDesc *DD) { -  DD->ApplyToFields(this); -} - -namespace { - -//===----------------------------------------------------------------------===// -/// DIDeserializeVisitor - This DIVisitor deserializes all the fields in the -/// supplied DebugInfoDesc. -class DIDeserializeVisitor : public DIVisitor { -private: -  DIDeserializer &DR;                   // Active deserializer. -  unsigned I;                           // Current operand index. -  ConstantStruct *CI;                   // GlobalVariable constant initializer. - -public: -  DIDeserializeVisitor(DIDeserializer &D, GlobalVariable *GV) -    : DIVisitor(), DR(D), I(0), CI(cast<ConstantStruct>(GV->getInitializer())) -  {} -   -  /// Apply - Set the value of each of the fields. -  /// -  virtual void Apply(int &Field) { -    Constant *C = CI->getOperand(I++); -    Field = cast<ConstantInt>(C)->getSExtValue(); -  } -  virtual void Apply(unsigned &Field) { -    Constant *C = CI->getOperand(I++); -    Field = cast<ConstantInt>(C)->getZExtValue(); -  } -  virtual void Apply(int64_t &Field) { -    Constant *C = CI->getOperand(I++); -    Field = cast<ConstantInt>(C)->getSExtValue(); -  } -  virtual void Apply(uint64_t &Field) { -    Constant *C = CI->getOperand(I++); -    Field = cast<ConstantInt>(C)->getZExtValue(); -  } -  virtual void Apply(bool &Field) { -    Constant *C = CI->getOperand(I++); -    Field = cast<ConstantInt>(C)->getZExtValue(); -  } -  virtual void Apply(std::string &Field) { -    Constant *C = CI->getOperand(I++); -    // Fills in the string if it succeeds -    if (!GetConstantStringInfo(C, Field)) -      Field.clear(); -  } -  virtual void Apply(DebugInfoDesc *&Field) { -    Constant *C = CI->getOperand(I++); -    Field = DR.Deserialize(C); -  } -  virtual void Apply(GlobalVariable *&Field) { -    Constant *C = CI->getOperand(I++); -    Field = getGlobalVariable(C); -  } -  virtual void Apply(std::vector<DebugInfoDesc *> &Field) { -    Field.resize(0); -    Constant *C = CI->getOperand(I++); -    GlobalVariable *GV = getGlobalVariable(C); -    if (GV && GV->hasInitializer()) { -      if (ConstantArray *CA = dyn_cast<ConstantArray>(GV->getInitializer())) { -        for (unsigned i = 0, N = CA->getNumOperands(); i < N; ++i) { -          GlobalVariable *GVE = getGlobalVariable(CA->getOperand(i)); -          DebugInfoDesc *DE = DR.Deserialize(GVE); -          Field.push_back(DE); -        } -      } else if (GV->getInitializer()->isNullValue()) { -        if (const ArrayType *T = -            dyn_cast<ArrayType>(GV->getType()->getElementType())) { -          Field.resize(T->getNumElements()); -        } -      } -    } -  } -}; - -//===----------------------------------------------------------------------===// -/// DISerializeVisitor - This DIVisitor serializes all the fields in -/// the supplied DebugInfoDesc. -class DISerializeVisitor : public DIVisitor { -private: -  DISerializer &SR;                     // Active serializer. -  std::vector<Constant*> &Elements;     // Element accumulator. -   -public: -  DISerializeVisitor(DISerializer &S, std::vector<Constant*> &E) -  : DIVisitor() -  , SR(S) -  , Elements(E) -  {} -   -  /// Apply - Set the value of each of the fields. -  /// -  virtual void Apply(int &Field) { -    Elements.push_back(ConstantInt::get(Type::Int32Ty, int32_t(Field))); -  } -  virtual void Apply(unsigned &Field) { -    Elements.push_back(ConstantInt::get(Type::Int32Ty, uint32_t(Field))); -  } -  virtual void Apply(int64_t &Field) { -    Elements.push_back(ConstantInt::get(Type::Int64Ty, int64_t(Field))); -  } -  virtual void Apply(uint64_t &Field) { -    Elements.push_back(ConstantInt::get(Type::Int64Ty, uint64_t(Field))); -  } -  virtual void Apply(bool &Field) { -    Elements.push_back(ConstantInt::get(Type::Int1Ty, Field)); -  } -  virtual void Apply(std::string &Field) { -    Elements.push_back(SR.getString(Field)); -  } -  virtual void Apply(DebugInfoDesc *&Field) { -    GlobalVariable *GV = NULL; -     -    // If non-NULL then convert to global. -    if (Field) GV = SR.Serialize(Field); -     -    // FIXME - At some point should use specific type. -    const PointerType *EmptyTy = SR.getEmptyStructPtrType(); -     -    if (GV) { -      // Set to pointer to global. -      Elements.push_back(ConstantExpr::getBitCast(GV, EmptyTy)); -    } else { -      // Use NULL. -      Elements.push_back(ConstantPointerNull::get(EmptyTy)); -    } -  } -  virtual void Apply(GlobalVariable *&Field) { -    const PointerType *EmptyTy = SR.getEmptyStructPtrType(); -    if (Field) { -      Elements.push_back(ConstantExpr::getBitCast(Field, EmptyTy)); -    } else { -      Elements.push_back(ConstantPointerNull::get(EmptyTy)); -    } -  } -  virtual void Apply(std::vector<DebugInfoDesc *> &Field) { -    const PointerType *EmptyTy = SR.getEmptyStructPtrType(); -    unsigned N = Field.size(); -    ArrayType *AT = ArrayType::get(EmptyTy, N); -    std::vector<Constant *> ArrayElements; - -    for (unsigned i = 0, N = Field.size(); i < N; ++i) { -      if (DebugInfoDesc *Element = Field[i]) { -        GlobalVariable *GVE = SR.Serialize(Element); -        Constant *CE = ConstantExpr::getBitCast(GVE, EmptyTy); -        ArrayElements.push_back(cast<Constant>(CE)); -      } else { -        ArrayElements.push_back(ConstantPointerNull::get(EmptyTy)); -      } -    } -     -    Constant *CA = ConstantArray::get(AT, ArrayElements); -    GlobalVariable *CAGV = new GlobalVariable(AT, true, -                                              GlobalValue::InternalLinkage, -                                              CA, "llvm.dbg.array", -                                              SR.getModule()); -    CAGV->setSection("llvm.metadata"); -    Constant *CAE = ConstantExpr::getBitCast(CAGV, EmptyTy); -    Elements.push_back(CAE); -  } -}; - -//===----------------------------------------------------------------------===// -/// DIGetTypesVisitor - This DIVisitor gathers all the field types in -/// the supplied DebugInfoDesc. -class DIGetTypesVisitor : public DIVisitor { -private: -  DISerializer &SR;                     // Active serializer. -  std::vector<const Type*> &Fields;     // Type accumulator. -   -public: -  DIGetTypesVisitor(DISerializer &S, std::vector<const Type*> &F) -  : DIVisitor() -  , SR(S) -  , Fields(F) -  {} -   -  /// Apply - Set the value of each of the fields. -  /// -  virtual void Apply(int &Field) { -    Fields.push_back(Type::Int32Ty); -  } -  virtual void Apply(unsigned &Field) { -    Fields.push_back(Type::Int32Ty); -  } -  virtual void Apply(int64_t &Field) { -    Fields.push_back(Type::Int64Ty); -  } -  virtual void Apply(uint64_t &Field) { -    Fields.push_back(Type::Int64Ty); -  } -  virtual void Apply(bool &Field) { -    Fields.push_back(Type::Int1Ty); -  } -  virtual void Apply(std::string &Field) { -    Fields.push_back(SR.getStrPtrType()); -  } -  virtual void Apply(DebugInfoDesc *&Field) { -    // FIXME - At some point should use specific type. -    const PointerType *EmptyTy = SR.getEmptyStructPtrType(); -    Fields.push_back(EmptyTy); -  } -  virtual void Apply(GlobalVariable *&Field) { -    const PointerType *EmptyTy = SR.getEmptyStructPtrType(); -    Fields.push_back(EmptyTy); -  } -  virtual void Apply(std::vector<DebugInfoDesc *> &Field) { -    const PointerType *EmptyTy = SR.getEmptyStructPtrType(); -    Fields.push_back(EmptyTy); -  } -}; - -//===----------------------------------------------------------------------===// -/// DIVerifyVisitor - This DIVisitor verifies all the field types against -/// a constant initializer. -class DIVerifyVisitor : public DIVisitor { -private: -  DIVerifier &VR;                       // Active verifier. -  bool IsValid;                         // Validity status. -  unsigned I;                           // Current operand index. -  ConstantStruct *CI;                   // GlobalVariable constant initializer. -   -public: -  DIVerifyVisitor(DIVerifier &V, GlobalVariable *GV) -  : DIVisitor() -  , VR(V) -  , IsValid(true) -  , I(0) -  , CI(cast<ConstantStruct>(GV->getInitializer())) -  { -  } -   -  // Accessors. -  bool isValid() const { return IsValid; } -   -  /// Apply - Set the value of each of the fields. -  /// -  virtual void Apply(int &Field) { -    Constant *C = CI->getOperand(I++); -    IsValid = IsValid && isa<ConstantInt>(C); -  } -  virtual void Apply(unsigned &Field) { -    Constant *C = CI->getOperand(I++); -    IsValid = IsValid && isa<ConstantInt>(C); -  } -  virtual void Apply(int64_t &Field) { -    Constant *C = CI->getOperand(I++); -    IsValid = IsValid && isa<ConstantInt>(C); -  } -  virtual void Apply(uint64_t &Field) { -    Constant *C = CI->getOperand(I++); -    IsValid = IsValid && isa<ConstantInt>(C); -  } -  virtual void Apply(bool &Field) { -    Constant *C = CI->getOperand(I++); -    IsValid = IsValid && isa<ConstantInt>(C) && C->getType() == Type::Int1Ty; -  } -  virtual void Apply(std::string &Field) { -    Constant *C = CI->getOperand(I++); -    IsValid = IsValid && -              (!C || isStringValue(C) || C->isNullValue()); -  } -  virtual void Apply(DebugInfoDesc *&Field) { -    // FIXME - Prepare the correct descriptor. -    Constant *C = CI->getOperand(I++); -    IsValid = IsValid && isGlobalVariable(C); -  } -  virtual void Apply(GlobalVariable *&Field) { -    Constant *C = CI->getOperand(I++); -    IsValid = IsValid && isGlobalVariable(C); -  } -  virtual void Apply(std::vector<DebugInfoDesc *> &Field) { -    Constant *C = CI->getOperand(I++); -    IsValid = IsValid && isGlobalVariable(C); -    if (!IsValid) return; - -    GlobalVariable *GV = getGlobalVariable(C); -    IsValid = IsValid && GV && GV->hasInitializer(); -    if (!IsValid) return; -     -    ConstantArray *CA = dyn_cast<ConstantArray>(GV->getInitializer()); -    IsValid = IsValid && CA; -    if (!IsValid) return; - -    for (unsigned i = 0, N = CA->getNumOperands(); IsValid && i < N; ++i) { -      IsValid = IsValid && isGlobalVariable(CA->getOperand(i)); -      if (!IsValid) return; -     -      GlobalVariable *GVE = getGlobalVariable(CA->getOperand(i)); -      VR.Verify(GVE); -    } -  } -}; - -} - -//===----------------------------------------------------------------------===// - -/// TagFromGlobal - Returns the tag number from a debug info descriptor -/// GlobalVariable.   Return DIIValid if operand is not an unsigned int.  -unsigned DebugInfoDesc::TagFromGlobal(GlobalVariable *GV) { -  ConstantInt *C = getUIntOperand(GV, 0); -  return C ? ((unsigned)C->getZExtValue() & ~LLVMDebugVersionMask) : -             (unsigned)DW_TAG_invalid; -} - -/// VersionFromGlobal - Returns the version number from a debug info -/// descriptor GlobalVariable.  Return DIIValid if operand is not an unsigned -/// int. -unsigned  DebugInfoDesc::VersionFromGlobal(GlobalVariable *GV) { -  ConstantInt *C = getUIntOperand(GV, 0); -  return C ? ((unsigned)C->getZExtValue() & LLVMDebugVersionMask) : -             (unsigned)DW_TAG_invalid; -} - -/// DescFactory - Create an instance of debug info descriptor based on Tag. -/// Return NULL if not a recognized Tag. -DebugInfoDesc *DebugInfoDesc::DescFactory(unsigned Tag) { -  switch (Tag) { -  case DW_TAG_anchor:           return new AnchorDesc(); -  case DW_TAG_compile_unit:     return new CompileUnitDesc(); -  case DW_TAG_variable:         return new GlobalVariableDesc(); -  case DW_TAG_subprogram:       return new SubprogramDesc(); -  case DW_TAG_lexical_block:    return new BlockDesc(); -  case DW_TAG_base_type:        return new BasicTypeDesc(); -  case DW_TAG_typedef: -  case DW_TAG_pointer_type:         -  case DW_TAG_reference_type: -  case DW_TAG_const_type: -  case DW_TAG_volatile_type:         -  case DW_TAG_restrict_type: -  case DW_TAG_member: -  case DW_TAG_inheritance:      return new DerivedTypeDesc(Tag); -  case DW_TAG_array_type: -  case DW_TAG_structure_type: -  case DW_TAG_union_type: -  case DW_TAG_enumeration_type: -  case DW_TAG_vector_type: -  case DW_TAG_subroutine_type:  return new CompositeTypeDesc(Tag); -  case DW_TAG_subrange_type:    return new SubrangeDesc(); -  case DW_TAG_enumerator:       return new EnumeratorDesc(); -  case DW_TAG_return_variable: -  case DW_TAG_arg_variable: -  case DW_TAG_auto_variable:    return new VariableDesc(Tag); -  default: break; -  } -  return NULL; -} - -/// getLinkage - get linkage appropriate for this type of descriptor. -/// -GlobalValue::LinkageTypes DebugInfoDesc::getLinkage() const { -  return GlobalValue::InternalLinkage; -} - -/// ApplyToFields - Target the vistor to the fields of the descriptor. -/// -void DebugInfoDesc::ApplyToFields(DIVisitor *Visitor) { -  Visitor->Apply(Tag); -} - -//===----------------------------------------------------------------------===// - -AnchorDesc::AnchorDesc() -: DebugInfoDesc(DW_TAG_anchor) -, AnchorTag(0) -{} -AnchorDesc::AnchorDesc(AnchoredDesc *D) -: DebugInfoDesc(DW_TAG_anchor) -, AnchorTag(D->getTag()) -{} - -// Implement isa/cast/dyncast. -bool AnchorDesc::classof(const DebugInfoDesc *D) { -  return D->getTag() == DW_TAG_anchor; -} -   -/// getLinkage - get linkage appropriate for this type of descriptor. -/// -GlobalValue::LinkageTypes AnchorDesc::getLinkage() const { -  return GlobalValue::LinkOnceLinkage; -} - -/// ApplyToFields - Target the visitor to the fields of the TransUnitDesc. -/// -void AnchorDesc::ApplyToFields(DIVisitor *Visitor) { -  DebugInfoDesc::ApplyToFields(Visitor); -   -  Visitor->Apply(AnchorTag); -} - -/// getDescString - Return a string used to compose global names and labels. A -/// A global variable name needs to be defined for each debug descriptor that is -/// anchored. NOTE: that each global variable named here also needs to be added -/// to the list of names left external in the internalizer. -///   ExternalNames.insert("llvm.dbg.compile_units"); -///   ExternalNames.insert("llvm.dbg.global_variables"); -///   ExternalNames.insert("llvm.dbg.subprograms"); -const char *AnchorDesc::getDescString() const { -  switch (AnchorTag) { -  case DW_TAG_compile_unit: return CompileUnitDesc::AnchorString; -  case DW_TAG_variable:     return GlobalVariableDesc::AnchorString; -  case DW_TAG_subprogram:   return SubprogramDesc::AnchorString; -  default: break; -  } - -  assert(0 && "Tag does not have a case for anchor string"); -  return ""; -} - -/// getTypeString - Return a string used to label this descriptors type. -/// -const char *AnchorDesc::getTypeString() const { -  return "llvm.dbg.anchor.type"; -} - -#ifndef NDEBUG -void AnchorDesc::dump() { -  cerr << getDescString() << " " -       << "Version(" << getVersion() << "), " -       << "Tag(" << getTag() << "), " -       << "AnchorTag(" << AnchorTag << ")\n"; -} -#endif - -//===----------------------------------------------------------------------===// - -AnchoredDesc::AnchoredDesc(unsigned T) -: DebugInfoDesc(T) -, Anchor(NULL) -{} - -/// ApplyToFields - Target the visitor to the fields of the AnchoredDesc. -/// -void AnchoredDesc::ApplyToFields(DIVisitor *Visitor) { -  DebugInfoDesc::ApplyToFields(Visitor); - -  Visitor->Apply(Anchor); -} - -//===----------------------------------------------------------------------===// - -CompileUnitDesc::CompileUnitDesc() -: AnchoredDesc(DW_TAG_compile_unit) -, Language(0) -, FileName("") -, Directory("") -, Producer("") -{} - -// Implement isa/cast/dyncast. -bool CompileUnitDesc::classof(const DebugInfoDesc *D) { -  return D->getTag() == DW_TAG_compile_unit; -} - -/// ApplyToFields - Target the visitor to the fields of the CompileUnitDesc. -/// -void CompileUnitDesc::ApplyToFields(DIVisitor *Visitor) { -  AnchoredDesc::ApplyToFields(Visitor); -   -  // Handle cases out of sync with compiler. -  if (getVersion() == 0) { -    unsigned DebugVersion; -    Visitor->Apply(DebugVersion); -  } - -  Visitor->Apply(Language); -  Visitor->Apply(FileName); -  Visitor->Apply(Directory); -  Visitor->Apply(Producer); -} - -/// getDescString - Return a string used to compose global names and labels. -/// -const char *CompileUnitDesc::getDescString() const { -  return "llvm.dbg.compile_unit"; -} - -/// getTypeString - Return a string used to label this descriptors type. -/// -const char *CompileUnitDesc::getTypeString() const { -  return "llvm.dbg.compile_unit.type"; -} - -/// getAnchorString - Return a string used to label this descriptor's anchor. -/// -const char *const CompileUnitDesc::AnchorString = "llvm.dbg.compile_units"; -const char *CompileUnitDesc::getAnchorString() const { -  return AnchorString; -} - -#ifndef NDEBUG -void CompileUnitDesc::dump() { -  cerr << getDescString() << " " -       << "Version(" << getVersion() << "), " -       << "Tag(" << getTag() << "), " -       << "Anchor(" << getAnchor() << "), " -       << "Language(" << Language << "), " -       << "FileName(\"" << FileName << "\"), " -       << "Directory(\"" << Directory << "\"), " -       << "Producer(\"" << Producer << "\")\n"; -} -#endif - -//===----------------------------------------------------------------------===// - -TypeDesc::TypeDesc(unsigned T) -: DebugInfoDesc(T) -, Context(NULL) -, Name("") -, File(NULL) -, Line(0) -, Size(0) -, Align(0) -, Offset(0) -, Flags(0) -{} - -/// ApplyToFields - Target the visitor to the fields of the TypeDesc. -/// -void TypeDesc::ApplyToFields(DIVisitor *Visitor) { -  DebugInfoDesc::ApplyToFields(Visitor); -   -  Visitor->Apply(Context); -  Visitor->Apply(Name); -  Visitor->Apply(File); -  Visitor->Apply(Line); -  Visitor->Apply(Size); -  Visitor->Apply(Align); -  Visitor->Apply(Offset); -  if (getVersion() > LLVMDebugVersion4) Visitor->Apply(Flags); -} - -/// getDescString - Return a string used to compose global names and labels. -/// -const char *TypeDesc::getDescString() const { -  return "llvm.dbg.type"; -} - -/// getTypeString - Return a string used to label this descriptor's type. -/// -const char *TypeDesc::getTypeString() const { -  return "llvm.dbg.type.type"; -} - -#ifndef NDEBUG -void TypeDesc::dump() { -  cerr << getDescString() << " " -       << "Version(" << getVersion() << "), " -       << "Tag(" << getTag() << "), " -       << "Context(" << Context << "), " -       << "Name(\"" << Name << "\"), " -       << "File(" << File << "), " -       << "Line(" << Line << "), " -       << "Size(" << Size << "), " -       << "Align(" << Align << "), " -       << "Offset(" << Offset << "), " -       << "Flags(" << Flags << ")\n"; -} -#endif - -//===----------------------------------------------------------------------===// - -BasicTypeDesc::BasicTypeDesc() -: TypeDesc(DW_TAG_base_type) -, Encoding(0) -{} - -// Implement isa/cast/dyncast. -bool BasicTypeDesc::classof(const DebugInfoDesc *D) { -  return D->getTag() == DW_TAG_base_type; -} - -/// ApplyToFields - Target the visitor to the fields of the BasicTypeDesc. -/// -void BasicTypeDesc::ApplyToFields(DIVisitor *Visitor) { -  TypeDesc::ApplyToFields(Visitor); -   -  Visitor->Apply(Encoding); -} - -/// getDescString - Return a string used to compose global names and labels. -/// -const char *BasicTypeDesc::getDescString() const { -  return "llvm.dbg.basictype"; -} - -/// getTypeString - Return a string used to label this descriptor's type. -/// -const char *BasicTypeDesc::getTypeString() const { -  return "llvm.dbg.basictype.type"; -} - -#ifndef NDEBUG -void BasicTypeDesc::dump() { -  cerr << getDescString() << " " -       << "Version(" << getVersion() << "), " -       << "Tag(" << getTag() << "), " -       << "Context(" << getContext() << "), " -       << "Name(\"" << getName() << "\"), " -       << "Size(" << getSize() << "), " -       << "Encoding(" << Encoding << ")," -       << "Flags(" << Flags << ")\n"; -} -#endif - -//===----------------------------------------------------------------------===// - -DerivedTypeDesc::DerivedTypeDesc(unsigned T) -: TypeDesc(T) -, FromType(NULL) -{} - -// Implement isa/cast/dyncast. -bool DerivedTypeDesc::classof(const DebugInfoDesc *D) { -  unsigned T =  D->getTag(); -  switch (T) { -  case DW_TAG_typedef: -  case DW_TAG_pointer_type: -  case DW_TAG_reference_type: -  case DW_TAG_const_type: -  case DW_TAG_volatile_type: -  case DW_TAG_restrict_type: -  case DW_TAG_member: -  case DW_TAG_inheritance: -    return true; -  default: break; -  } -  return false; -} - -/// ApplyToFields - Target the visitor to the fields of the DerivedTypeDesc. -/// -void DerivedTypeDesc::ApplyToFields(DIVisitor *Visitor) { -  TypeDesc::ApplyToFields(Visitor); -   -  Visitor->Apply(FromType); -} - -/// getDescString - Return a string used to compose global names and labels. -/// -const char *DerivedTypeDesc::getDescString() const { -  return "llvm.dbg.derivedtype"; -} - -/// getTypeString - Return a string used to label this descriptor's type. -/// -const char *DerivedTypeDesc::getTypeString() const { -  return "llvm.dbg.derivedtype.type"; -} - -#ifndef NDEBUG -void DerivedTypeDesc::dump() { -  cerr << getDescString() << " " -       << "Version(" << getVersion() << "), " -       << "Tag(" << getTag() << "), " -       << "Context(" << getContext() << "), " -       << "Name(\"" << getName() << "\"), " -       << "Size(" << getSize() << "), " -       << "File(" << getFile() << "), " -       << "Line(" << getLine() << "), " -       << "FromType(" << FromType << ")," -       << "Flags(" << Flags << ")\n"; -} -#endif - -//===----------------------------------------------------------------------===// - -CompositeTypeDesc::CompositeTypeDesc(unsigned T) -: DerivedTypeDesc(T) -, Elements() -{} -   -// Implement isa/cast/dyncast. -bool CompositeTypeDesc::classof(const DebugInfoDesc *D) { -  unsigned T =  D->getTag(); -  switch (T) { -  case DW_TAG_array_type: -  case DW_TAG_structure_type: -  case DW_TAG_union_type: -  case DW_TAG_enumeration_type: -  case DW_TAG_vector_type: -  case DW_TAG_subroutine_type: -    return true; -  default: break; -  } -  return false; -} - -/// ApplyToFields - Target the visitor to the fields of the CompositeTypeDesc. -/// -void CompositeTypeDesc::ApplyToFields(DIVisitor *Visitor) { -  DerivedTypeDesc::ApplyToFields(Visitor);   - -  Visitor->Apply(Elements); -} - -/// getDescString - Return a string used to compose global names and labels. -/// -const char *CompositeTypeDesc::getDescString() const { -  return "llvm.dbg.compositetype"; -} - -/// getTypeString - Return a string used to label this descriptor's type. -/// -const char *CompositeTypeDesc::getTypeString() const { -  return "llvm.dbg.compositetype.type"; -} - -#ifndef NDEBUG -void CompositeTypeDesc::dump() { -  cerr << getDescString() << " " -       << "Version(" << getVersion() << "), " -       << "Tag(" << getTag() << "), " -       << "Context(" << getContext() << "), " -       << "Name(\"" << getName() << "\"), " -       << "Size(" << getSize() << "), " -       << "File(" << getFile() << "), " -       << "Line(" << getLine() << "), " -       << "FromType(" << getFromType() << "), " -       << "Elements.size(" << Elements.size() << ")," -       << "Flags(" << Flags << ")\n"; -} -#endif - -//===----------------------------------------------------------------------===// - -SubrangeDesc::SubrangeDesc() -: DebugInfoDesc(DW_TAG_subrange_type) -, Lo(0) -, Hi(0) -{} - -// Implement isa/cast/dyncast. -bool SubrangeDesc::classof(const DebugInfoDesc *D) { -  return D->getTag() == DW_TAG_subrange_type; -} - -/// ApplyToFields - Target the visitor to the fields of the SubrangeDesc. -/// -void SubrangeDesc::ApplyToFields(DIVisitor *Visitor) { -  DebugInfoDesc::ApplyToFields(Visitor); - -  Visitor->Apply(Lo); -  Visitor->Apply(Hi); -} - -/// getDescString - Return a string used to compose global names and labels. -/// -const char *SubrangeDesc::getDescString() const { -  return "llvm.dbg.subrange"; -} -/// getTypeString - Return a string used to label this descriptor's type. -/// -const char *SubrangeDesc::getTypeString() const { -  return "llvm.dbg.subrange.type"; -} - -#ifndef NDEBUG -void SubrangeDesc::dump() { -  cerr << getDescString() << " " -       << "Version(" << getVersion() << "), " -       << "Tag(" << getTag() << "), " -       << "Lo(" << Lo << "), " -       << "Hi(" << Hi << ")\n"; -} -#endif - -//===----------------------------------------------------------------------===// - -EnumeratorDesc::EnumeratorDesc() -: DebugInfoDesc(DW_TAG_enumerator) -, Name("") -, Value(0) -{} - -// Implement isa/cast/dyncast. -bool EnumeratorDesc::classof(const DebugInfoDesc *D) { -  return D->getTag() == DW_TAG_enumerator; -} - -/// ApplyToFields - Target the visitor to the fields of the EnumeratorDesc. -/// -void EnumeratorDesc::ApplyToFields(DIVisitor *Visitor) { -  DebugInfoDesc::ApplyToFields(Visitor); - -  Visitor->Apply(Name); -  Visitor->Apply(Value); -} - -/// getDescString - Return a string used to compose global names and labels. -/// -const char *EnumeratorDesc::getDescString() const { -  return "llvm.dbg.enumerator"; -} -   -/// getTypeString - Return a string used to label this descriptor's type. -/// -const char *EnumeratorDesc::getTypeString() const { -  return "llvm.dbg.enumerator.type"; -} - -#ifndef NDEBUG -void EnumeratorDesc::dump() { -  cerr << getDescString() << " " -       << "Version(" << getVersion() << "), " -       << "Tag(" << getTag() << "), " -       << "Name(" << Name << "), " -       << "Value(" << Value << ")\n"; -} -#endif - -//===----------------------------------------------------------------------===// - -VariableDesc::VariableDesc(unsigned T) -: DebugInfoDesc(T) -, Context(NULL) -, Name("") -, File(NULL) -, Line(0) -, TyDesc(0) -{} - -// Implement isa/cast/dyncast. -bool VariableDesc::classof(const DebugInfoDesc *D) { -  unsigned T =  D->getTag(); -  switch (T) { -  case DW_TAG_auto_variable: -  case DW_TAG_arg_variable: -  case DW_TAG_return_variable: -    return true; -  default: break; -  } -  return false; -} - -/// ApplyToFields - Target the visitor to the fields of the VariableDesc. -/// -void VariableDesc::ApplyToFields(DIVisitor *Visitor) { -  DebugInfoDesc::ApplyToFields(Visitor); -   -  Visitor->Apply(Context); -  Visitor->Apply(Name); -  Visitor->Apply(File); -  Visitor->Apply(Line); -  Visitor->Apply(TyDesc); -} - -/// getDescString - Return a string used to compose global names and labels. -/// -const char *VariableDesc::getDescString() const { -  return "llvm.dbg.variable"; -} - -/// getTypeString - Return a string used to label this descriptor's type. -/// -const char *VariableDesc::getTypeString() const { -  return "llvm.dbg.variable.type"; -} - -#ifndef NDEBUG -void VariableDesc::dump() { -  cerr << getDescString() << " " -       << "Version(" << getVersion() << "), " -       << "Tag(" << getTag() << "), " -       << "Context(" << Context << "), " -       << "Name(\"" << Name << "\"), " -       << "File(" << File << "), " -       << "Line(" << Line << "), " -       << "TyDesc(" << TyDesc << ")\n"; -} -#endif - -//===----------------------------------------------------------------------===// - -GlobalDesc::GlobalDesc(unsigned T) -: AnchoredDesc(T) -, Context(0) -, Name("") -, FullName("") -, LinkageName("") -, File(NULL) -, Line(0) -, TyDesc(NULL) -, IsStatic(false) -, IsDefinition(false) -{} - -/// ApplyToFields - Target the visitor to the fields of the global. -/// -void GlobalDesc::ApplyToFields(DIVisitor *Visitor) { -  AnchoredDesc::ApplyToFields(Visitor); - -  Visitor->Apply(Context); -  Visitor->Apply(Name); -  Visitor->Apply(FullName); -  Visitor->Apply(LinkageName); -  Visitor->Apply(File); -  Visitor->Apply(Line); -  Visitor->Apply(TyDesc); -  Visitor->Apply(IsStatic); -  Visitor->Apply(IsDefinition); -} - -//===----------------------------------------------------------------------===// - -GlobalVariableDesc::GlobalVariableDesc() -: GlobalDesc(DW_TAG_variable) -, Global(NULL) -{} - -// Implement isa/cast/dyncast. -bool GlobalVariableDesc::classof(const DebugInfoDesc *D) { -  return D->getTag() == DW_TAG_variable;  -} - -/// ApplyToFields - Target the visitor to the fields of the GlobalVariableDesc. -/// -void GlobalVariableDesc::ApplyToFields(DIVisitor *Visitor) { -  GlobalDesc::ApplyToFields(Visitor); - -  Visitor->Apply(Global); -} - -/// getDescString - Return a string used to compose global names and labels. -/// -const char *GlobalVariableDesc::getDescString() const { -  return "llvm.dbg.global_variable"; -} - -/// getTypeString - Return a string used to label this descriptors type. -/// -const char *GlobalVariableDesc::getTypeString() const { -  return "llvm.dbg.global_variable.type"; -} - -/// getAnchorString - Return a string used to label this descriptor's anchor. -/// -const char *const GlobalVariableDesc::AnchorString = "llvm.dbg.global_variables"; -const char *GlobalVariableDesc::getAnchorString() const { -  return AnchorString; -} - -#ifndef NDEBUG -void GlobalVariableDesc::dump() { -  cerr << getDescString() << " " -       << "Version(" << getVersion() << "), " -       << "Tag(" << getTag() << "), " -       << "Anchor(" << getAnchor() << "), " -       << "Name(\"" << getName() << "\"), " -       << "FullName(\"" << getFullName() << "\"), " -       << "LinkageName(\"" << getLinkageName() << "\"), " -       << "File(" << getFile() << ")," -       << "Line(" << getLine() << ")," -       << "Type(" << getType() << "), " -       << "IsStatic(" << (isStatic() ? "true" : "false") << "), " -       << "IsDefinition(" << (isDefinition() ? "true" : "false") << "), " -       << "Global(" << Global << ")\n"; -} -#endif - -//===----------------------------------------------------------------------===// - -SubprogramDesc::SubprogramDesc() -: GlobalDesc(DW_TAG_subprogram) -{} - -// Implement isa/cast/dyncast. -bool SubprogramDesc::classof(const DebugInfoDesc *D) { -  return D->getTag() == DW_TAG_subprogram; -} - -/// ApplyToFields - Target the visitor to the fields of the -/// SubprogramDesc. -void SubprogramDesc::ApplyToFields(DIVisitor *Visitor) { -  GlobalDesc::ApplyToFields(Visitor); -} - -/// getDescString - Return a string used to compose global names and labels. -/// -const char *SubprogramDesc::getDescString() const { -  return "llvm.dbg.subprogram"; -} - -/// getTypeString - Return a string used to label this descriptors type. -/// -const char *SubprogramDesc::getTypeString() const { -  return "llvm.dbg.subprogram.type"; -} - -/// getAnchorString - Return a string used to label this descriptor's anchor. -/// -const char *const SubprogramDesc::AnchorString = "llvm.dbg.subprograms"; -const char *SubprogramDesc::getAnchorString() const { -  return AnchorString; -} - -#ifndef NDEBUG -void SubprogramDesc::dump() { -  cerr << getDescString() << " " -       << "Version(" << getVersion() << "), " -       << "Tag(" << getTag() << "), " -       << "Anchor(" << getAnchor() << "), " -       << "Name(\"" << getName() << "\"), " -       << "FullName(\"" << getFullName() << "\"), " -       << "LinkageName(\"" << getLinkageName() << "\"), " -       << "File(" << getFile() << ")," -       << "Line(" << getLine() << ")," -       << "Type(" << getType() << "), " -       << "IsStatic(" << (isStatic() ? "true" : "false") << "), " -       << "IsDefinition(" << (isDefinition() ? "true" : "false") << ")\n"; -} -#endif - -//===----------------------------------------------------------------------===// - -BlockDesc::BlockDesc() -: DebugInfoDesc(DW_TAG_lexical_block) -, Context(NULL) -{} - -// Implement isa/cast/dyncast. -bool BlockDesc::classof(const DebugInfoDesc *D) { -  return D->getTag() == DW_TAG_lexical_block; -} - -/// ApplyToFields - Target the visitor to the fields of the BlockDesc. -/// -void BlockDesc::ApplyToFields(DIVisitor *Visitor) { -  DebugInfoDesc::ApplyToFields(Visitor); - -  Visitor->Apply(Context); -} - -/// getDescString - Return a string used to compose global names and labels. -/// -const char *BlockDesc::getDescString() const { -  return "llvm.dbg.block"; -} - -/// getTypeString - Return a string used to label this descriptors type. -/// -const char *BlockDesc::getTypeString() const { -  return "llvm.dbg.block.type"; -} - -#ifndef NDEBUG -void BlockDesc::dump() { -  cerr << getDescString() << " " -       << "Version(" << getVersion() << "), " -       << "Tag(" << getTag() << ")," -       << "Context(" << Context << ")\n"; -} -#endif - -//===----------------------------------------------------------------------===// - -DebugInfoDesc *DIDeserializer::Deserialize(Value *V) { -  return Deserialize(getGlobalVariable(V)); -} -DebugInfoDesc *DIDeserializer::Deserialize(GlobalVariable *GV) { -  // Handle NULL. -  if (!GV) return NULL; - -  // Check to see if it has been already deserialized. -  DebugInfoDesc *&Slot = GlobalDescs[GV]; -  if (Slot) return Slot; - -  // Get the Tag from the global. -  unsigned Tag = DebugInfoDesc::TagFromGlobal(GV); -   -  // Create an empty instance of the correct sort. -  Slot = DebugInfoDesc::DescFactory(Tag); -   -  // If not a user defined descriptor. -  if (Slot) { -    // Deserialize the fields. -    DIDeserializeVisitor DRAM(*this, GV); -    DRAM.ApplyToFields(Slot); -  } -   -  return Slot; -} - -//===----------------------------------------------------------------------===// - -/// getStrPtrType - Return a "sbyte *" type. -/// -const PointerType *DISerializer::getStrPtrType() { -  // If not already defined. -  if (!StrPtrTy) { -    // Construct the pointer to signed bytes. -    StrPtrTy = PointerType::getUnqual(Type::Int8Ty); -  } -   -  return StrPtrTy; -} - -/// getEmptyStructPtrType - Return a "{ }*" type. -/// -const PointerType *DISerializer::getEmptyStructPtrType() { -  // If not already defined. -  if (EmptyStructPtrTy) return EmptyStructPtrTy; - -  // Construct the pointer to empty structure type. -  const StructType *EmptyStructTy = StructType::get(NULL, NULL); - -  // Construct the pointer to empty structure type. -  EmptyStructPtrTy = PointerType::getUnqual(EmptyStructTy); -  return EmptyStructPtrTy; -} - -/// getTagType - Return the type describing the specified descriptor (via tag.) -/// -const StructType *DISerializer::getTagType(DebugInfoDesc *DD) { -  // Attempt to get the previously defined type. -  StructType *&Ty = TagTypes[DD->getTag()]; -   -  // If not already defined. -  if (!Ty) { -    // Set up fields vector. -    std::vector<const Type*> Fields; -    // Get types of fields. -    DIGetTypesVisitor GTAM(*this, Fields); -    GTAM.ApplyToFields(DD); - -    // Construct structured type. -    Ty = StructType::get(Fields); -     -    // Register type name with module. -    M->addTypeName(DD->getTypeString(), Ty); -  } -   -  return Ty; -} - -/// getString - Construct the string as constant string global. -/// -Constant *DISerializer::getString(const std::string &String) { -  // Check string cache for previous edition. -  Constant *&Slot = StringCache[String]; - -  // Return Constant if previously defined. -  if (Slot) return Slot; - -  // If empty string then use a sbyte* null instead. -  if (String.empty()) { -    Slot = ConstantPointerNull::get(getStrPtrType()); -  } else { -    // Construct string as an llvm constant. -    Constant *ConstStr = ConstantArray::get(String); - -    // Otherwise create and return a new string global. -    GlobalVariable *StrGV = new GlobalVariable(ConstStr->getType(), true, -                                               GlobalVariable::InternalLinkage, -                                               ConstStr, ".str", M); -    StrGV->setSection("llvm.metadata"); - -    // Convert to generic string pointer. -    Slot = ConstantExpr::getBitCast(StrGV, getStrPtrType()); -  } - -  return Slot; -   -} - -/// Serialize - Recursively cast the specified descriptor into a GlobalVariable -/// so that it can be serialized to a .bc or .ll file. -GlobalVariable *DISerializer::Serialize(DebugInfoDesc *DD) { -  // Check if the DebugInfoDesc is already in the map. -  GlobalVariable *&Slot = DescGlobals[DD]; -   -  // See if DebugInfoDesc exists, if so return prior GlobalVariable. -  if (Slot) return Slot; -   -  // Get the type associated with the Tag. -  const StructType *Ty = getTagType(DD); - -  // Create the GlobalVariable early to prevent infinite recursion. -  GlobalVariable *GV = new GlobalVariable(Ty, true, DD->getLinkage(), -                                          NULL, DD->getDescString(), M); -  GV->setSection("llvm.metadata"); - -  // Insert new GlobalVariable in DescGlobals map. -  Slot = GV; -  -  // Set up elements vector -  std::vector<Constant*> Elements; -  // Add fields. -  DISerializeVisitor SRAM(*this, Elements); -  SRAM.ApplyToFields(DD); - -  // Set the globals initializer. -  GV->setInitializer(ConstantStruct::get(Ty, Elements)); -   -  return GV; -} - -/// addDescriptor - Directly connect DD with existing GV. -void DISerializer::addDescriptor(DebugInfoDesc *DD, -                                 GlobalVariable *GV) { -  DescGlobals[DD] = GV; -} - -//===----------------------------------------------------------------------===// - -/// Verify - Return true if the GlobalVariable appears to be a valid -/// serialization of a DebugInfoDesc. -bool DIVerifier::Verify(Value *V) { -  return !V || Verify(getGlobalVariable(V)); -} -bool DIVerifier::Verify(GlobalVariable *GV) { -  // NULLs are valid. -  if (!GV) return true; -   -  // Check prior validity. -  unsigned &ValiditySlot = Validity[GV]; -   -  // If visited before then use old state. -  if (ValiditySlot) return ValiditySlot == Valid; -   -  // Assume validity for the time being (recursion.) -  ValiditySlot = Valid; -   -  // Make sure the global is internal or link once (anchor.) -  if (GV->getLinkage() != GlobalValue::InternalLinkage && -      GV->getLinkage() != GlobalValue::LinkOnceLinkage) { -    ValiditySlot = Invalid; -    return false; -  } - -  // Get the Tag. -  unsigned Tag = DebugInfoDesc::TagFromGlobal(GV); -   -  // Check for user defined descriptors. -  if (Tag == DW_TAG_invalid) { -    ValiditySlot = Valid; -    return true; -  } -   -  // Get the Version. -  unsigned Version = DebugInfoDesc::VersionFromGlobal(GV); -   -  // Check for version mismatch. -  if (Version != LLVMDebugVersion) { -    ValiditySlot = Invalid; -    return false; -  } - -  // Construct an empty DebugInfoDesc. -  DebugInfoDesc *DD = DebugInfoDesc::DescFactory(Tag); -   -  // Allow for user defined descriptors. -  if (!DD) return true; -   -  // Get the initializer constant. -  ConstantStruct *CI = cast<ConstantStruct>(GV->getInitializer()); -   -  // Get the operand count. -  unsigned N = CI->getNumOperands(); -   -  // Get the field count. -  unsigned &CountSlot = Counts[Tag]; - -  if (!CountSlot) -    // Check the operand count to the field count -    CountSlot = CountFields(DD); -   -  // Field count must be at most equal operand count. -  if (CountSlot >  N) { -    delete DD; -    ValiditySlot = Invalid; -    return false; -  } -   -  // Check each field for valid type. -  DIVerifyVisitor VRAM(*this, GV); -  VRAM.ApplyToFields(DD); -   -  // Release empty DebugInfoDesc. -  delete DD; -   -  // If fields are not valid. -  if (!VRAM.isValid()) { -    ValiditySlot = Invalid; -    return false; -  } -   -  return true; -} - -/// isVerified - Return true if the specified GV has already been -/// verified as a debug information descriptor. -bool DIVerifier::isVerified(GlobalVariable *GV) { -  unsigned &ValiditySlot = Validity[GV]; -  if (ValiditySlot) return ValiditySlot == Valid; -  return false; -} - -//===----------------------------------------------------------------------===// - -DebugScope::~DebugScope() { -  for (unsigned i = 0, N = Scopes.size(); i < N; ++i) delete Scopes[i]; -  for (unsigned j = 0, M = Variables.size(); j < M; ++j) delete Variables[j]; -} - -//===----------------------------------------------------------------------===// -  MachineModuleInfo::MachineModuleInfo()  : ImmutablePass(&ID) -, DR() -, VR() -, CompileUnits() -, Directories() -, SourceFiles()  , Lines()  , LabelIDList() -, ScopeMap() -, RootScope(NULL)  , FrameMoves()  , LandingPads()  , Personalities() @@ -1660,16 +73,6 @@ void MachineModuleInfo::BeginFunction(MachineFunction *MF) {  /// EndFunction - Discard function meta information.  ///  void MachineModuleInfo::EndFunction() { -  // Clean up scope information. -  if (RootScope) { -    delete RootScope; -    ScopeMap.clear(); -    RootScope = NULL; -  } -   -  // Clean up line info. -  Lines.clear(); -    // Clean up frame info.    FrameMoves.clear(); @@ -1682,18 +85,9 @@ void MachineModuleInfo::EndFunction() {    CallsUnwindInit = 0;  } -/// getDescFor - Convert a Value to a debug information descriptor. -/// -// FIXME - use new Value type when available. -DebugInfoDesc *MachineModuleInfo::getDescFor(Value *V) { -  return DR.Deserialize(V); -} -  /// AnalyzeModule - Scan the module for global debug information.  ///  void MachineModuleInfo::AnalyzeModule(Module &M) { -  SetupCompileUnits(M); -    // Insert functions in the llvm.used array into UsedFunctions.    GlobalVariable *GV = M.getGlobalVariable("llvm.used");    if (!GV || !GV->hasInitializer()) return; @@ -1710,111 +104,6 @@ void MachineModuleInfo::AnalyzeModule(Module &M) {    }  } -/// SetupCompileUnits - Set up the unique vector of compile units. -/// -void MachineModuleInfo::SetupCompileUnits(Module &M) { -  std::vector<CompileUnitDesc *> CU; -  getAnchoredDescriptors<CompileUnitDesc>(M, CU); -   -  for (unsigned i = 0, N = CU.size(); i < N; i++) { -    CompileUnits.insert(CU[i]); -  } -} - -/// getCompileUnits - Return a vector of debug compile units. -/// -const UniqueVector<CompileUnitDesc *> MachineModuleInfo::getCompileUnits()const{ -  return CompileUnits; -} - -/// getGlobalVariablesUsing - Return all of the GlobalVariables that use the -/// named GlobalVariable. -void -MachineModuleInfo::getGlobalVariablesUsing(Module &M, -                                           const std::string &RootName, -                                           std::vector<GlobalVariable*>&Result){ -  return ::getGlobalVariablesUsing(M, RootName, Result); -} - -/// RecordSourceLine - Records location information and associates it with a -/// debug label.  Returns a unique label ID used to generate a label and  -/// provide correspondence to the source line list. -unsigned MachineModuleInfo::RecordSourceLine(unsigned Line, unsigned Column, -                                             unsigned Source) { -  unsigned ID = NextLabelID(); -  Lines.push_back(SourceLineInfo(Line, Column, Source, ID)); -  return ID; -} - -/// RecordSource - Register a source file with debug info. Returns an source -/// ID. -unsigned MachineModuleInfo::RecordSource(const std::string &Directory, -                                         const std::string &Source) { -  unsigned DirectoryID = Directories.insert(Directory); -  return SourceFiles.insert(SourceFileInfo(DirectoryID, Source)); -} -unsigned MachineModuleInfo::RecordSource(const CompileUnitDesc *CompileUnit) { -  return RecordSource(CompileUnit->getDirectory(), -                      CompileUnit->getFileName()); -} - -/// RecordRegionStart - Indicate the start of a region. -/// -unsigned MachineModuleInfo::RecordRegionStart(Value *V) { -  // FIXME - need to be able to handle split scopes because of bb cloning. -  DebugInfoDesc *ScopeDesc = DR.Deserialize(V); -  DebugScope *Scope = getOrCreateScope(ScopeDesc); -  unsigned ID = NextLabelID(); -  if (!Scope->getStartLabelID()) Scope->setStartLabelID(ID); -  return ID; -} - -/// RecordRegionEnd - Indicate the end of a region. -/// -unsigned MachineModuleInfo::RecordRegionEnd(Value *V) { -  // FIXME - need to be able to handle split scopes because of bb cloning. -  DebugInfoDesc *ScopeDesc = DR.Deserialize(V); -  DebugScope *Scope = getOrCreateScope(ScopeDesc); -  unsigned ID = NextLabelID(); -  Scope->setEndLabelID(ID); -  return ID; -} - -/// RecordVariable - Indicate the declaration of  a local variable. -/// -void MachineModuleInfo::RecordVariable(GlobalValue *GV, unsigned FrameIndex) { -  VariableDesc *VD = cast<VariableDesc>(DR.Deserialize(GV)); -  DebugScope *Scope = getOrCreateScope(VD->getContext()); -  DebugVariable *DV = new DebugVariable(VD, FrameIndex); -  Scope->AddVariable(DV); -} - -/// getOrCreateScope - Returns the scope associated with the given descriptor. -/// -DebugScope *MachineModuleInfo::getOrCreateScope(DebugInfoDesc *ScopeDesc) { -  DebugScope *&Slot = ScopeMap[ScopeDesc]; -  if (!Slot) { -    // FIXME - breaks down when the context is an inlined function. -    DebugInfoDesc *ParentDesc = NULL; -    if (BlockDesc *Block = dyn_cast<BlockDesc>(ScopeDesc)) { -      ParentDesc = Block->getContext(); -    } -    DebugScope *Parent = ParentDesc ? getOrCreateScope(ParentDesc) : NULL; -    Slot = new DebugScope(Parent, ScopeDesc); -    if (Parent) { -      Parent->AddScope(Slot); -    } else if (RootScope) { -      // FIXME - Add inlined function scopes to the root so we can delete -      // them later.  Long term, handle inlined functions properly. -      RootScope->AddScope(Slot); -    } else { -      // First function is top level function. -      RootScope = Slot; -    } -  } -  return Slot; -} -  //===-EH-------------------------------------------------------------------===//  /// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 324b07025e0..34f33b0bccc 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -2041,7 +2041,7 @@ bool SelectionDAG::isVerifiedDebugInfoDesc(SDValue Op) const {    GlobalVariable *GV = dyn_cast<GlobalVariable>(GA->getGlobal());    if (!GV) return false;    MachineModuleInfo *MMI = getMachineModuleInfo(); -  return MMI && MMI->hasDebugInfo() && MMI->isVerified(GV); +  return MMI && MMI->hasDebugInfo();  } | 

