diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2007-03-07 02:47:57 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2007-03-07 02:47:57 +0000 |
commit | a6199c87c293d937b1e57549864345e64e6c6e8b (patch) | |
tree | 1475464a55a51c8688e172002a37e1016a2f1e88 | |
parent | cb20998b3f853f8ce78485941225310697b9e5ea (diff) | |
download | llvm-a6199c87c293d937b1e57549864345e64e6c6e8b.tar.gz llvm-a6199c87c293d937b1e57549864345e64e6c6e8b.tar.bz2 llvm-a6199c87c293d937b1e57549864345e64e6c6e8b.tar.xz |
Fix DWARF debugging information on x86/Linux and (hopefully)
Mingw32/Cygwin targets. This fixes PR978
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35000 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Target/TargetAsmInfo.h | 13 | ||||
-rw-r--r-- | lib/CodeGen/DwarfWriter.cpp | 78 | ||||
-rw-r--r-- | lib/Target/TargetAsmInfo.cpp | 3 | ||||
-rw-r--r-- | lib/Target/X86/X86TargetAsmInfo.cpp | 3 |
4 files changed, 80 insertions, 17 deletions
diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h index a109d77db6..36f5a1906b 100644 --- a/include/llvm/Target/TargetAsmInfo.h +++ b/include/llvm/Target/TargetAsmInfo.h @@ -246,6 +246,10 @@ namespace llvm { //===--- Dwarf Emission Directives -----------------------------------===// + /// AbsoluteSectionOffsets - True if we should emit abolute section + /// offsets. Defaults to false. + bool AbsoluteSectionOffsets; + /// HasLEB128 - True if target asm supports leb128 directives. /// bool HasLEB128; // Defaults to false. @@ -266,6 +270,9 @@ namespace llvm { /// bool DwarfRequiresFrameSection; // Defaults to true. + /// DwarfSectionOffsetDirective - Special section offset directive. + const char* DwarfSectionOffsetDirective; // Defaults to NULL + /// DwarfAbbrevSection - Section directive for Dwarf abbrev. /// const char *DwarfAbbrevSection; // Defaults to ".debug_abbrev". @@ -494,6 +501,9 @@ namespace llvm { const char *getHiddenDirective() const { return HiddenDirective; } + bool isAbsoluteSectionOffsets() const { + return AbsoluteSectionOffsets; + } bool hasLEB128() const { return HasLEB128; } @@ -509,6 +519,9 @@ namespace llvm { bool getDwarfRequiresFrameSection() const { return DwarfRequiresFrameSection; } + const char *getDwarfSectionOffsetDirective() const { + return DwarfSectionOffsetDirective; + } const char *getDwarfAbbrevSection() const { return DwarfAbbrevSection; } diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp index 0bf37a77ee..74978506d9 100644 --- a/lib/CodeGen/DwarfWriter.cpp +++ b/lib/CodeGen/DwarfWriter.cpp @@ -823,8 +823,12 @@ public: void PrintLabelName(DWLabel Label) const { PrintLabelName(Label.Tag, Label.Number); } - void PrintLabelName(const char *Tag, unsigned Number) const { - O << TAI->getPrivateGlobalPrefix() << Tag; + void PrintLabelName(const char *Tag, unsigned Number, + bool isInSection = false) const { + if (isInSection && TAI->getDwarfSectionOffsetDirective()) + O << TAI->getDwarfSectionOffsetDirective() << Tag; + else + O << TAI->getPrivateGlobalPrefix() << Tag; if (Number) O << Number; } @@ -907,7 +911,44 @@ public: PrintLabelName(TagLo, NumberLo); } } - + + void EmitSectionOffset(const char* Label, const char* Section, + unsigned LabelNumber, unsigned SectionNumber, + bool IsSmall = false) const { + if (TAI->needsSet()) { + static unsigned SetCounter = 1; + + O << "\t.set\t"; + PrintLabelName("set", SetCounter); + O << ","; + PrintLabelName(Label, LabelNumber, true); + if (!TAI->isAbsoluteSectionOffsets()) { + O << "-"; + PrintLabelName(Section, SectionNumber); + } + O << "\n"; + + if (IsSmall || TAI->getAddressSize() == sizeof(int32_t)) + O << TAI->getData32bitsDirective(); + else + O << TAI->getData64bitsDirective(); + + PrintLabelName("set", SetCounter); + ++SetCounter; + } else { + if (IsSmall || TAI->getAddressSize() == sizeof(int32_t)) + O << TAI->getData32bitsDirective(); + else + O << TAI->getData64bitsDirective(); + + PrintLabelName(Label, LabelNumber, true); + if (!TAI->isAbsoluteSectionOffsets()) { + O << "-"; + PrintLabelName(Section, SectionNumber); + } + } + } + /// EmitFrameMoves - Emit frame instructions to describe the layout of the /// frame. void EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID, @@ -1649,8 +1690,11 @@ private: CompileUnit *NewCompileUnit(CompileUnitDesc *UnitDesc, unsigned ID) { // Construct debug information entry. DIE *Die = new DIE(DW_TAG_compile_unit); - AddDelta(Die, DW_AT_stmt_list, DW_FORM_data4, DWLabel("section_line", 0), - DWLabel("section_line", 0)); + if (TAI->isAbsoluteSectionOffsets()) + 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)); 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()); @@ -2065,7 +2109,7 @@ private: Asm->EmitInt32(ContentSize); Asm->EOL("Length of Compilation Unit Info"); Asm->EmitInt16(DWARF_VERSION); Asm->EOL("DWARF version number"); - EmitDifference("abbrev_begin", 0, "section_abbrev", 0, true); + EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true); Asm->EOL("Offset Into Abbrev. Section"); Asm->EmitInt8(TAI->getAddressSize()); Asm->EOL("Address Size (in bytes)"); @@ -2323,8 +2367,8 @@ private: Asm->EOL("Length of Frame Information Entry"); EmitLabel("frame_begin", SubprogramCount); - - EmitDifference("frame_common_begin", 0, "section_frame", 0, true); + + EmitSectionOffset("frame_common_begin", "section_frame", 0, 0, true); Asm->EOL("FDE CIE offset"); EmitReference("func_begin", SubprogramCount); @@ -2358,8 +2402,8 @@ private: EmitLabel("pubnames_begin", Unit->getID()); Asm->EmitInt16(DWARF_VERSION); Asm->EOL("DWARF Version"); - - EmitDifference("info_begin", Unit->getID(), "section_info", 0, true); + + EmitSectionOffset("info_begin", "section_info", Unit->getID(), 0, true); Asm->EOL("Offset of Compilation Unit Info"); EmitDifference("info_end", Unit->getID(), "info_begin", Unit->getID(),true); @@ -2786,9 +2830,9 @@ private: Asm->EOL("Length of Frame Information Entry"); EmitLabel("eh_frame_begin", SubprogramCount); - - EmitDifference("eh_frame_begin", SubprogramCount, - "section_eh_frame", 0, true); + + EmitSectionOffset("eh_frame_begin", "section_eh_frame", + SubprogramCount, 0, true); Asm->EOL("FDE CIE offset"); EmitReference("eh_func_begin", SubprogramCount, true); @@ -2951,8 +2995,8 @@ private: // Emit the landng pad site information. for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) { const LandingPadInfo &LandingPad = LandingPads[i]; - EmitDifference("label", LandingPad.BeginLabel, - "eh_func_begin", SubprogramCount); + EmitSectionOffset("label", "eh_func_begin", + LandingPad.BeginLabel, SubprogramCount); Asm->EOL("Region start"); EmitDifference("label", LandingPad.EndLabel, @@ -2965,8 +3009,8 @@ private: else Asm->EmitInt64(0); } else { - EmitDifference("label", LandingPad.LandingPadLabel, - "eh_func_begin", SubprogramCount); + EmitSectionOffset("label", "eh_func_begin", + LandingPad.LandingPadLabel, SubprogramCount); } Asm->EOL("Landing pad"); diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index efc54841b4..da47749344 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -69,11 +69,13 @@ TargetAsmInfo::TargetAsmInfo() : UsedDirective(0), WeakRefDirective(0), HiddenDirective("\t.hidden\t"), + AbsoluteSectionOffsets(false), HasLEB128(false), HasDotLoc(false), HasDotFile(false), SupportsExceptionHandling(false), DwarfRequiresFrameSection(true), + DwarfSectionOffsetDirective(0), DwarfAbbrevSection(".debug_abbrev"), DwarfInfoSection(".debug_info"), DwarfLineSection(".debug_line"), @@ -106,3 +108,4 @@ unsigned TargetAsmInfo::getInlineAsmLength(const char *Str) const { // Multiply by the worst-case length for each instruction. return NumInsts * MaxInstLength; } + diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp index 23cab9dff7..c66862aec6 100644 --- a/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/lib/Target/X86/X86TargetAsmInfo.cpp @@ -97,6 +97,7 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) { case X86Subtarget::isELF: // Set up DWARF directives HasLEB128 = true; // Target asm supports leb128 directives (little-endian) + AbsoluteSectionOffsets = true; // bool HasLEB128; // Defaults to false. // hasDotLoc - True if target asm supports .loc directives. // bool HasDotLoc; // Defaults to false. @@ -130,9 +131,11 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) { // Set up DWARF directives HasLEB128 = true; // Target asm supports leb128 directives (little-endian) + AbsoluteSectionOffsets = true; PrivateGlobalPrefix = "L"; // Prefix for private global symbols WeakRefDirective = "\t.weak\t"; DwarfRequiresFrameSection = false; + DwarfSectionOffsetDirective = "\t.secrel32\t"; DwarfAbbrevSection = "\t.section\t.debug_abbrev,\"dr\""; DwarfInfoSection = "\t.section\t.debug_info,\"dr\""; DwarfLineSection = "\t.section\t.debug_line,\"dr\""; |