[llvm] 86106cc - [DirectX] Make DISubprogram writing LLVM 3.7-compatible (#194418)

via llvm-commits llvm-commits at lists.llvm.org
Wed May 13 05:49:12 PDT 2026


Author: Harald van Dijk
Date: 2026-05-13T13:49:07+01:00
New Revision: 86106cc4ad52598dbefb0d9812ae4628b3f221c2

URL: https://github.com/llvm/llvm-project/commit/86106cc4ad52598dbefb0d9812ae4628b3f221c2
DIFF: https://github.com/llvm/llvm-project/commit/86106cc4ad52598dbefb0d9812ae4628b3f221c2.diff

LOG: [DirectX] Make DISubprogram writing LLVM 3.7-compatible (#194418)

Reverse the links between DICompileUnit and DISubprogram

Added: 
    

Modified: 
    llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp
    llvm/lib/Target/DirectX/DirectXIRPasses/DXILDebugInfo.cpp
    llvm/test/tools/dxil-dis/debug-info.ll
    llvm/test/tools/dxil-dis/di-subprogram.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp b/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp
index 984ddf8f334b7..b923861b98e9d 100644
--- a/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp
+++ b/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp
@@ -1538,7 +1538,7 @@ void DXILBitcodeWriter::writeDICompileUnit(const DICompileUnit *N,
   Record.push_back(N->getEmissionKind());
   Record.push_back(VE.getMetadataOrNullID(N->getEnumTypes().get()));
   Record.push_back(VE.getMetadataOrNullID(N->getRetainedTypes().get()));
-  Record.push_back(/* subprograms */ 0);
+  Record.push_back(VE.getMetadataOrNullID(DebugInfo.MDExtra.lookup(N)));
   Record.push_back(VE.getMetadataOrNullID(N->getGlobalVariables().get()));
   Record.push_back(VE.getMetadataOrNullID(N->getImportedEntities().get()));
   Record.push_back(N->getDWOId());
@@ -1565,7 +1565,7 @@ void DXILBitcodeWriter::writeDISubprogram(const DISubprogram *N,
   Record.push_back(N->getVirtualIndex());
   Record.push_back(N->getFlags());
   Record.push_back(N->isOptimized());
-  Record.push_back(VE.getMetadataOrNullID(N->getRawUnit()));
+  Record.push_back(VE.getMetadataOrNullID(DebugInfo.MDExtra.lookup(N)));
   Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams().get()));
   Record.push_back(VE.getMetadataOrNullID(N->getDeclaration()));
   Record.push_back(VE.getMetadataOrNullID(N->getRetainedNodes().get()));

diff  --git a/llvm/lib/Target/DirectX/DirectXIRPasses/DXILDebugInfo.cpp b/llvm/lib/Target/DirectX/DirectXIRPasses/DXILDebugInfo.cpp
index 1e638d0195327..923e2b531933a 100644
--- a/llvm/lib/Target/DirectX/DirectXIRPasses/DXILDebugInfo.cpp
+++ b/llvm/lib/Target/DirectX/DirectXIRPasses/DXILDebugInfo.cpp
@@ -40,5 +40,36 @@ DXILDebugInfoMap DXILDebugInfoPass::run(Module &M) {
     }
   }
 
+  std::vector<std::pair<const DICompileUnit *, const Metadata *>> CUSubprograms;
+
+  for (const Function &F : M) {
+    if (const DISubprogram *SP = F.getSubprogram()) {
+      auto *FunctionMD = ConstantAsMetadata::get(const_cast<Function *>(&F));
+      Res.MDExtra.insert({SP, FunctionMD});
+    }
+  }
+
+  for (const DISubprogram *SP : DIF.subprograms()) {
+    if (SP->getUnit())
+      CUSubprograms.push_back(
+          {SP->getUnit(), static_cast<const Metadata *>(SP)});
+  }
+
+  std::stable_sort(
+      CUSubprograms.begin(), CUSubprograms.end(), [](auto &&A, auto &&B) {
+        return std::less<const DICompileUnit *>()(A.first, B.first);
+      });
+  for (auto It = CUSubprograms.begin(), End = CUSubprograms.end(); It != End;) {
+    const DICompileUnit *CU = It->first;
+    const DICompileUnit *NewCU =
+        cast<DICompileUnit>(Res.MDReplace.lookup_or(CU, CU));
+    SmallVector<Metadata *, 16> Subprograms;
+    do {
+      Subprograms.push_back(const_cast<Metadata *>(It->second));
+    } while (++It != End && It->first == CU);
+    const auto *SubprogramsMD = MDTuple::get(M.getContext(), Subprograms);
+    Res.MDExtra.insert({NewCU, SubprogramsMD});
+  }
+
   return Res;
 }

diff  --git a/llvm/test/tools/dxil-dis/debug-info.ll b/llvm/test/tools/dxil-dis/debug-info.ll
index 420078a54dd3a..ccd564ea02f78 100644
--- a/llvm/test/tools/dxil-dis/debug-info.ll
+++ b/llvm/test/tools/dxil-dis/debug-info.ll
@@ -3,7 +3,7 @@
 target triple = "dxil-unknown-shadermodel6.7-library"
 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
 
-; CHECK: define float @fma(float, float, float) unnamed_addr #0 !dbg [[Fn:[!][0-9]+]]
+; CHECK: define float @fma(float, float, float) unnamed_addr #0
 define dso_local float @fma(float %0, float %1, float %2) local_unnamed_addr #0 !dbg !6 {
 ; CHECK-NEXT: call void @llvm.dbg.value(metadata float %0, metadata [[VarX:[!][0-9]+]], metadata [[Expr:[!][0-9]+]]), !dbg [[Line1:[!][0-9]+]]
 ; CHECK-NEXT: call void @llvm.dbg.value(metadata float %1, metadata [[VarY:[!][0-9]+]], metadata [[Expr]]), !dbg [[Line1]]
