[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