1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

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,"",@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
```
This commit is contained in:
Fangrui Song 2021-02-04 17:35:09 -08:00
parent d42b6ae9c0
commit 5481fc6d44

View File

@ -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,