[llvm] 56fa34a - DebugInfo: Temporarily work around -gsplit-dwarf + LTO .debug_gnu_pubnames regression after D94976

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 4 17:35:16 PST 2021


Author: Fangrui Song
Date: 2021-02-04T17:35:09-08:00
New Revision: 56fa34ae3570a34fd0f4c2cf1bfaf095da01a959

URL: https://github.com/llvm/llvm-project/commit/56fa34ae3570a34fd0f4c2cf1bfaf095da01a959
DIFF: https://github.com/llvm/llvm-project/commit/56fa34ae3570a34fd0f4c2cf1bfaf095da01a959.diff

LOG: DebugInfo: Temporarily work around -gsplit-dwarf + LTO .debug_gnu_pubnames regression after D94976

`-flto -gsplit-dwarf -g -O[123]` may create .debug_gnu_pubnames with 0 DIE
offset entries. llvm-dwarfdump -debug-gnu-pubnames/ld.lld --gdb-index errors for that.

```
        .section        .debug_gnu_pubnames,"", at progbits
        .long   .LpubNames_end2-.LpubNames_begin2 # Length of Public Names Info
.LpubNames_begin2:
        .short  2                               # DWARF Version
        .long   .Lcu_begin2                     # Offset of Compilation Unit Info
        .long   57                              # Compilation Unit Length
        .long   0                               # DIE offset
        .byte   16                              # Attributes: TYPE, EXTERNAL
        .asciz  "absl"                          # External Name
        .long   0                               # DIE offset
        .byte   16                              # Attributes: TYPE, EXTERNAL
        .asciz  "absl::base_internal"           # External Name
        .long   0                               # End Mark
```

Added: 
    

Modified: 
    llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
index 23b347f8c907..396df74722bf 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
@@ -551,7 +551,9 @@ DIE *DwarfUnit::getOrCreateContextDIE(const DIScope *Context) {
   if (auto *SP = dyn_cast<DISubprogram>(Context)) {
     assert(SP->isDefinition());
     // When generating type units, each unit gets its own subprogram.
-    if (DD->generateTypeUnits())
+    // FIXME: constructSubprogramDefinitionDIE may produce .debug_gnu_pubnames
+    // with 0 DIE Offset entries with split dwarf.
+    if (DD->generateTypeUnits() || DD->useSplitDwarf())
       return getOrCreateSubprogramDIE(SP);
 
     // Subprogram definitions should be created in the Unit that they specify,


        


More information about the llvm-commits mailing list