Skip to content

Conversation

@inbelic
Copy link
Contributor

@inbelic inbelic commented Oct 27, 2025

This pr introduces an allow-list for module metadata, this encompasses the llvm metadata nodes: llvm.ident and llvm.module.flags, as well as, the generated dx. options.

Resolves: #164473.

@inbelic inbelic force-pushed the inbelic/dxil-allowlist branch from 75fe9a2 to 0c6079a Compare October 27, 2025 18:18
@inbelic inbelic marked this pull request as ready for review October 27, 2025 18:23
@llvmbot
Copy link
Member

llvmbot commented Oct 27, 2025

@llvm/pr-subscribers-backend-directx

Author: Finn Plummer (inbelic)

Changes

This pr introduces an allow-list for module metadata, this encompasses the llvm metadata nodes: llvm.ident and llvm.module.flags, as well as, the generated dx. options.

Resolves: #164473.


Full diff: https://github.com/llvm/llvm-project/pull/165290.diff

2 Files Affected:

  • (modified) llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp (+21-13)
  • (added) llvm/test/CodeGen/DirectX/strip-module-md.ll (+75)
diff --git a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
index 1e4797bbd05aa..be31da15581a3 100644
--- a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
+++ b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
@@ -364,6 +364,16 @@ static void cleanModuleFlags(Module &M) {
     M.addModuleFlag(Flag.Behavior, Flag.Key->getString(), Flag.Val);
 }
 
