X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FCodeGen%2FDwarfWriter.cpp;h=a5862c9e872b9d2c39428c605adccb28dfa659bb;hb=f4e4629ee8c218f892ad8ae3e182fe40bc160895;hp=fc7ba6db0464a6f75a46b1456b85c2c38b194224;hpb=43b30a828792214612836686c51b96178a48f306;p=oota-llvm.git diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp index fc7ba6db046..a5862c9e872 100644 --- a/lib/CodeGen/DwarfWriter.cpp +++ b/lib/CodeGen/DwarfWriter.cpp @@ -140,7 +140,7 @@ private: /// Data - Raw data bytes for abbreviation. /// - std::vector Data; + SmallVector Data; public: @@ -155,7 +155,7 @@ public: unsigned getTag() const { return Tag; } unsigned getNumber() const { return Number; } unsigned getChildrenFlag() const { return ChildrenFlag; } - const std::vector &getData() const { return Data; } + const SmallVector &getData() const { return Data; } void setTag(unsigned T) { Tag = T; } void setChildrenFlag(unsigned CF) { ChildrenFlag = CF; } void setNumber(unsigned N) { Number = N; } @@ -219,7 +219,7 @@ protected: /// Attributes values. /// - std::vector Values; + SmallVector Values; public: explicit DIE(unsigned Tag) @@ -240,7 +240,7 @@ public: unsigned getOffset() const { return Offset; } unsigned getSize() const { return Size; } const std::vector &getChildren() const { return Children; } - std::vector &getValues() { return Values; } + SmallVector &getValues() { return Values; } void setTag(unsigned Tag) { Abbrev.setTag(Tag); } void setOffset(unsigned O) { Offset = O; } void setSize(unsigned S) { Size = S; } @@ -296,6 +296,7 @@ public: isString, isLabel, isAsIsLabel, + isSectionOffset, isDelta, isEntry, isBlock @@ -504,6 +505,56 @@ public: #endif }; +//===----------------------------------------------------------------------===// +/// DIESectionOffset - A section offset DIE. +// +class DIESectionOffset : public DIEValue { +public: + const DWLabel Label; + const DWLabel Section; + bool IsEH : 1; + bool UseSet : 1; + + DIESectionOffset(const DWLabel &Lab, const DWLabel &Sec, + bool isEH = false, bool useSet = true) + : DIEValue(isSectionOffset), Label(Lab), Section(Sec), + IsEH(isEH), UseSet(useSet) {} + + // Implement isa/cast/dyncast. + static bool classof(const DIESectionOffset *) { return true; } + static bool classof(const DIEValue *D) { return D->Type == isSectionOffset; } + + /// EmitValue - Emit section offset. + /// + virtual void EmitValue(DwarfDebug &DD, unsigned Form); + + /// SizeOf - Determine size of section offset value in bytes. + /// + virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const; + + /// Profile - Used to gather unique data for the value folding set. + /// + static void Profile(FoldingSetNodeID &ID, const DWLabel &Label, + const DWLabel &Section) { + ID.AddInteger(isSectionOffset); + Label.Profile(ID); + Section.Profile(ID); + // IsEH and UseSet are specific to the Label/Section that we will emit + // the offset for; so Label/Section are enough for uniqueness. + } + virtual void Profile(FoldingSetNodeID &ID) { Profile(ID, Label, Section); } + +#ifndef NDEBUG + virtual void print(std::ostream &O) { + O << "Off: "; + Label.print(O); + O << "-"; + Section.print(O); + O << "-" << IsEH << "-" << UseSet; + } +#endif +}; + //===----------------------------------------------------------------------===// /// DIEDelta - A simple label difference DIE. /// @@ -775,7 +826,7 @@ protected: /// AsmPrinter *Asm; - /// TAI - Target Asm Printer. + /// TAI - Target asm information. const TargetAsmInfo *TAI; /// TD - Target data. @@ -1040,7 +1091,10 @@ public: Asm->EOL("Offset"); } else if (Reg < 64) { Asm->EmitInt8(DW_CFA_offset + Reg); - Asm->EOL("DW_CFA_offset + Reg (" + utostr(Reg) + ")"); + if (VerboseAsm) + Asm->EOL("DW_CFA_offset + Reg (" + utostr(Reg) + ")"); + else + Asm->EOL(); Asm->EmitULEB128Bytes(Offset); Asm->EOL("Offset"); } else { @@ -1275,6 +1329,24 @@ public: Die->AddValue(Attribute, Form, Value); } + /// AddSectionOffset - Add a section offset label attribute data and value. + /// + void AddSectionOffset(DIE *Die, unsigned Attribute, unsigned Form, + const DWLabel &Label, const DWLabel &Section, + bool isEH = false, bool useSet = true) { + FoldingSetNodeID ID; + DIESectionOffset::Profile(ID, Label, Section); + void *Where; + DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where); + if (!Value) { + Value = new DIESectionOffset(Label, Section, isEH, useSet); + ValuesSet.InsertNode(Value, Where); + Values.push_back(Value); + } + + Die->AddValue(Attribute, Form, Value); + } + /// AddDelta - Add a label delta attribute data and value. /// void AddDelta(DIE *Die, unsigned Attribute, unsigned Form, @@ -1714,11 +1786,8 @@ private: CompileUnit *NewCompileUnit(CompileUnitDesc *UnitDesc, unsigned ID) { // Construct debug information entry. DIE *Die = new DIE(DW_TAG_compile_unit); - if (TAI->isAbsoluteDebugSectionOffsets()) - AddLabel(Die, DW_AT_stmt_list, DW_FORM_data4, DWLabel("section_line", 0)); - else - AddDelta(Die, DW_AT_stmt_list, DW_FORM_data4, DWLabel("section_line", 0), - DWLabel("section_line", 0)); + 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()); @@ -2009,14 +2078,18 @@ private: // Emit the code (index) for the abbreviation. Asm->EmitULEB128Bytes(AbbrevNumber); - Asm->EOL(std::string("Abbrev [" + - utostr(AbbrevNumber) + - "] 0x" + utohexstr(Die->getOffset()) + - ":0x" + utohexstr(Die->getSize()) + " " + - TagString(Abbrev->getTag()))); + + if (VerboseAsm) + Asm->EOL(std::string("Abbrev [" + + utostr(AbbrevNumber) + + "] 0x" + utohexstr(Die->getOffset()) + + ":0x" + utohexstr(Die->getSize()) + " " + + TagString(Abbrev->getTag()))); + else + Asm->EOL(); - std::vector &Values = Die->getValues(); - const std::vector &AbbrevData = Abbrev->getData(); + SmallVector &Values = Die->getValues(); + const SmallVector &AbbrevData = Abbrev->getData(); // Emit the DIE attribute values. for (unsigned i = 0, N = Values.size(); i < N; ++i) { @@ -2073,8 +2146,8 @@ private: // Start the size with the size of abbreviation code. Offset += Asm->SizeULEB128(AbbrevNumber); - const std::vector &Values = Die->getValues(); - const std::vector &AbbrevData = Abbrev->getData(); + const SmallVector &Values = Die->getValues(); + const SmallVector &AbbrevData = Abbrev->getData(); // Size the DIE attribute values. for (unsigned i = 0, N = Values.size(); i < N; ++i) { @@ -2230,8 +2303,7 @@ private: Asm->EmitInt8(1); Asm->EOL("DW_LNS_fixed_advance_pc arg count"); const UniqueVector &Directories = MMI->getDirectories(); - const UniqueVector - &SourceFiles = MMI->getSourceFiles(); + const UniqueVector &SourceFiles = MMI->getSourceFiles(); // Emit directories. for (unsigned DirectoryID = 1, NDID = Directories.size(); @@ -2261,8 +2333,11 @@ private: for (unsigned j = 0, M = SectionSourceLines.size(); j < M; ++j) { // Isolate current sections line info. const std::vector &LineInfos = SectionSourceLines[j]; - - Asm->EOL(std::string("Section ") + SectionMap[j + 1]); + + if (VerboseAsm) + Asm->EOL(std::string("Section ") + SectionMap[j + 1]); + else + Asm->EOL(); // Dwarf assumes we start with first line of first source file. unsigned Source = 1; @@ -2277,10 +2352,13 @@ private: unsigned SourceID = LineInfo.getSourceID(); const SourceFileInfo &SourceFile = SourceFiles[SourceID]; unsigned DirectoryID = SourceFile.getDirectoryID(); - Asm->EOL(Directories[DirectoryID] - + SourceFile.getName() - + ":" - + utostr_32(LineInfo.getLine())); + if (VerboseAsm) + Asm->EOL(Directories[DirectoryID] + + SourceFile.getName() + + ":" + + utostr_32(LineInfo.getLine())); + else + Asm->EOL(); // Define the line address. Asm->EmitInt8(0); Asm->EOL("Extended Op"); @@ -2555,8 +2633,8 @@ private: /// ConstructGlobalDIEs - Create DIEs for each of the externally visible /// global variables. void ConstructGlobalDIEs() { - std::vector GlobalVariables = - MMI->getAnchoredDescriptors(*M); + std::vector GlobalVariables; + MMI->getAnchoredDescriptors(*M, GlobalVariables); for (unsigned i = 0, N = GlobalVariables.size(); i < N; ++i) { GlobalVariableDesc *GVD = GlobalVariables[i]; @@ -2567,8 +2645,8 @@ private: /// ConstructSubprogramDIEs - Create DIEs for each of the externally visible /// subprograms. void ConstructSubprogramDIEs() { - std::vector Subprograms = - MMI->getAnchoredDescriptors(*M); + std::vector Subprograms; + MMI->getAnchoredDescriptors(*M, Subprograms); for (unsigned i = 0, N = Subprograms.size(); i < N; ++i) { SubprogramDesc *SPD = Subprograms[i]; @@ -2645,8 +2723,6 @@ public: /// content. void BeginModule(Module *M) { this->M = M; - - if (!ShouldEmitDwarf()) return; } /// EndModule - Emit all Dwarf sections that should come after the content. @@ -3195,7 +3271,7 @@ private: I != E; ++I) { for (MachineBasicBlock::const_iterator MI = I->begin(), E = I->end(); MI != E; ++MI) { - if (MI->getOpcode() != TargetInstrInfo::LABEL) { + if (!MI->isLabel()) { SawPotentiallyThrowing |= MI->getDesc().isCall(); continue; } @@ -3238,7 +3314,7 @@ private: // Try to merge with the previous call-site. if (PreviousIsInvoke) { - CallSiteEntry &Prev = CallSites[CallSites.size()-1]; + CallSiteEntry &Prev = CallSites.back(); if (Site.PadLabel == Prev.PadLabel && Site.Action == Prev.Action) { // Extend the range of the previous entry. Prev.EndLabel = Site.EndLabel; @@ -3437,9 +3513,7 @@ public: shouldEmitTable = true; // See if we need frame move info. - if (MMI->hasDebugInfo() || - !MF->getFunction()->doesNotThrow() || - UnwindTablesMandatory) + if (!MF->getFunction()->doesNotThrow() || UnwindTablesMandatory) shouldEmitMoves = true; if (shouldEmitMoves || shouldEmitTable) @@ -3615,6 +3689,23 @@ unsigned DIEObjectLabel::SizeOf(const DwarfDebug &DD, unsigned Form) const { //===----------------------------------------------------------------------===// +/// EmitValue - Emit delta value. +/// +void DIESectionOffset::EmitValue(DwarfDebug &DD, unsigned Form) { + bool IsSmall = Form == DW_FORM_data4; + DD.EmitSectionOffset(Label.Tag, Section.Tag, + Label.Number, Section.Number, IsSmall, IsEH, UseSet); +} + +/// SizeOf - Determine size of delta value in bytes. +/// +unsigned DIESectionOffset::SizeOf(const DwarfDebug &DD, unsigned Form) const { + if (Form == DW_FORM_data4) return 4; + return DD.getTargetData()->getPointerSize(); +} + +//===----------------------------------------------------------------------===// + /// EmitValue - Emit delta value. /// void DIEDelta::EmitValue(DwarfDebug &DD, unsigned Form) { @@ -3643,7 +3734,7 @@ void DIEntry::EmitValue(DwarfDebug &DD, unsigned Form) { /// unsigned DIEBlock::ComputeSize(DwarfDebug &DD) { if (!Size) { - const std::vector &AbbrevData = Abbrev.getData(); + const SmallVector &AbbrevData = Abbrev.getData(); for (unsigned i = 0, N = Values.size(); i < N; ++i) { Size += Values[i]->SizeOf(DD, AbbrevData[i].getForm()); @@ -3663,7 +3754,7 @@ void DIEBlock::EmitValue(DwarfDebug &DD, unsigned Form) { default: assert(0 && "Improper form for block"); break; } - const std::vector &AbbrevData = Abbrev.getData(); + const SmallVector &AbbrevData = Abbrev.getData(); for (unsigned i = 0, N = Values.size(); i < N; ++i) { DD.getAsm()->EOL(); @@ -3736,7 +3827,7 @@ void DIE::print(std::ostream &O, unsigned IncIndent) { } O << "\n"; - const std::vector &Data = Abbrev.getData(); + const SmallVector &Data = Abbrev.getData(); IndentCount += 2; for (unsigned i = 0, N = Data.size(); i < N; ++i) {