Skip to content

Commit 76e37b1

Browse files
authored
[DirectX] fix illegal behavior flag in module flags. (#96577)
For DXIL which is based on llvm 3.7, max supported behavior flag for module flags is 6. The commit will check all module flags, for behavior flag > 6, change it to 2 (Warning). This is to fix the behavior flag part for #96912.
1 parent 0870afa commit 76e37b1

File tree

6 files changed

+70
-6
lines changed

6 files changed

+70
-6
lines changed

llvm/lib/Target/DirectX/DXILPrepare.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,31 @@ static void removeStringFunctionAttributes(Function &F,
116116
F.removeRetAttrs(DeadAttrs);
117117
}
118118

119+
static void cleanModuleFlags(Module &M) {
120+
NamedMDNode *MDFlags = M.getModuleFlagsMetadata();
121+
if (!MDFlags)
122+
return;
123+
124+
SmallVector<llvm::Module::ModuleFlagEntry> FlagEntries;
125+
M.getModuleFlagsMetadata(FlagEntries);
126+
bool Updated = false;
127+
for (auto &Flag : FlagEntries) {
128+
// llvm 3.7 only supports behavior up to AppendUnique.
129+
if (Flag.Behavior <= Module::ModFlagBehavior::AppendUnique)
130+
continue;
131+
Flag.Behavior = Module::ModFlagBehavior::Warning;
132+
Updated = true;
133+
}
134+
135+
if (!Updated)
136+
return;
137+
138+
MDFlags->eraseFromParent();
139+
140+
for (auto &Flag : FlagEntries)
141+
M.addModuleFlag(Flag.Behavior, Flag.Key->getString(), Flag.Val);
142+
}
143+
119144
class DXILPrepareModule : public ModulePass {
120145

121146
static Value *maybeGenerateBitcast(IRBuilder<> &Builder,
@@ -213,6 +238,8 @@ class DXILPrepareModule : public ModulePass {
213238
}
214239
}
215240
}
241+
// Remove flags not for DXIL.
242+
cleanModuleFlags(M);
216243
return true;
217244
}
218245

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
; RUN: opt -S -dxil-prepare < %s | FileCheck %s
2+
3+
; Make sure behavior flag > 6 is fixed.
4+
; CHECK: !{i32 2, !"frame-pointer", i32 2}
5+
; CHECK: !{i32 2, !"Dwarf Version", i32 4}
6+
; CHECK: !{i32 2, !"Debug Info Version", i32 3}
7+
8+
; Function Attrs: nounwind memory(none)
9+
define void @main() local_unnamed_addr #0 {
10+
entry:
11+
ret void
12+
}
13+
14+
attributes #0 = { nounwind memory(none) }
15+
!llvm.module.flags = !{!0, !1, !2, !3}
16+
17+
!0 = !{i32 1, !"wchar_size", i32 4}
18+
!1 = !{i32 7, !"frame-pointer", i32 2}
19+
!2 = !{i32 7, !"Dwarf Version", i32 4}
20+
!3 = !{i32 2, !"Debug Info Version", i32 3}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
; RUN: opt -S -dxil-prepare < %s | FileCheck %s
2+
3+
; CHECK: define void @main()
4+
; Make sure behavior flag > 6 is fixed.
5+
; CHECK:{i32 2, !"frame-pointer", i32 2}
6+
7+
; Function Attrs: nounwind memory(none)
8+
define void @main() local_unnamed_addr #0 {
9+
entry:
10+
ret void
11+
}
12+
13+
attributes #0 = { nounwind memory(none) }
14+
!llvm.module.flags = !{!0, !1}
15+
16+
!0 = !{i32 1, !"wchar_size", i32 4}
17+
!1 = !{i32 7, !"frame-pointer", i32 2}

llvm/test/tools/dxil-dis/di-compile-unit.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ target triple = "dxil-unknown-shadermodel6.7-library"
1313
; CHECK: !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "Some Compiler", isOptimized: true, runtimeVersion: 0, emissionKind: 1, enums: !2)
1414
; CHECK: !1 = !DIFile(filename: "di-compile-unit.src", directory: "/some-path")
1515
; CHECK: !2 = !{}
16-
; CHECK: !3 = !{i32 7, !"Dwarf Version", i32 2}
17-
; CHECK: !4 = !{i32 2, !"Debug Info Version", i32 3}
16+
; CHECK: !{i32 2, !"Dwarf Version", i32 2}
17+
; CHECK: !{i32 2, !"Debug Info Version", i32 3}

llvm/test/tools/dxil-dis/di-subprogram.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ target triple = "dxil-unknown-shadermodel6.7-library"
1212
!1 = !DIFile(filename: "some-source", directory: "some-path")
1313
!2 = !{}
1414

15-
; CHECK: !3 = !{i32 7, !"Dwarf Version", i32 2}
16-
!3 = !{i32 7, !"Dwarf Version", i32 2}
15+
; CHECK: !3 = !{i32 2, !"Dwarf Version", i32 4}
16+
!3 = !{i32 2, !"Dwarf Version", i32 4}
1717
; CHECK: !4 = !{i32 2, !"Debug Info Version", i32 3}
1818
!4 = !{i32 2, !"Debug Info Version", i32 3}
1919

llvm/test/tools/dxil-dis/di-subrange.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ target triple = "dxil-unknown-shadermodel6.7-library"
44
!llvm.module.flags = !{!0, !1}
55
!llvm.dbg.cu = !{!2}
66

7-
!0 = !{i32 7, !"Dwarf Version", i32 2}
7+
!0 = !{i32 2, !"Dwarf Version", i32 4}
88
!1 = !{i32 2, !"Debug Info Version", i32 3}
99
!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "xyz", isOptimized: true, runtimeVersion: 0, emissionKind: 1, retainedTypes: !4)
1010
!3 = !DIFile(filename: "input.hlsl", directory: "/some/path")
@@ -17,7 +17,7 @@ target triple = "dxil-unknown-shadermodel6.7-library"
1717
; CHECK: !llvm.module.flags = !{!0, !1}
1818
; CHECK: !llvm.dbg.cu = !{!2}
1919

20-
; CHECK: !0 = !{i32 7, !"Dwarf Version", i32 2}
20+
; CHECK: !0 = !{i32 2, !"Dwarf Version", i32 4}
2121
; CHECK: !1 = !{i32 2, !"Debug Info Version", i32 3}
2222
; CHECK: !2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "xyz", isOptimized: true, runtimeVersion: 0, emissionKind: 1, retainedTypes: !4)
2323
; CHECK: !3 = !DIFile(filename: "input.hlsl", directory: "/some/path")

0 commit comments

Comments
 (0)