Skip to content

Commit 52ba104

Browse files
committed
[DirectX] fix illegal behavior flag in module flags.
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 3641efc commit 52ba104

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-NOT: !{i32 7, !"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-NOT:{i32 7, !"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)