[LLD][COFF] Ignore DEBUG_S_XFGHASH_TYPE/VIRTUAL
authorTobias Hieta <tobias@hieta.se>
Mon, 8 Aug 2022 13:53:15 +0000 (15:53 +0200)
committerTobias Hieta <tobias@hieta.se>
Mon, 8 Aug 2022 13:53:52 +0000 (15:53 +0200)
These are new debug types that ships with the latest
Windows SDK and would warn and finally fail lld-link.

The symbols seems to be related to Microsoft's XFG
which is their version of CFG. We can't handle any of
this yet, so for now we can just ignore these types
so that lld doesn't fail with a new version of Windows
SDK.

Fixes: #56285

Reviewed By: rnk

Differential Revision: https://reviews.llvm.org/D129378

lld/COFF/PDB.cpp
lld/test/COFF/pdb-unknown-subsection.s
lld/test/COFF/pdb-xfg-section.s [new file with mode: 0644]
llvm/include/llvm/DebugInfo/CodeView/CodeView.h
llvm/lib/DebugInfo/PDB/Native/FormatUtil.cpp

index 87b6bb5..2da63ab 100644 (file)
@@ -811,6 +811,10 @@ void DebugSHandler::handleDebugS(SectionChunk *debugChunk) {
       // Unclear what this is for.
       break;
 
+    case DebugSubsectionKind::XfgHashType:
+    case DebugSubsectionKind::XfgHashVirtual:
+      break;
+
     default:
       warn("ignoring unknown debug$S subsection kind 0x" +
            utohexstr(uint32_t(ss.kind())) + " in file " + toString(&file));
index 10ffa46..a1f369c 100644 (file)
@@ -7,7 +7,7 @@
 # RUN: llvm-pdbutil dump -symbols %t.pdb | FileCheck %s
 
 # WARNING-NOT: ignoring unknown
-# WARNING: ignoring unknown debug$S subsection kind 0xFF
+# WARNING: ignoring unknown debug$S subsection kind 0x1FF
 # WARNING-NOT: ignoring unknown
 
 # CHECK:                           Symbols
@@ -43,7 +43,7 @@ ret
        .p2align        2
 .Ltmp8:
 .Ltmp6:
-       .long   0xFF # Unknown subsection kind
+       .long   0x1FF # Unknown subsection kind
        .long   4           # Subsection size
        .long  0
        .long   0x800000F1 # Unknown subsection kind
diff --git a/lld/test/COFF/pdb-xfg-section.s b/lld/test/COFF/pdb-xfg-section.s
new file mode 100644 (file)
index 0000000..5983de5
--- /dev/null
@@ -0,0 +1,47 @@
+// Check that we ignore XFG subsections in CodeView information.
+// This test should be removed if we ever end up adding XFG support to lld.
+
+# REQUIRES: x86
+# RUN: llvm-mc -triple=i386-pc-win32 -filetype=obj -o %t.obj %s
+# RUN: lld-link -verbose -safeseh:no -subsystem:console -debug -nodefaultlib -entry:foo -out:%t.exe -pdb:%t.pdb %t.obj 2>&1 | FileCheck %s
+
+// XFGHashType should not generate a warning
+# CHECK-NOT: ignoring unknown debug$S subsection kind 0xFF
+// XFGHashVirtual should not generate a warning
+# CHECK-NOT: ignoring unknown debug$S subsection kind 0x100
+
+.text
+_foo:
+ret
+
+.global _foo
+
+.section .debug$S,"dr"
+       .p2align        2
+       .long   4                       # Debug section magic
+       .long   0xF1 # Symbol subsection
+       .long   .Ltmp6-.Ltmp5           # Subsection size
+.Ltmp5:
+       .short  .Ltmp8-.Ltmp7           # Record length
+.Ltmp7:
+       .short  4412                    # Record kind: S_COMPILE3
+       .long   0                       # Flags and language
+       .short  208                     # CPUType
+       .short  9                       # Frontend version
+       .short  0
+       .short  0
+       .short  0
+       .short  9000                    # Backend version
+       .short  0
+       .short  0
+       .short  0
+       .asciz  "clang version SENTINEL" # Null-terminated compiler version string
+       .p2align        2
+.Ltmp8:
+.Ltmp6:
+       .long   0xFF # XFGHashType subsection
+       .long   4           # Subsection size
+       .long  0
+       .long   0x100 # XFGHashVirtual subsection
+       .long   4           # Subsection size
+       .long  0
index d4cb6ae..b7a3e15 100644 (file)
@@ -330,6 +330,9 @@ enum class DebugSubsectionKind : uint32_t {
   MergedAssemblyInput = 0xfc,
 
   CoffSymbolRVA = 0xfd,
+
+  XfgHashType = 0xff,
+  XfgHashVirtual = 0x100,
 };
 
 /// Equivalent to CV_ptrtype_e.
index a167d45..9c05d58 100644 (file)
@@ -66,6 +66,8 @@ std::string llvm::pdb::formatChunkKind(DebugSubsectionKind Kind,
       RETURN_CASE(DebugSubsectionKind, MergedAssemblyInput,
                   "merged assembly input");
       RETURN_CASE(DebugSubsectionKind, CoffSymbolRVA, "coff symbol rva");
+      RETURN_CASE(DebugSubsectionKind, XfgHashType, "xfg hash type");
+      RETURN_CASE(DebugSubsectionKind, XfgHashVirtual, "xfg hash virtual");
     }
   } else {
     switch (Kind) {
@@ -89,6 +91,11 @@ std::string llvm::pdb::formatChunkKind(DebugSubsectionKind Kind,
                   "DEBUG_S_MERGED_ASSEMBLYINPUT");
       RETURN_CASE(DebugSubsectionKind, CoffSymbolRVA,
                   "DEBUG_S_COFF_SYMBOL_RVA");
+      RETURN_CASE(DebugSubsectionKind, XfgHashType,
+                  "DEBUG_S_XFGHASH_TYPE");
+      RETURN_CASE(DebugSubsectionKind, XfgHashVirtual,
+                  "DEBUG_S_XFGHASH_VIRTUAL");
+
     }
   }
   return formatUnknownEnum(Kind);