+using GlobalMDList = std::array<StringLiteral, 7>;
+
+// The following are compatible with DXIL but not emit with clang, they can
+// be added when applicable:
+// dx.typeAnnotations, dx.viewIDState, dx.dxrPayloadAnnotations
+static GlobalMDList CompatibleNamedModuleMDs = {
+    "llvm.ident",     "llvm.module.flags", "dx.resources",   "dx.valver",
+    "dx.shaderModel", "dx.version",        "dx.entryPoints",
+};
+
 static void translateGlobalMetadata(Module &M, DXILResourceMap &DRM,
                                     DXILResourceTypeMap &DRTM,
                                     const ModuleShaderFlags &ShaderFlags,
@@ -426,19 +436,17 @@ static void translateGlobalMetadata(Module &M, DXILResourceMap &DRM,
 
   cleanModuleFlags(M);
 
-  // dx.rootsignatures will have been parsed from its metadata form as its
-  // binary form as part of the RootSignatureAnalysisWrapper, so safely
-  // remove it as it is not recognized in DXIL
-  if (NamedMDNode *RootSignature = M.getNamedMetadata("dx.rootsignatures"))
-    RootSignature->eraseFromParent();
-
-  // llvm.errno.tbaa was recently added but is not supported in LLVM 3.7 and
-  // causes all tests using the DXIL Validator to fail.
-  //
-  // This is a temporary fix and should be replaced with a allowlist once
-  // we have determined all metadata that the DXIL Validator allows
-  if (NamedMDNode *ErrNo = M.getNamedMetadata("llvm.errno.tbaa"))
-    ErrNo->eraseFromParent();
+  // Finally, strip all module metadata that is not explicitly specified in the
+  // allow-list
+  SmallVector<NamedMDNode *> ToStrip;
+
+  for (NamedMDNode &NamedMD : M.named_metadata())
+    if (!NamedMD.getName().starts_with("llvm.dbg.") &&
+        !llvm::is_contained(CompatibleNamedModuleMDs, NamedMD.getName()))
+      ToStrip.push_back(&NamedMD);
+
+  for (NamedMDNode *NamedMD : ToStrip)
+    NamedMD->eraseFromParent();
 }
 
 PreservedAnalyses DXILTranslateMetadata::run(Module &M,
diff --git a/llvm/test/CodeGen/DirectX/strip-module-md.ll b/llvm/test/CodeGen/DirectX/strip-module-md.ll
new file mode 100644
index 0000000000000..4d8b9ec935f6b
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/strip-module-md.ll
@@ -0,0 +1,75 @@
+; RUN: opt -S -dxil-translate-metadata < %s | FileCheck %s
+
+; Ensures that only metadata explictly specified on the allow list, or debug
+; related, metadata is emitted
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK-NOT: !dx.rootsignatures
+; CHECK-NOT: !llvm.errno.tbaa
+
+; CHECK-DAG: !llvm.dbg.cu
+
+; CHECK-DAG: !llvm.module.flags = !{![[#DWARF_VER:]], ![[#DEBUG_VER:]]}
+; CHECK-DAG: !llvm.ident = !{![[#IDENT:]]}
+
+; CHECK-DAG: !dx.shaderModel
+; CHECK-DAG: !dx.version
+; CHECK-DAG: !dx.entryPoints
+; CHECK-DAG: !dx.valver
+; CHECK-DAG: !dx.resources
+
+; CHECK-NOT: !dx.rootsignatures
+; CHECK-NOT: !llvm.errno.tbaa
+
+; Check allowed llvm metadata structure to ensure it is still DXIL compatible
+; If this fails, please ensure that the updated form is DXIL compatible before
+; updating the test.
+
+; CHECK-DAG: ![[#IDENT]] = !{!"clang 22.0.0"}
+; CHECK-DAG: ![[#DWARF_VER]] = !{i32 2, !"Dwarf Version", i32 2}
+; CHECK-DAG: ![[#DEBUG_VER]] = !{i32 2, !"Debug Info Version", i32 3}
+
+; CHECK-NOT: !dx.rootsignatures
+; CHECK-NOT: !llvm.errno.tbaa
+
+@BufA.str = private unnamed_addr constant [5 x i8] c"BufA\00", align 1
+
+define void @main () #0 {
+entry:
+  %typed0 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
+              @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0(
+                  i32 3, i32 5, i32 1, i32 0, ptr @BufA.str)
+  ret void
+}
+
+attributes #0 = { noinline nounwind "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+; Incompatible
+!dx.rootsignatures = !{!2}
+!llvm.errno.tbaa = !{!5}
+
+; Compatible
+!llvm.dbg.cu = !{!8}
+!llvm.module.flags = !{!11, !12}
+!llvm.ident = !{!13}
+!dx.valver = !{!14}
+
+!2 = !{ ptr @main, !3, i32 2 }
+!3 = !{ !4 }
+!4 = !{ !"RootFlags", i32 1 }
+
+!5 = !{!6, !6, i64 0}
+!6 = !{!"omnipotent char", !7}
+!7 = !{!"Simple C/C++ TBAA"}
+
+!8 = distinct !DICompileUnit(language: DW_LANG_C99, file: !9, producer: "Some Compiler", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !10, splitDebugInlining: false, nameTableKind: None)
+!9 = !DIFile(filename: "hlsl.hlsl", directory: "/some-path")
+!10 = !{}
+
+!11 = !{i32 2, !"Dwarf Version", i32 2}
+!12 = !{i32 2, !"Debug Info Version", i32 3}
+
+!13 = !{!"clang 22.0.0"}
+
+!14 = !{i32 1, i32 1}

Copy link
Contributor

@bob80905 bob80905 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, just a nit question

for (NamedMDNode &NamedMD : M.named_metadata())
if (!NamedMD.getName().starts_with("llvm.dbg.") &&
!llvm::is_contained(CompatibleNamedModuleMDs, NamedMD.getName()))
ToStrip.push_back(&NamedMD);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Is the reason you don't erasefromparent right here because the for loop's iteration would skip over the next node?
I vaguely recall an std:: function that enabled deletion within a for loop without needing to make a separate list.

Copy link
Contributor Author

@inbelic inbelic Oct 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, it caused a crash when I removed it in place. Okay, sounds good. I will take look for it.

edit: it seems for this case for this case it isn't possible

Comment on lines +372 to +375
static GlobalMDList CompatibleNamedModuleMDs = {
"llvm.ident", "llvm.module.flags", "dx.resources", "dx.valver",
"dx.shaderModel", "dx.version", "dx.entryPoints",
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a very nit-picky thing but I would put each element of the list on its own line.
One of the benefits is if there is a new commit, the diff will show the line(s) added or removed as opposed to a reviewer needing to scan for a change in a single line.

Suggested change
static GlobalMDList CompatibleNamedModuleMDs = {
"llvm.ident", "llvm.module.flags", "dx.resources", "dx.valver",
"dx.shaderModel", "dx.version", "dx.entryPoints",
};
static GlobalMDList CompatibleNamedModuleMDs = {
"llvm.ident",
"llvm.module.flags",
"dx.resources",
"dx.valver",
"dx.shaderModel",
"dx.version",
"dx.entryPoints",
};

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, unfortunately clang-format does not :(

@Icohedron
Copy link
Contributor

Icohedron commented Oct 29, 2025

There seems to be a failing dxil-dis tests.
I think this one is of interest? tools/dxil-dis/md-manystrings.ll

2025-10-27T19:01:30.6994330Z ********************
2025-10-27T19:01:30.6994520Z FAIL: LLVM :: tools/dxil-dis/md-manystrings.ll (54511 of 60005)
2025-10-27T19:01:30.6994810Z ******************** TEST 'LLVM :: tools/dxil-dis/md-manystrings.ll' FAILED ********************
2025-10-27T19:01:30.6995040Z Exit Code: 1
2025-10-27T19:01:30.6995100Z 
2025-10-27T19:01:30.6995150Z Command Output (stdout):
2025-10-27T19:01:30.6995320Z --
2025-10-27T19:01:30.6995410Z # RUN: at line 1
2025-10-27T19:01:30.6996850Z /Users/cbieneman/actions-runner/_work/llvm-project/llvm-project/llvm-project/build/bin/llc --filetype=obj /Users/cbieneman/actions-runner/_work/llvm-project/llvm-project/llvm-project/llvm/test/tools/dxil-dis/md-manystrings.ll -o - | /Users/cbieneman/actions-runner/_work/llvm-project/llvm-project/llvm-project/build/bin/dxil-dis | /Users/cbieneman/actions-runner/_work/llvm-project/llvm-project/llvm-project/build/bin/FileCheck /Users/cbieneman/actions-runner/_work/llvm-project/llvm-project/llvm-project/llvm/test/tools/dxil-dis/md-manystrings.ll
2025-10-27T19:01:30.6998850Z # executed command: /Users/cbieneman/actions-runner/_work/llvm-project/llvm-project/llvm-project/build/bin/llc --filetype=obj /Users/cbieneman/actions-runner/_work/llvm-project/llvm-project/llvm-project/llvm/test/tools/dxil-dis/md-manystrings.ll -o -
2025-10-27T19:01:30.6999740Z # executed command: /Users/cbieneman/actions-runner/_work/llvm-project/llvm-project/llvm-project/build/bin/dxil-dis
2025-10-27T19:01:30.7000680Z # executed command: /Users/cbieneman/actions-runner/_work/llvm-project/llvm-project/llvm-project/build/bin/FileCheck /Users/cbieneman/actions-runner/_work/llvm-project/llvm-project/llvm-project/llvm/test/tools/dxil-dis/md-manystrings.ll
2025-10-27T19:01:30.7001340Z # .---command stderr------------
2025-10-27T19:01:30.7001830Z # | /Users/cbieneman/actions-runner/_work/llvm-project/llvm-project/llvm-project/llvm/test/tools/dxil-dis/md-manystrings.ll:42:10: error: CHECK: expected string not found in input
2025-10-27T19:01:30.7002460Z # | ; CHECK: !llvm.too_many_strings = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13, !14, !15, !16, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26, !27, !28, !29, !30, !31}
2025-10-27T19:01:30.7002730Z # |          ^
2025-10-27T19:01:30.7002850Z # | <stdin>:1:1: note: scanning from here
2025-10-27T19:01:30.7003120Z # | target datalayout = "e-m:e-p:32:32-i1:8-i8:8-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
2025-10-27T19:01:30.7003370Z # | ^
2025-10-27T19:01:30.7003460Z # | 
2025-10-27T19:01:30.7003560Z # | Input file: <stdin>
2025-10-27T19:01:30.7003910Z # | Check file: /Users/cbieneman/actions-runner/_work/llvm-project/llvm-project/llvm-project/llvm/test/tools/dxil-dis/md-manystrings.ll
2025-10-27T19:01:30.7004290Z # | 
2025-10-27T19:01:30.7004420Z # | -dump-input=help explains the following input dump.
2025-10-27T19:01:30.7004600Z # | 
2025-10-27T19:01:30.7004680Z # | Input was:
2025-10-27T19:01:30.7004780Z # | <<<<<<
2025-10-27T19:01:30.7005000Z # |           1: target datalayout = "e-m:e-p:32:32-i1:8-i8:8-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64" 
2025-10-27T19:01:30.7005380Z # | check:42     X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ error: no match found
2025-10-27T19:01:30.7005640Z # |           2: target triple = "dxil-ms-dx" 
2025-10-27T19:01:30.7005810Z # | check:42     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2025-10-27T19:01:30.7005960Z # |           3:  
2025-10-27T19:01:30.7006060Z # | check:42     ~
2025-10-27T19:01:30.7006230Z # |           4: !dx.shaderModel = !{!0} 
2025-10-27T19:01:30.7006390Z # | check:42     ~~~~~~~~~~~~~~~~~~~~~~~~
2025-10-27T19:01:30.7006540Z # |           5: !dx.version = !{!1} 
2025-10-27T19:01:30.7006680Z # | check:42     ~~~~~~~~~~~~~~~~~~~~
2025-10-27T19:01:30.7006830Z # |           6: !dx.entryPoints = !{!2} 
2025-10-27T19:01:30.7006980Z # | check:42     ~~~~~~~~~~~~~~~~~~~~~~~~
2025-10-27T19:01:30.7007110Z # |           .
2025-10-27T19:01:30.7007210Z # |           .
2025-10-27T19:01:30.7007300Z # |           .
2025-10-27T19:01:30.7007400Z # | >>>>>>
2025-10-27T19:01:30.7007500Z # `-----------------------------
2025-10-27T19:01:30.7007650Z # error: command failed with exit status: 1
2025-10-27T19:01:30.7007760Z 
2025-10-27T19:01:30.7007800Z --
2025-10-27T19:01:30.7007860Z 
2025-10-27T19:01:30.7007900Z ********************

this test checks that we can embed lots of string as metadata into DXIL
bitcode and retrieve it again

renaming the metadata to llvm.ident retains the testing with a DXIL
compatible metadata node
the intent of this test is to ensure that the metadata written with the
DXIL bitcode writer is correctly read back from being embedded in the
DXIL

removing the unrecognized metadata retains the test purpose
this test is redundant with respect to di-subprogram, so we can remove
it without reducing test coverage
@inbelic inbelic merged commit ad29838 into llvm:main Oct 29, 2025
11 checks passed
@llvm-ci
Copy link
Collaborator

llvm-ci commented Oct 29, 2025

LLVM Buildbot has detected a new failure on builder clang-aarch64-quick running on linaro-clang-aarch64-quick while building llvm at step 5 "ninja check 1".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/65/builds/24691

Here is the relevant piece of the build log for the reference
Step 5 (ninja check 1) failure: stage 1 checked (failure)
******************** TEST 'Clangd Unit Tests :: ./ClangdTests/50/335' FAILED ********************
Script(shard):
--
GTEST_OUTPUT=json:/home/tcwg-buildbot/worker/clang-aarch64-quick/stage1/tools/clang/tools/extra/clangd/unittests/./ClangdTests-Clangd Unit Tests-714018-50-335.json GTEST_SHUFFLE=0 GTEST_TOTAL_SHARDS=335 GTEST_SHARD_INDEX=50 /home/tcwg-buildbot/worker/clang-aarch64-quick/stage1/tools/clang/tools/extra/clangd/unittests/./ClangdTests
--

Note: This is test shard 51 of 335.
[==========] Running 4 tests from 4 test suites.
[----------] Global test environment set-up.
[----------] 1 test from ClangdServerTest
[ RUN      ] ClangdServerTest.SearchLibDir
ASTWorker building file /clangd-test/foo.cpp version null with command 
[/clangd-test]
clang -ffreestanding -xc++ --target=x86_64-unknown-linux-gnu -m64 --gcc-toolchain=/randomusr -stdlib=libstdc++ /clangd-test/foo.cpp
Driver produced command: cc1 -cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only -disable-free -clear-ast-before-backend -main-file-name foo.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -ffreestanding -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/clangd-test -fcoverage-compilation-dir=/clangd-test -resource-dir lib/clang/22 -internal-isystem /randomusr/lib/gcc/x86_64-linux-gnu/4.9.3/../../../../include/c++/4.9.3 -internal-isystem /randomusr/lib/gcc/x86_64-linux-gnu/4.9.3/../../../../include/c++/4.9.3/x86_64-linux-gnu/64 -internal-isystem /randomusr/lib/gcc/x86_64-linux-gnu/4.9.3/../../../../include/c++/4.9.3/backward -internal-isystem lib/clang/22/include -internal-isystem /usr/local/include -internal-isystem /randomusr/lib/gcc/x86_64-linux-gnu/4.9.3/../../../../x86_64-linux-gnu/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdeprecated-macro -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcxx-exceptions -fexceptions -no-round-trip-args -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -x c++ /clangd-test/foo.cpp
Building first preamble for /clangd-test/foo.cpp version null
Built preamble of size 239256 for file /clangd-test/foo.cpp version null in 0.07 seconds
not idle after addDocument
UNREACHABLE executed at ../llvm/clang-tools-extra/clangd/unittests/SyncAPI.cpp:22!
 #0 0x0000ca8da49f9184 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/tcwg-buildbot/worker/clang-aarch64-quick/stage1/tools/clang/tools/extra/clangd/unittests/./ClangdTests+0xd09184)
 #1 0x0000ca8da49f6c74 llvm::sys::RunSignalHandlers() (/home/tcwg-buildbot/worker/clang-aarch64-quick/stage1/tools/clang/tools/extra/clangd/unittests/./ClangdTests+0xd06c74)
 #2 0x0000ca8da49f9fc4 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #3 0x0000f88f903868f8 (linux-vdso.so.1+0x8f8)
 #4 0x0000f88f8fea2008 __pthread_kill_implementation ./nptl/./nptl/pthread_kill.c:44:76
 #5 0x0000f88f8fe5a83c gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #6 0x0000f88f8fe47134 abort ./stdlib/./stdlib/abort.c:81:7
 #7 0x0000ca8da49a53dc llvm::RTTIRoot::anchor() (/home/tcwg-buildbot/worker/clang-aarch64-quick/stage1/tools/clang/tools/extra/clangd/unittests/./ClangdTests+0xcb53dc)
 #8 0x0000ca8da483a2b4 clang::clangd::runCodeComplete(clang::clangd::ClangdServer&, llvm::StringRef, clang::clangd::Position, clang::clangd::CodeCompleteOptions) (/home/tcwg-buildbot/worker/clang-aarch64-quick/stage1/tools/clang/tools/extra/clangd/unittests/./ClangdTests+0xb4a2b4)
 #9 0x0000ca8da42f2b7c clang::clangd::(anonymous namespace)::ClangdServerTest_SearchLibDir_Test::TestBody() ClangdTests.cpp:0:0
#10 0x0000ca8da4a537e0 testing::Test::Run() (/home/tcwg-buildbot/worker/clang-aarch64-quick/stage1/tools/clang/tools/extra/clangd/unittests/./ClangdTests+0xd637e0)
#11 0x0000ca8da4a54af0 testing::TestInfo::Run() (/home/tcwg-buildbot/worker/clang-aarch64-quick/stage1/tools/clang/tools/extra/clangd/unittests/./ClangdTests+0xd64af0)
#12 0x0000ca8da4a556b8 testing::TestSuite::Run() (/home/tcwg-buildbot/worker/clang-aarch64-quick/stage1/tools/clang/tools/extra/clangd/unittests/./ClangdTests+0xd656b8)
#13 0x0000ca8da4a66400 testing::internal::UnitTestImpl::RunAllTests() (/home/tcwg-buildbot/worker/clang-aarch64-quick/stage1/tools/clang/tools/extra/clangd/unittests/./ClangdTests+0xd76400)
#14 0x0000ca8da4a65d6c testing::UnitTest::Run() (/home/tcwg-buildbot/worker/clang-aarch64-quick/stage1/tools/clang/tools/extra/clangd/unittests/./ClangdTests+0xd75d6c)
#15 0x0000ca8da4a3fbcc main (/home/tcwg-buildbot/worker/clang-aarch64-quick/stage1/tools/clang/tools/extra/clangd/unittests/./ClangdTests+0xd4fbcc)
#16 0x0000f88f8fe47400 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#17 0x0000f88f8fe474d8 call_init ./csu/../csu/libc-start.c:128:20
#18 0x0000f88f8fe474d8 __libc_start_main ./csu/../csu/libc-start.c:379:5
#19 0x0000ca8da41857b0 _start (/home/tcwg-buildbot/worker/clang-aarch64-quick/stage1/tools/clang/tools/extra/clangd/unittests/./ClangdTests+0x4957b0)

--
exit: -6
--
shard JSON output does not exist: /home/tcwg-buildbot/worker/clang-aarch64-quick/stage1/tools/clang/tools/extra/clangd/unittests/./ClangdTests-Clangd Unit Tests-714018-50-335.json
********************


aokblast pushed a commit to aokblast/llvm-project that referenced this pull request Oct 30, 2025
…165290)

This pr introduces an allow-list for module metadata, this encompasses
the llvm metadata nodes: `llvm.ident` and `llvm.module.flags`, as well
as, the generated `dx.` options.

Resolves: llvm#164473.
DEBADRIBASAK pushed a commit to DEBADRIBASAK/llvm-project that referenced this pull request Nov 3, 2025
…165290)

This pr introduces an allow-list for module metadata, this encompasses
the llvm metadata nodes: `llvm.ident` and `llvm.module.flags`, as well
as, the generated `dx.` options.

Resolves: llvm#164473.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DirectX] Use an allowlist for DXIL-compatible module metadata

5 participants