@@ -32,15 +32,15 @@ attributes #0 = { norecurse nounwind readnone willreturn "hlsl.export" }
 
 ; CHECK:      !0 = distinct !DICompileUnit
 ; CHECK-NEXT: !1 = !DIFile(filename:
-; CHECK:      [[Fn]] = distinct !DISubprogram(name: "fma",
-; CHECK:      [[VarX]] = !DILocalVariable(tag: DW_TAG_arg_variable
-; CHECK:      [[VarY]] = !DILocalVariable(tag: DW_TAG_arg_variable
-; CHECK:      [[VarZ]] = !DILocalVariable(tag: DW_TAG_arg_variable
-; CHECK-NEXT: [[Expr]] = !DIExpression()
-; CHECK-NEXT: [[Line1]] = !DILocation(line:
-; CHECK-NEXT: [[Line2]] = !DILocation(line:
-; CHECK-NEXT: [[Line3]] = !DILocation(line:
-; CHECK-NEXT: {{[!][0-9]+}} = !DILocation(line:
+; CHECK:      [[Fn:[!][0-9]+]] = distinct !DISubprogram(name: "fma",
+; CHECK:      [[VarX]] = !DILocalVariable(tag:
+; CHECK:      [[VarY]] = !DILocalVariable(tag:
+; CHECK:      [[VarZ]] = !DILocalVariable(tag:
+; CHECK:      [[Expr]] = !DIExpression()
+; CHECK:      [[Line1]] = !DILocation(line:
+; CHECK:      [[Line2]] = !DILocation(line:
+; CHECK:      [[Line3]] = !DILocation(line:
+; CHECK:      {{[!][0-9]+}} = !DILocation(line:
 
 !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None)
 !1 = !DIFile(filename: "in.c", directory: "dir")

diff  --git a/llvm/test/tools/dxil-dis/di-subprogram.ll b/llvm/test/tools/dxil-dis/di-subprogram.ll
index 912421fb28ae5..b30160681b6a4 100644
--- a/llvm/test/tools/dxil-dis/di-subprogram.ll
+++ b/llvm/test/tools/dxil-dis/di-subprogram.ll
@@ -1,16 +1,45 @@
 ; RUN: llc --filetype=obj %s -o - | dxil-dis -o - | FileCheck %s
 target triple = "dxil-unknown-shadermodel6.7-library"
 
+define float @fmaf(float %x, float %y, float %z) !dbg !4 {
+  unreachable
+}
+
 !llvm.dbg.cu = !{!0}
-!llvm.module.flags = !{!3, !4}
+!llvm.module.flags = !{!12, !13}
+!llvm.used = !{!5}
 
-; CHECK: !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "Some Compiler", isOptimized: true, runtimeVersion: 0, emissionKind: 1, enums: !2)
+; CHECK: !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "Some Compiler", isOptimized: true, runtimeVersion: 0, emissionKind: 1, enums: !2, subprograms: !3)
 !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "Some Compiler", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None)
 ; CHECK: !1 = !DIFile(filename: "some-source", directory: "some-path")
 !1 = !DIFile(filename: "some-source", directory: "some-path")
 !2 = !{}
 
-; CHECK: !3 = !{i32 2, !"Dwarf Version", i32 4}
-!3 = !{i32 2, !"Dwarf Version", i32 4}
-; CHECK: !4 = !{i32 2, !"Debug Info Version", i32 3}
-!4 = !{i32 2, !"Debug Info Version", i32 3}
+; CHECK: !4 = distinct !DISubprogram(name: "fmaf", scope: !1, file: !1, line: 1, type: !5, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped | 536870912, isOptimized: true, function: float (float, float, float)* @fmaf, variables: !8)
+!4 = distinct !DISubprogram(name: "fmaf", scope: !1, file: !1, line: 1, type: !5, scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !8)
+
+; CHECK: !5 = !DISubroutineType(types: !6)
+!5 = !DISubroutineType(types: !6)
+
+; CHECK: !6 = !{!7, !7, !7, !7}
+!6 = !{!7, !7, !7, !7}
+
+; CHECK: !7 = !DIBasicType(name: "float", size: 32, encoding: DW_ATE_float)
+!7 = !DIBasicType(name: "float", size: 32, encoding: DW_ATE_float)
+
+; CHECK: !8 = !{!9, !10, !11}
+!8 = !{!9, !10, !11}
+
+; CHECK: !9 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "x", arg: 1, scope: !4, file: !1, line: 1, type: !7)
+!9 = !DILocalVariable(name: "x", arg: 1, scope: !4, file: !1, line: 1, type: !7)
+
+; CHECK: !10 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "y", arg: 2, scope: !4, file: !1, line: 1, type: !7)
+!10 = !DILocalVariable(name: "y", arg: 2, scope: !4, file: !1, line: 1, type: !7)
+
+; CHECK: !11 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "z", arg: 3, scope: !4, file: !1, line: 1, type: !7)
+!11 = !DILocalVariable(name: "z", arg: 3, scope: !4, file: !1, line: 1, type: !7)
+
+; CHECK: !12 = !{i32 2, !"Dwarf Version", i32 4}
+!12 = !{i32 2, !"Dwarf Version", i32 4}
+; CHECK: !13 = !{i32 2, !"Debug Info Version", i32 3}
+!13 = !{i32 2, !"Debug Info Version", i32 3}


        


More information about the llvm-commits mailing list