Handle gnu pubtypes sections:
authorEric Christopher <echristo@gmail.com>
Mon, 23 Sep 2013 20:55:35 +0000 (20:55 +0000)
committerEric Christopher <echristo@gmail.com>
Mon, 23 Sep 2013 20:55:35 +0000 (20:55 +0000)
a) Make sure we are emitting the correct section in our section labels
when we begin the module.
b) Make sure we are emitting the correct pubtypes section in the
presence of gnu pubtypes.
c) For C++ struct, union, class, and enumeration types are default
external.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191225 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/DwarfDebug.cpp
test/DebugInfo/X86/gnu-public-names.ll

index 48a7c185ec2b5fbe1b9155cf5ee7ec577b38c465..a6de1ac94146e3faaaf2ef5769e9a41b5620275c 100644 (file)
@@ -1966,12 +1966,12 @@ void DwarfDebug::emitSectionLabels() {
   DwarfLineSectionSym =
     emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
   emitSectionSym(Asm, TLOF.getDwarfLocSection());
-  if (HasDwarfPubSections) {
-    emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
-    emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
-  } else if (GenerateGnuPubSections) {
+  if (GenerateGnuPubSections) {
     emitSectionSym(Asm, TLOF.getDwarfGnuPubNamesSection());
     emitSectionSym(Asm, TLOF.getDwarfGnuPubTypesSection());
+  } else if (HasDwarfPubSections) {
+    emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
+    emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
   }
 
   DwarfStrSectionSym =
@@ -2358,6 +2358,10 @@ static dwarf::PubIndexEntryDescriptor computeIndexValue(CompileUnit *CU,
   case dwarf::DW_TAG_structure_type:
   case dwarf::DW_TAG_union_type:
   case dwarf::DW_TAG_enumeration_type:
+    return dwarf::PubIndexEntryDescriptor(
+        dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus
+                              ? dwarf::GIEL_STATIC
+                              : dwarf::GIEL_EXTERNAL);
   case dwarf::DW_TAG_typedef:
   case dwarf::DW_TAG_base_type:
   case dwarf::DW_TAG_subrange_type:
@@ -2446,7 +2450,9 @@ void DwarfDebug::emitDebugPubNames(bool GnuStyle) {
 
 void DwarfDebug::emitDebugPubTypes(bool GnuStyle) {
   const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
-  const MCSection *PSec = Asm->getObjFileLowering().getDwarfPubTypesSection();
+  const MCSection *PSec =
+      GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
+               : Asm->getObjFileLowering().getDwarfPubTypesSection();
 
   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
                                                          E = CUMap.end();
index 0dd668a0d8b4d31beda48746101ccd5fe26f9c2d..54320be7e78aa663ed191ac3e297dc476e66cd5e 100644 (file)
 ;   int global_namespace_variable = 1;
 ; }
 
-
+; ASM: .section        .debug_gnu_pubnames
 ; ASM: .byte   32                      # Kind: VARIABLE, EXTERNAL
 
+; ASM: .section        .debug_gnu_pubtypes
+; ASM: .byte   16                      # Kind: TYPE, EXTERNAL
+
 ; CHECK: .debug_info contents:
 ; CHECK: 0x00000046: DW_TAG_subprogram
 ; CHECK-NEXT: DW_AT_MIPS_linkage_name