From 1c9bcb5569dbd4749862e438015a96bc8fbe2f26 Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Tue, 12 May 2026 09:11:06 -0500 Subject: [PATCH 1/5] Embed built-in headers in library binary This change modifies the dxcompiler library build to embed built-in headers as binary data in the library, and it connects the include handler such that angle bracket (`<>`) includes will resolve against the built-in headers if corresponding headers are not found on the filesystem. This allows users to override the headers by pointing to local copies on the filesystem, but also allows users to not worry about distributing the files with their compiler. The main tradeoff here is a larger compiler binary since we're embedding some big chunks of static data. --- .../include/clang/Lex/HLSLEmbeddedHeaders.h | 38 +++++ .../lib/Frontend/VerifyDiagnosticConsumer.cpp | 9 ++ .../Headers/hlsl/vk/khr/cooperative_matrix.h | 4 +- .../hlsl/vk/khr/cooperative_matrix.impl | 2 +- tools/clang/lib/Lex/CMakeLists.txt | 94 ++++++++++++ tools/clang/lib/Lex/HLSLEmbeddedHeaders.cpp | 46 ++++++ tools/clang/lib/Lex/PPDirectives.cpp | 57 ++++++++ tools/clang/test/CMakeLists.txt | 2 - .../hlsl/embedded_headers/Inputs/enable_if.h | 16 ++ .../embedded_headers/embedded_header.hlsl | 15 ++ .../embedded_header_include_path.hlsl | 23 +++ .../embedded_header_nested.hlsl | 15 ++ .../embedded_header_quoted.hlsl | 11 ++ .../embedded_header_windows_path.hlsl | 18 +++ utils/embed_header.py | 105 +++++++++++++ utils/generate_hlsl_embedded_headers.py | 138 ++++++++++++++++++ 16 files changed, 588 insertions(+), 5 deletions(-) create mode 100644 tools/clang/include/clang/Lex/HLSLEmbeddedHeaders.h create mode 100644 tools/clang/lib/Lex/HLSLEmbeddedHeaders.cpp create mode 100644 tools/clang/test/SemaHLSL/hlsl/embedded_headers/Inputs/enable_if.h create mode 100644 tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header.hlsl create mode 100644 tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_include_path.hlsl create mode 100644 tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_nested.hlsl create mode 100644 tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_quoted.hlsl create mode 100644 tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_windows_path.hlsl create mode 100644 utils/embed_header.py create mode 100644 utils/generate_hlsl_embedded_headers.py diff --git a/tools/clang/include/clang/Lex/HLSLEmbeddedHeaders.h b/tools/clang/include/clang/Lex/HLSLEmbeddedHeaders.h new file mode 100644 index 0000000000..db4931f789 --- /dev/null +++ b/tools/clang/include/clang/Lex/HLSLEmbeddedHeaders.h @@ -0,0 +1,38 @@ +//===- HLSLEmbeddedHeaders.h - Embedded HLSL header data ------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Provides access to the contents of the HLSL header files that ship with +// DXC (located under tools/clang/lib/Headers/hlsl) as compiled-in data. +// +// The data is generated at build time from those header files by +// utils/embed_header.py and utils/generate_hlsl_embedded_headers.py. The +// resulting StringMap maps each header's path relative to the hlsl/ +// directory (with no leading separator, e.g. "dx/linalg.h") to the raw +// bytes of that file. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_LEX_HLSLEMBEDDEDHEADERS_H +#define LLVM_CLANG_LEX_HLSLEMBEDDEDHEADERS_H + +#include "llvm/ADT/StringMap.h" +#include "llvm/ADT/StringRef.h" + +namespace clang { +namespace hlsl { + +/// Returns a map from each HLSL header's relative path under +/// tools/clang/lib/Headers/hlsl (e.g. "dx/linalg.h") to a StringRef +/// holding the file's raw contents. +const llvm::StringMap &getEmbeddedHeaders(); + +} // namespace hlsl +} // namespace clang + +#endif // LLVM_CLANG_LEX_HLSLEMBEDDEDHEADERS_H diff --git a/tools/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp b/tools/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp index 884befc8ad..9df43dc633 100644 --- a/tools/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp +++ b/tools/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp @@ -407,6 +407,15 @@ static bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM, const FileEntry *FE = PP->LookupFile(Pos, Filename, false, nullptr, nullptr, CurDir, nullptr, nullptr, nullptr); + // HLSL Change Begin - if the quoted lookup did not find the file, + // retry as an angled lookup so that bundled HLSL headers (resolved + // via clang::hlsl::getEmbeddedHeaders()) are also reachable from + // expected-* directives by their relative path. + if (!FE) { + FE = PP->LookupFile(Pos, Filename, true, nullptr, nullptr, CurDir, + nullptr, nullptr, nullptr); + } + // HLSL Change End if (!FE) { Diags.Report(Pos.getLocWithOffset(PH.C-PH.Begin), diag::err_verify_missing_file) << Filename << KindStr; diff --git a/tools/clang/lib/Headers/hlsl/vk/khr/cooperative_matrix.h b/tools/clang/lib/Headers/hlsl/vk/khr/cooperative_matrix.h index a53ab4cbcb..9d2ced02ca 100644 --- a/tools/clang/lib/Headers/hlsl/vk/khr/cooperative_matrix.h +++ b/tools/clang/lib/Headers/hlsl/vk/khr/cooperative_matrix.h @@ -11,7 +11,7 @@ #error "CooperativeMatrix requires a minimum of SPIR-V 1.6" #endif -#include "vk/spirv.h" +#include namespace vk { namespace khr { @@ -271,5 +271,5 @@ cooperativeMatrixSaturatingMultiplyAdd( } // namespace khr } // namespace vk -#include "cooperative_matrix.impl" +#include #endif // _HLSL_VK_KHR_COOPERATIVE_MATRIX_H_ diff --git a/tools/clang/lib/Headers/hlsl/vk/khr/cooperative_matrix.impl b/tools/clang/lib/Headers/hlsl/vk/khr/cooperative_matrix.impl index 2acae8ec96..7446d33a4a 100644 --- a/tools/clang/lib/Headers/hlsl/vk/khr/cooperative_matrix.impl +++ b/tools/clang/lib/Headers/hlsl/vk/khr/cooperative_matrix.impl @@ -4,7 +4,7 @@ // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -#include "vk/opcode_selector.h" +#include template [[vk::ext_instruction(/* OpMatrixTimesScalar */ 143)]] ResultType diff --git a/tools/clang/lib/Lex/CMakeLists.txt b/tools/clang/lib/Lex/CMakeLists.txt index b092445434..91f10316ad 100644 --- a/tools/clang/lib/Lex/CMakeLists.txt +++ b/tools/clang/lib/Lex/CMakeLists.txt @@ -2,9 +2,102 @@ set(LLVM_LINK_COMPONENTS support) +# ---------------------------------------------------------------------------- +# Embedded HLSL headers. +# +# Each file under tools/clang/lib/Headers/hlsl/ that we want to ship as +# compiled-in data is converted at build time to a small C++ snippet (an +# llvm::StringRef "Data" definition) by utils/embed_header.py. A second +# script (utils/generate_hlsl_embedded_headers.py) then aggregates those +# snippets into two ``.inc`` files: +# +# * HLSLEmbeddedHeadersDecls.inc -- one ``namespace { #include ... }`` +# per header so each ``Data`` lives in its own namespace. +# * HLSLEmbeddedHeadersEntries.inc -- an X-macro list of (rel_path, ns) +# pairs. +# +# Those ``.inc`` files are textually included by the hand-written +# HLSLEmbeddedHeaders.cpp in this directory, which exposes the whole +# collection through clang::hlsl::getEmbeddedHeaders() as a +# StringMap. This compiled-in data lets the preprocessor +# satisfy #includes of the bundled headers without consulting the +# filesystem. +# +# The list of embedded inputs is intentionally enumerated explicitly +# below: file(GLOB ...) is evaluated at configuration time, so a glob +# would silently miss files added between configure and build. +# Vulkan-specific headers under hlsl/vk/ are only embedded when SPIR-V +# codegen is enabled, to keep the DXC-only build free of unused data. +# ---------------------------------------------------------------------------- + +set(hlsl_headers_src_dir + "${CMAKE_CURRENT_SOURCE_DIR}/../Headers/hlsl") +set(hlsl_embedded_dir + "${CMAKE_CURRENT_BINARY_DIR}/HLSLEmbeddedHeaders") +set(embed_header_script + "${LLVM_MAIN_SRC_DIR}/utils/embed_header.py") +set(generate_embedded_headers_script + "${LLVM_MAIN_SRC_DIR}/utils/generate_hlsl_embedded_headers.py") + +set(hlsl_embedded_inputs + enable_if.h + vector_utils.h + dx/linalg.h + ) + +if (ENABLE_SPIRV_CODEGEN) + list(APPEND hlsl_embedded_inputs + vk/khr/cooperative_matrix.h + vk/khr/cooperative_matrix.impl + vk/opcode_selector.h + vk/spirv.h + ) +endif() + +set(hlsl_embedded_inc_files) +set(hlsl_embedded_entries) +foreach(rel_path ${hlsl_embedded_inputs}) + set(src "${hlsl_headers_src_dir}/${rel_path}") + set(inc "${hlsl_embedded_dir}/${rel_path}.inc") + add_custom_command( + OUTPUT "${inc}" + DEPENDS "${src}" "${embed_header_script}" + COMMAND "${Python3_EXECUTABLE}" "${embed_header_script}" "${src}" "${inc}" + COMMENT "Embedding HLSL header ${rel_path}") + list(APPEND hlsl_embedded_inc_files "${inc}") + list(APPEND hlsl_embedded_entries "--entry" "${rel_path}=${inc}") +endforeach() + +set(hlsl_embedded_decls "${hlsl_embedded_dir}/HLSLEmbeddedHeadersDecls.inc") +set(hlsl_embedded_entries_inc + "${hlsl_embedded_dir}/HLSLEmbeddedHeadersEntries.inc") +add_custom_command( + OUTPUT "${hlsl_embedded_decls}" "${hlsl_embedded_entries_inc}" + DEPENDS ${hlsl_embedded_inc_files} "${generate_embedded_headers_script}" + COMMAND "${Python3_EXECUTABLE}" "${generate_embedded_headers_script}" + --decls-output "${hlsl_embedded_decls}" + --entries-output "${hlsl_embedded_entries_inc}" + ${hlsl_embedded_entries} + COMMENT "Generating HLSL embedded headers includes") + +set_source_files_properties("${hlsl_embedded_decls}" + "${hlsl_embedded_entries_inc}" + PROPERTIES GENERATED TRUE) + +# Make the generated .inc files visible to HLSLEmbeddedHeaders.cpp. +include_directories("${hlsl_embedded_dir}") + +# Carry the generated .inc files as an explicit dependency of the +# library target so they're produced before HLSLEmbeddedHeaders.cpp is +# compiled. +set(hlsl_embedded_generated_files + "${hlsl_embedded_decls}" + "${hlsl_embedded_entries_inc}") + add_clang_library(clangLex HeaderMap.cpp HeaderSearch.cpp + HLSLEmbeddedHeaders.cpp HLSLMacroExpander.cpp Lexer.cpp LiteralSupport.cpp @@ -26,6 +119,7 @@ add_clang_library(clangLex ScratchBuffer.cpp TokenConcatenation.cpp TokenLexer.cpp + ${hlsl_embedded_generated_files} LINK_LIBS clangBasic diff --git a/tools/clang/lib/Lex/HLSLEmbeddedHeaders.cpp b/tools/clang/lib/Lex/HLSLEmbeddedHeaders.cpp new file mode 100644 index 0000000000..addd9ffa47 --- /dev/null +++ b/tools/clang/lib/Lex/HLSLEmbeddedHeaders.cpp @@ -0,0 +1,46 @@ +//===- HLSLEmbeddedHeaders.cpp - Embedded HLSL header data ----------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Implements clang::hlsl::getEmbeddedHeaders() by composing two small +// build-time generated ``.inc`` files (one with the per-header +// ``Data`` StringRef declarations, one with an X-macro list of the +// (rel_path, namespace) pairs) with hand-written boilerplate that +// remains in source control. +// +//===----------------------------------------------------------------------===// + +#include "clang/Lex/HLSLEmbeddedHeaders.h" + +#include "llvm/ADT/StringMap.h" +#include "llvm/ADT/StringRef.h" + +#include + +// Pulls in one ``namespace ns { #include ".inc" }`` block per +// embedded header. The included ``.inc`` snippets define a +// ``llvm::StringRef Data`` at namespace scope. +#include "HLSLEmbeddedHeadersDecls.inc" + +namespace clang { +namespace hlsl { + +const llvm::StringMap &getEmbeddedHeaders() { + static const llvm::StringMap Map = []() { + llvm::StringMap M; +#define HLSL_EMBEDDED_HEADER(REL, NS) \ + M.insert(std::make_pair(llvm::StringRef(REL), NS::Data)); +#include "HLSLEmbeddedHeadersEntries.inc" +#undef HLSL_EMBEDDED_HEADER + return M; + }(); + return Map; +} + +} // namespace hlsl +} // namespace clang diff --git a/tools/clang/lib/Lex/PPDirectives.cpp b/tools/clang/lib/Lex/PPDirectives.cpp index 08af04e9c5..4eeacf9831 100644 --- a/tools/clang/lib/Lex/PPDirectives.cpp +++ b/tools/clang/lib/Lex/PPDirectives.cpp @@ -18,6 +18,7 @@ #include "clang/Lex/CodeCompletionHandler.h" #include "clang/Lex/HeaderSearch.h" #include "clang/Lex/HeaderSearchOptions.h" +#include "clang/Lex/HLSLEmbeddedHeaders.h" #include "clang/Lex/LexDiagnostic.h" #include "clang/Lex/LiteralSupport.h" #include "clang/Lex/MacroInfo.h" @@ -25,9 +26,11 @@ #include "clang/Lex/Pragma.h" #include "llvm/ADT/APInt.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Path.h" #include "llvm/Support/SaveAndRestore.h" #include "clang/Lex/PreprocessorOptions.h" // HLSL Change - ignore line directives. +#include // HLSL Change - std::replace for path separator normalisation. using namespace clang; //===----------------------------------------------------------------------===// @@ -724,6 +727,60 @@ const FileEntry *Preprocessor::LookupFile( } } + // HLSL Change Begin - fall back to compiled-in HLSL header data when the + // angled #include's filename matches the relative path of one of the + // headers shipped under tools/clang/lib/Headers/hlsl. This lets the + // compiler resolve those headers without consulting the filesystem, + // while still allowing user-provided -I paths (or the source tree + // itself) to take precedence when present. + if (isAngled && !FromDir && !FromFile) { + const llvm::StringMap &EmbeddedHeaders = + hlsl::getEmbeddedHeaders(); + // The embedded-header map is keyed on POSIX-style relative paths + // (e.g. "dx/linalg.h"), but a user may write the include using + // Windows-style separators (e.g. ). Normalise any + // backslashes to forward slashes so either spelling resolves to + // the same compiled-in header. + SmallString<128> NormalizedFilename(Filename); + std::replace(NormalizedFilename.begin(), NormalizedFilename.end(), + '\\', '/'); + auto It = EmbeddedHeaders.find(NormalizedFilename); + if (It != EmbeddedHeaders.end()) { + llvm::StringRef Data = It->second; + // Use a recognisable virtual filename so the bundled header is + // easy to identify in diagnostics and source listings. The + // virtual name uses the normalised (POSIX-style) relative path + // so the displayed filename is canonical regardless of how the + // user spelled the include. + SmallString<128> VirtualName("/"); + VirtualName.append(NormalizedFilename.begin(), + NormalizedFilename.end()); + const FileEntry *EmbeddedFE = + FileMgr.getVirtualFile(VirtualName, Data.size(), /*ModTime=*/0); + if (EmbeddedFE) { + if (!SourceMgr.isFileOverridden(EmbeddedFE)) { + SourceMgr.overrideFileContents( + EmbeddedFE, + llvm::MemoryBuffer::getMemBuffer(Data, VirtualName, + /*RequiresNullTerminator=*/ + false)); + } + if (SearchPath) + SearchPath->clear(); + if (RelativePath) { + RelativePath->clear(); + RelativePath->append(NormalizedFilename.begin(), + NormalizedFilename.end()); + } + CurDir = nullptr; + if (SuggestedModule) + *SuggestedModule = ModuleMap::KnownHeader(); + return EmbeddedFE; + } + } + } + // HLSL Change End + // Otherwise, we really couldn't find the file. return nullptr; } diff --git a/tools/clang/test/CMakeLists.txt b/tools/clang/test/CMakeLists.txt index 6238196552..2c8eb6f609 100644 --- a/tools/clang/test/CMakeLists.txt +++ b/tools/clang/test/CMakeLists.txt @@ -9,8 +9,6 @@ endif () string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} CLANG_TOOLS_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) -set(HLSL_HEADERS_DIR ${LLVM_SOURCE_DIR}/tools/clang/lib/Headers/hlsl) # HLSL Change - configure_lit_site_cfg( ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg diff --git a/tools/clang/test/SemaHLSL/hlsl/embedded_headers/Inputs/enable_if.h b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/Inputs/enable_if.h new file mode 100644 index 0000000000..662cbe580c --- /dev/null +++ b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/Inputs/enable_if.h @@ -0,0 +1,16 @@ +// Overlay copy of enable_if.h used by embedded_header_include_path.hlsl to +// verify that an explicit -I search path takes precedence over the +// compiled-in HLSL headers. The unique HLSL_OVERLAY_ENABLE_IF macro lets +// the test confirm this overlay was the version actually included. + +#define HLSL_OVERLAY_ENABLE_IF 1 + +namespace hlsl { + +template struct enable_if {}; + +template struct enable_if { + using type = T; +}; + +} // namespace hlsl diff --git a/tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header.hlsl b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header.hlsl new file mode 100644 index 0000000000..bbde8d1015 --- /dev/null +++ b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header.hlsl @@ -0,0 +1,15 @@ +// RUN: %dxc -T ps_6_0 -E main -M %s | FileCheck %s +// RUN: %dxc -T ps_6_0 -E main -verify %s + +// Verify that the bundled HLSL header tools/clang/lib/Headers/hlsl/enable_if.h +// is found via the angled-#include "embedded headers" path even when no -I +// search path points at the hlsl/ directory. + +// expected-no-diagnostics + +#include + +float4 main() : SV_Target { return 0; } + +// CHECK: /enable_if.h + diff --git a/tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_include_path.hlsl b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_include_path.hlsl new file mode 100644 index 0000000000..d9470e5cfd --- /dev/null +++ b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_include_path.hlsl @@ -0,0 +1,23 @@ +// RUN: %dxc -T ps_6_0 -E main -I %S/Inputs -M %s | FileCheck %s +// RUN: %dxc -T ps_6_0 -E main -I %S/Inputs -verify %s + +// When -I points at a directory that contains a header whose name matches +// one of the compiled-in HLSL headers, an angle-bracket #include must +// resolve to the on-disk file rather than the embedded copy. This lets +// users inspect or override the bundled headers by dropping a same-named +// file into a directory on the include search path. + +// expected-no-diagnostics + +#include + +#ifndef HLSL_OVERLAY_ENABLE_IF +#error "Expected the on-disk overlay enable_if.h to take precedence over the embedded copy." +#endif + +float4 main() : SV_Target { return 0; } + +// The dependency dump must list the on-disk overlay path and must not +// reference the virtual built-in:hlsl filename used for embedded headers. +// CHECK-NOT: +// CHECK: Inputs{{[/\\]}}enable_if.h diff --git a/tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_nested.hlsl b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_nested.hlsl new file mode 100644 index 0000000000..3a7e66689a --- /dev/null +++ b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_nested.hlsl @@ -0,0 +1,15 @@ +// RUN: %dxc -T ps_6_0 -E main -M %s | FileCheck %s +// RUN: %dxc -T ps_6_0 -E main -verify %s + +// Verify that nested embedded HLSL headers (those under subdirectories of +// tools/clang/lib/Headers/hlsl) are also resolvable through the angled- +// #include path without any -I argument pointing at the hlsl/ directory. + +// expected-no-diagnostics + +#include + +float4 main() : SV_Target { return 0; } + +// CHECK: /dx/linalg.h + diff --git a/tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_quoted.hlsl b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_quoted.hlsl new file mode 100644 index 0000000000..4f55ca9bad --- /dev/null +++ b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_quoted.hlsl @@ -0,0 +1,11 @@ +// RUN: %dxc -T ps_6_0 -E main -verify %s + +// Quoted #includes should still go through the normal filesystem search +// path; the embedded-headers mechanism only kicks in for angle-bracket +// includes. Without a -I pointing at the hlsl/ directory, this quoted +// include must fail. + +#include "enable_if.h" // expected-error{{'enable_if.h' file not found}} + +float4 main() : SV_Target { return 0; } + diff --git a/tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_windows_path.hlsl b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_windows_path.hlsl new file mode 100644 index 0000000000..62c7245350 --- /dev/null +++ b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/embedded_header_windows_path.hlsl @@ -0,0 +1,18 @@ +// RUN: %dxc -T ps_6_0 -E main -M %s | FileCheck %s +// RUN: %dxc -T ps_6_0 -E main -verify %s + +// Verify that an embedded HLSL header is still found when the user spells +// the include path using Windows-style separators (backslashes) rather +// than forward slashes. The compiled-in map is keyed on POSIX-style +// relative paths, so the preprocessor must normalise the spelling before +// looking up the embedded header. + +// expected-no-diagnostics + +#include + +float4 main() : SV_Target { return 0; } + +// The dependency dump must list the canonical (forward-slash) virtual +// path even though the include used backslashes. +// CHECK: /dx/linalg.h diff --git a/utils/embed_header.py b/utils/embed_header.py new file mode 100644 index 0000000000..356279a482 --- /dev/null +++ b/utils/embed_header.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 +# Copyright (C) Microsoft Corporation. All rights reserved. +# This file is distributed under the University of Illinois Open Source License. +# See LICENSE.TXT for details. +"""Embed a file's contents into a generated C++ source as a StringRef. + +Reads the input file as bytes and produces a C++ snippet of the form: + + llvm::StringRef Data = + "" + "" + ...; + +The generated file declares a single variable named ``Data`` at namespace +scope. The intent is for the file to be ``#include``-ed inside a wrapping +namespace by the consumer. +""" + +import argparse +import os +import sys + + +def escape_byte(b): + # Backslash and double-quote must always be escaped. + if b == 0x5C: + return "\\\\" + if b == 0x22: + return "\\\"" + if b == 0x09: + return "\\t" + if b == 0x0A: + return "\\n" + if b == 0x0D: + return "\\r" + # Printable ASCII passes through unchanged. + if 0x20 <= b < 0x7F: + return chr(b) + # Use 3-digit octal escapes for everything else. Octal escapes + # consume at most 3 digits, so they cannot accidentally absorb + # subsequent characters in the literal. + return "\\{:03o}".format(b) + + +def escape_line(line_bytes): + return "".join(escape_byte(b) for b in line_bytes) + + +def generate(input_path, output_path): + with open(input_path, "rb") as f: + data = f.read() + + # Split on '\n' but preserve the newline at the end of each piece. + pieces = [] + start = 0 + for i, b in enumerate(data): + if b == 0x0A: + pieces.append(data[start:i + 1]) + start = i + 1 + if start < len(data): + pieces.append(data[start:]) + if not pieces: + pieces = [b""] + + lines = [] + lines.append("// Generated by utils/embed_header.py. Do not edit.") + lines.append("// Source: {}".format(os.path.basename(input_path))) + lines.append("llvm::StringRef Data =") + for piece in pieces: + lines.append(" \"{}\"".format(escape_line(piece))) + # Terminate the variable declaration. + lines[-1] = lines[-1] + ";" + lines.append("") + + output_text = "\n".join(lines) + + # Avoid touching the file if the contents are unchanged so that + # downstream build steps are not invalidated unnecessarily. + if os.path.exists(output_path): + try: + with open(output_path, "r", encoding="utf-8") as f: + if f.read() == output_text: + return + except OSError: + pass + + out_dir = os.path.dirname(output_path) + if out_dir and not os.path.isdir(out_dir): + os.makedirs(out_dir, exist_ok=True) + + with open(output_path, "w", encoding="utf-8") as f: + f.write(output_text) + + +def main(argv): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("input", help="Path to input file to embed.") + parser.add_argument("output", help="Path to generated C++ snippet.") + args = parser.parse_args(argv) + generate(args.input, args.output) + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff --git a/utils/generate_hlsl_embedded_headers.py b/utils/generate_hlsl_embedded_headers.py new file mode 100644 index 0000000000..775b46f9e2 --- /dev/null +++ b/utils/generate_hlsl_embedded_headers.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python3 +# Copyright (C) Microsoft Corporation. All rights reserved. +# This file is distributed under the University of Illinois Open Source License. +# See LICENSE.TXT for details. +"""Generate the HLSL embedded headers ``.inc`` files. + +For every header file under ``tools/clang/lib/Headers/hlsl`` that the build +system has embedded with ``embed_header.py`` (one ``.inc`` per source file +under ``/.inc``), produce two small ``.inc`` files +that are textually included by the hand-written +``tools/clang/lib/Lex/HLSLEmbeddedHeaders.cpp``: + +* ``--decls-output`` receives one ``namespace { #include "" }`` + block per header, where ```` is derived from the header's relative + path (slashes and dots replaced with underscores) so each file's ``Data`` + StringRef variable gets its own namespace and never collides with + another. + +* ``--entries-output`` receives one ``HLSL_EMBEDDED_HEADER(rel, ns)`` line + per header. The ``HLSLEmbeddedHeaders.cpp`` consumer ``#define``\\s + ``HLSL_EMBEDDED_HEADER`` before including this file, so the same list + can be expanded for both the declarations and the StringMap inserts. + +Splitting the generated content into two small ``.inc`` files keeps the +hand-written code in source control while limiting build-time generation +to data that genuinely depends on the on-disk header set. +""" + +import argparse +import os +import sys + + +def path_to_namespace(rel_path): + """Convert a relative header path to a valid C++ namespace identifier. + + Slashes and dots are replaced with underscores so that + ``dx/linalg.h`` becomes ``dx_linalg_h``. + """ + out = [] + for ch in rel_path: + if ch in ("/", "\\", "."): + out.append("_") + else: + out.append(ch) + return "".join(out) + + +def normalize_rel_path(rel_path): + """Normalize a relative path to use forward slashes and no leading ./.""" + rel_path = rel_path.replace("\\", "/") + while rel_path.startswith("./"): + rel_path = rel_path[2:] + return rel_path + + +def write_if_different(path, text): + if os.path.exists(path): + try: + with open(path, "r", encoding="utf-8") as f: + if f.read() == text: + return + except OSError: + pass + out_dir = os.path.dirname(path) + if out_dir and not os.path.isdir(out_dir): + os.makedirs(out_dir, exist_ok=True) + with open(path, "w", encoding="utf-8") as f: + f.write(text) + + +def generate(decls_output, entries_output, entries): + """Generate the two ``.inc`` files. + + ``entries`` is an iterable of ``(rel_path, inc_path)`` pairs where + ``rel_path`` is the path relative to ``hlsl/`` and ``inc_path`` is + the absolute path to the ``.inc`` snippet produced by + ``embed_header.py``. + """ + entries = sorted( + (normalize_rel_path(rel), inc) for rel, inc in entries) + + decls_lines = [] + decls_lines.append( + "// Generated by utils/generate_hlsl_embedded_headers.py.") + decls_lines.append("// Do not edit.") + decls_lines.append("") + for rel, inc in entries: + ns = path_to_namespace(rel) + # Use forward slashes in the include path so the generated file + # is portable across host platforms. + inc_fwd = inc.replace("\\", "/") + decls_lines.append("namespace {} {{".format(ns)) + decls_lines.append("#include \"{}\"".format(inc_fwd)) + decls_lines.append("}} // namespace {}".format(ns)) + decls_lines.append("") + + entries_lines = [] + entries_lines.append( + "// Generated by utils/generate_hlsl_embedded_headers.py.") + entries_lines.append("// Do not edit.") + entries_lines.append("") + for rel, _ in entries: + ns = path_to_namespace(rel) + entries_lines.append( + "HLSL_EMBEDDED_HEADER(\"{}\", {})".format(rel, ns)) + entries_lines.append("") + + write_if_different(decls_output, "\n".join(decls_lines)) + write_if_different(entries_output, "\n".join(entries_lines)) + + +def main(argv): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--decls-output", required=True, + help="Path to the generated declarations .inc file.") + parser.add_argument("--entries-output", required=True, + help="Path to the generated map-entries .inc file.") + parser.add_argument( + "--entry", action="append", default=[], + metavar="REL_PATH=INC_PATH", + help=("Relative header path (under hlsl/) and absolute path to its " + "embedded .inc file. May be specified multiple times.")) + args = parser.parse_args(argv) + + entries = [] + for spec in args.entry: + if "=" not in spec: + parser.error("--entry must be of the form REL_PATH=INC_PATH") + rel, inc = spec.split("=", 1) + entries.append((rel, inc)) + + generate(args.decls_output, args.entries_output, entries) + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) From 22d2c864a5e1e3af4ce9d7de0f83ff69bf4ba082 Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Tue, 12 May 2026 09:13:55 -0500 Subject: [PATCH 2/5] Update existing tests to use built-in headers This is a cleanup to make the existing tests use the built-in headers rather than finding them on the filesystem. --- .../hlsl/linalg/api/matrix-class.hlsl | 2 +- .../hlsl/linalg/api/matrix-multiply.hlsl | 2 +- .../CodeGenDXIL/hlsl/linalg/api/vectors.hlsl | 2 +- .../hlsl/linalg/attr-matrix-type.hlsl | 4 +- .../hlsl/linalg/linalg-matrix-type.hlsl | 4 +- .../test/CodeGenSPIRV/convert.selector.hlsl | 146 +++++++++--------- .../CodeGenSPIRV/coopmatrix.arithmetic.hlsl | 24 +-- .../test/CodeGenSPIRV/coopmatrix.convert.hlsl | 4 +- .../coopmatrix.element.access.hlsl | 4 +- .../coopmatrix.globallycoherent.hlsl | 4 +- .../CodeGenSPIRV/coopmatrix.groupshared.hlsl | 4 +- .../coopmatrix.memory.operand.hlsl | 4 +- .../CodeGenSPIRV/coopmatrix.old.spirv.hlsl | 4 +- .../CodeGenSPIRV/coopmatrix_muladd_test.hlsl | 4 +- .../workgroupspirvpointer.const.hlsl | 4 +- .../inline-spirv/workgroupspirvpointer.hlsl | 4 +- .../workgroupspirvpointer.varpointer.hlsl | 4 +- .../hlsl/linalg/linalg-matrix-ast.hlsl | 2 +- .../hlsl/linalg/linalg-matrix-error.hlsl | 2 +- .../linalg/matrix-attributed-type-ast.hlsl | 2 +- .../linalg/matrix-attributed-type-error.hlsl | 2 +- .../SemaHLSL/hlsl/vectors/slice-errors.hlsl | 2 +- .../test/SemaHLSL/hlsl/vectors/slice.hlsl | 2 +- tools/clang/test/lit.cfg | 1 - tools/clang/test/lit.site.cfg.in | 1 - 25 files changed, 118 insertions(+), 120 deletions(-) diff --git a/tools/clang/test/CodeGenDXIL/hlsl/linalg/api/matrix-class.hlsl b/tools/clang/test/CodeGenDXIL/hlsl/linalg/api/matrix-class.hlsl index cda3d0818e..38d0c43cbf 100644 --- a/tools/clang/test/CodeGenDXIL/hlsl/linalg/api/matrix-class.hlsl +++ b/tools/clang/test/CodeGenDXIL/hlsl/linalg/api/matrix-class.hlsl @@ -1,5 +1,5 @@ // REQUIRES: dxil-1-10 -// RUN: %dxc -I %hlsl_headers -T cs_6_10 %s | FileCheck %s +// RUN: %dxc -T cs_6_10 %s | FileCheck %s #include using namespace dx::linalg; diff --git a/tools/clang/test/CodeGenDXIL/hlsl/linalg/api/matrix-multiply.hlsl b/tools/clang/test/CodeGenDXIL/hlsl/linalg/api/matrix-multiply.hlsl index c7357d3e93..ab2da55138 100644 --- a/tools/clang/test/CodeGenDXIL/hlsl/linalg/api/matrix-multiply.hlsl +++ b/tools/clang/test/CodeGenDXIL/hlsl/linalg/api/matrix-multiply.hlsl @@ -1,5 +1,5 @@ // REQUIRES: dxil-1-10 -// RUN: %dxc -I %hlsl_headers -T cs_6_10 %s | FileCheck %s +// RUN: %dxc -T cs_6_10 %s | FileCheck %s #include using namespace dx::linalg; diff --git a/tools/clang/test/CodeGenDXIL/hlsl/linalg/api/vectors.hlsl b/tools/clang/test/CodeGenDXIL/hlsl/linalg/api/vectors.hlsl index 44cbc449bd..109c2b7b85 100644 --- a/tools/clang/test/CodeGenDXIL/hlsl/linalg/api/vectors.hlsl +++ b/tools/clang/test/CodeGenDXIL/hlsl/linalg/api/vectors.hlsl @@ -1,5 +1,5 @@ // REQUIRES: dxil-1-10 -// RUN: %dxc -I %hlsl_headers -enable-16bit-types -T cs_6_10 %s | FileCheck %s +// RUN: %dxc -enable-16bit-types -T cs_6_10 %s | FileCheck %s #include using namespace dx::linalg; diff --git a/tools/clang/test/CodeGenDXIL/hlsl/linalg/attr-matrix-type.hlsl b/tools/clang/test/CodeGenDXIL/hlsl/linalg/attr-matrix-type.hlsl index 16366e3fbd..b4c2ae75b5 100644 --- a/tools/clang/test/CodeGenDXIL/hlsl/linalg/attr-matrix-type.hlsl +++ b/tools/clang/test/CodeGenDXIL/hlsl/linalg/attr-matrix-type.hlsl @@ -1,6 +1,6 @@ // REQUIRES: dxil-1-10 -// RUN: %dxc -I %hlsl_headers -T lib_6_10 -enable-16bit-types -fcgl %s | FileCheck %s -// RUN: %dxc -I %hlsl_headers -T lib_6_10 -enable-16bit-types %s | FileCheck %s --check-prefix=CHECKVAL +// RUN: %dxc -T lib_6_10 -enable-16bit-types -fcgl %s | FileCheck %s +// RUN: %dxc -T lib_6_10 -enable-16bit-types %s | FileCheck %s --check-prefix=CHECKVAL #include using namespace dx::linalg; diff --git a/tools/clang/test/CodeGenDXIL/hlsl/linalg/linalg-matrix-type.hlsl b/tools/clang/test/CodeGenDXIL/hlsl/linalg/linalg-matrix-type.hlsl index 954b92e503..c88e32b2f8 100644 --- a/tools/clang/test/CodeGenDXIL/hlsl/linalg/linalg-matrix-type.hlsl +++ b/tools/clang/test/CodeGenDXIL/hlsl/linalg/linalg-matrix-type.hlsl @@ -1,6 +1,6 @@ // REQUIRES: dxil-1-10 -// RUN: %dxc -I %hlsl_headers -T lib_6_10 -fcgl %s | FileCheck %s -// RUN: %dxc -I %hlsl_headers -T lib_6_10 %s | FileCheck %s --check-prefix=CHECKVAL +// RUN: %dxc -T lib_6_10 -fcgl %s | FileCheck %s +// RUN: %dxc -T lib_6_10 %s | FileCheck %s --check-prefix=CHECKVAL #include using namespace dx::linalg; diff --git a/tools/clang/test/CodeGenSPIRV/convert.selector.hlsl b/tools/clang/test/CodeGenSPIRV/convert.selector.hlsl index 263b4dc521..29d97be182 100644 --- a/tools/clang/test/CodeGenSPIRV/convert.selector.hlsl +++ b/tools/clang/test/CodeGenSPIRV/convert.selector.hlsl @@ -1,106 +1,106 @@ // Convert to half -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=half -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=half -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=half -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=half -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=half -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=half -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=half -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=half -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=half %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=half %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=half %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=half %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=half %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=half %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=half %s | FileCheck %s --check-prefix=CHECK --check-prefix=FCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=half %s | FileCheck %s --check-prefix=CHECK --check-prefix=FCONVERT // Convert to float -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=float -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=float -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=float -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=float -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=float -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=float -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=float -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=float -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=float %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=float %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=float %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=float %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=float %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=float %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=float %s | FileCheck %s --check-prefix=CHECK --check-prefix=FCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=float %s | FileCheck %s --check-prefix=CHECK --check-prefix=FCONVERT // Convert to double -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=double -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=double -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=double -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=double -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=double -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=double -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=double -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=double -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=double %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=double %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=double %s | FileCheck %s --check-prefix=CHECK --check-prefix=UTOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=double %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=double %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=double %s | FileCheck %s --check-prefix=CHECK --check-prefix=STOF +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=double %s | FileCheck %s --check-prefix=CHECK --check-prefix=FCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=double %s | FileCheck %s --check-prefix=CHECK --check-prefix=FCONVERT // int type to int16_t -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=int16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=int16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=int16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=BITCAST -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=int16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=int16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=int16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=int16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=int16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=BITCAST +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=int16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=int16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT // float type to int16_t -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=int16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=int16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=int16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=int16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=int16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=int16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS // int type to int32_t -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=int32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=int32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=int32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=int32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=BITCAST -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=int32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=int32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=int32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=int32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=int32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=BITCAST +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=int32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT // float type to int32_t -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=int32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=int32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=int32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=int32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=int32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=int32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS // int type to int64_t -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=int64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=int64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=int64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=int64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=int64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=BITCAST +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=int64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=int64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=int64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=int64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=SCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=int64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=BITCAST // float type to int64_t -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=int64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=int64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=int64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=int64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=int64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=int64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOS // int type to uint16_t -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=uint16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=uint16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=uint16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=BITCAST -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=uint16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=uint16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=uint16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=uint16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=uint16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=BITCAST +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=uint16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=uint16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT // float type to uint16_t -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=uint16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=uint16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=uint16_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=uint16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=uint16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=uint16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU // int type to uint32_t -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=uint32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=uint32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=uint32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=uint32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=BITCAST -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=uint32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=uint32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=uint32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=uint32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=uint32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=BITCAST +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint64_t -DTARGET_TYPE=uint32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT // float type to uint32_t -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=uint32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=uint32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=uint32_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=uint32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=uint32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=uint32_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU // int type to uint64_t -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=uint64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=uint64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=uint64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=uint64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=uint64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=BITCAST +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=int16_t -DTARGET_TYPE=uint64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int32_t -DTARGET_TYPE=uint64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint16_t -DTARGET_TYPE=uint64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=uint32_t -DTARGET_TYPE=uint64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=UCONVERT +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=int64_t -DTARGET_TYPE=uint64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=BITCAST // float type to uint64_t -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=uint64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU -// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=uint64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=uint64_t -I %hlsl_headers %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=half -DTARGET_TYPE=uint64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU +// RUN: %dxc -fspv-target-env=vulkan1.3 -enable-16bit-types -T cs_6_2 -E main -spirv -HV 2021 -DSOURCE_TYPE=float -DTARGET_TYPE=uint64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DSOURCE_TYPE=double -DTARGET_TYPE=uint64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=FTOU -#include "vk/opcode_selector.h" +#include #define VEC_TYPE_INT(TYPE) TYPE##4 #define VEC_TYPE(t) VEC_TYPE_INT(t) diff --git a/tools/clang/test/CodeGenSPIRV/coopmatrix.arithmetic.hlsl b/tools/clang/test/CodeGenSPIRV/coopmatrix.arithmetic.hlsl index a0f94be6a6..4f7eae656a 100644 --- a/tools/clang/test/CodeGenSPIRV/coopmatrix.arithmetic.hlsl +++ b/tools/clang/test/CodeGenSPIRV/coopmatrix.arithmetic.hlsl @@ -1,15 +1,15 @@ -// RUN: %dxc -enable-16bit-types -fspv-target-env=vulkan1.3 -T cs_6_2 -E main -spirv -HV 2021 -I %hlsl_headers -DTYPE=int16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=INTEGERS --check-prefix=INT16 -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers -DTYPE=int %s | FileCheck %s --check-prefix=CHECK --check-prefix=INTEGERS --check-prefix=INT32 -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers -DTYPE=int64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=INTEGERS --check-prefix=INT64 -// RUN: %dxc -enable-16bit-types -fspv-target-env=vulkan1.3 -T cs_6_2 -E main -spirv -HV 2021 -I %hlsl_headers -DTYPE=uint16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=INTEGERS --check-prefix=UINT16 -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers -DTYPE=uint %s | FileCheck %s --check-prefix=CHECK --check-prefix=INTEGERS --check-prefix=UINT32 -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers -DTYPE=uint64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=INTEGERS --check-prefix=UINT64 -// RUN: %dxc -enable-16bit-types -fspv-target-env=vulkan1.3 -T cs_6_2 -E main -spirv -HV 2021 -I %hlsl_headers -DTYPE=half %s | FileCheck %s --check-prefix=CHECK --check-prefix=FLOATS --check-prefix=HALF-ENABLED -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers -DTYPE=half %s | FileCheck %s --check-prefix=CHECK --check-prefix=FLOATS --check-prefix=HALF-DISABLED -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers -DTYPE=float %s | FileCheck %s --check-prefix=CHECK --check-prefix=FLOATS --check-prefix=FLOAT -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers -DTYPE=double %s | FileCheck %s --check-prefix=CHECK --check-prefix=FLOATS --check-prefix=DOUBLE - -#include "vk/khr/cooperative_matrix.h" +// RUN: %dxc -enable-16bit-types -fspv-target-env=vulkan1.3 -T cs_6_2 -E main -spirv -HV 2021 -DTYPE=int16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=INTEGERS --check-prefix=INT16 +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DTYPE=int %s | FileCheck %s --check-prefix=CHECK --check-prefix=INTEGERS --check-prefix=INT32 +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DTYPE=int64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=INTEGERS --check-prefix=INT64 +// RUN: %dxc -enable-16bit-types -fspv-target-env=vulkan1.3 -T cs_6_2 -E main -spirv -HV 2021 -DTYPE=uint16_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=INTEGERS --check-prefix=UINT16 +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DTYPE=uint %s | FileCheck %s --check-prefix=CHECK --check-prefix=INTEGERS --check-prefix=UINT32 +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DTYPE=uint64_t %s | FileCheck %s --check-prefix=CHECK --check-prefix=INTEGERS --check-prefix=UINT64 +// RUN: %dxc -enable-16bit-types -fspv-target-env=vulkan1.3 -T cs_6_2 -E main -spirv -HV 2021 -DTYPE=half %s | FileCheck %s --check-prefix=CHECK --check-prefix=FLOATS --check-prefix=HALF-ENABLED +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DTYPE=half %s | FileCheck %s --check-prefix=CHECK --check-prefix=FLOATS --check-prefix=HALF-DISABLED +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DTYPE=float %s | FileCheck %s --check-prefix=CHECK --check-prefix=FLOATS --check-prefix=FLOAT +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -DTYPE=double %s | FileCheck %s --check-prefix=CHECK --check-prefix=FLOATS --check-prefix=DOUBLE + +#include StructuredBuffer structured_buffer; diff --git a/tools/clang/test/CodeGenSPIRV/coopmatrix.convert.hlsl b/tools/clang/test/CodeGenSPIRV/coopmatrix.convert.hlsl index 62ae23c885..0196f53e09 100644 --- a/tools/clang/test/CodeGenSPIRV/coopmatrix.convert.hlsl +++ b/tools/clang/test/CodeGenSPIRV/coopmatrix.convert.hlsl @@ -1,6 +1,6 @@ -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers %s | FileCheck %s +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 %s | FileCheck %s -#include "vk/khr/cooperative_matrix.h" +#include RWStructuredBuffer data; int stride; diff --git a/tools/clang/test/CodeGenSPIRV/coopmatrix.element.access.hlsl b/tools/clang/test/CodeGenSPIRV/coopmatrix.element.access.hlsl index 30f586815e..7273523470 100644 --- a/tools/clang/test/CodeGenSPIRV/coopmatrix.element.access.hlsl +++ b/tools/clang/test/CodeGenSPIRV/coopmatrix.element.access.hlsl @@ -1,6 +1,6 @@ -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers %s | FileCheck %s +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 %s | FileCheck %s -#include "vk/khr/cooperative_matrix.h" +#include RWStructuredBuffer data; int stride; diff --git a/tools/clang/test/CodeGenSPIRV/coopmatrix.globallycoherent.hlsl b/tools/clang/test/CodeGenSPIRV/coopmatrix.globallycoherent.hlsl index 3a59b90caa..7541f2dcfc 100644 --- a/tools/clang/test/CodeGenSPIRV/coopmatrix.globallycoherent.hlsl +++ b/tools/clang/test/CodeGenSPIRV/coopmatrix.globallycoherent.hlsl @@ -1,6 +1,6 @@ -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers %s | FileCheck %s +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 %s | FileCheck %s -#include "vk/khr/cooperative_matrix.h" +#include globallycoherent RWStructuredBuffer data; diff --git a/tools/clang/test/CodeGenSPIRV/coopmatrix.groupshared.hlsl b/tools/clang/test/CodeGenSPIRV/coopmatrix.groupshared.hlsl index 6de92c1af2..3395a0aa72 100644 --- a/tools/clang/test/CodeGenSPIRV/coopmatrix.groupshared.hlsl +++ b/tools/clang/test/CodeGenSPIRV/coopmatrix.groupshared.hlsl @@ -1,6 +1,6 @@ -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers %s | FileCheck %s +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 %s | FileCheck %s -#include "vk/khr/cooperative_matrix.h" +#include RWStructuredBuffer data; diff --git a/tools/clang/test/CodeGenSPIRV/coopmatrix.memory.operand.hlsl b/tools/clang/test/CodeGenSPIRV/coopmatrix.memory.operand.hlsl index bd641bb508..1873feca55 100644 --- a/tools/clang/test/CodeGenSPIRV/coopmatrix.memory.operand.hlsl +++ b/tools/clang/test/CodeGenSPIRV/coopmatrix.memory.operand.hlsl @@ -1,6 +1,6 @@ -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers %s | FileCheck %s +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 %s | FileCheck %s -#include "vk/khr/cooperative_matrix.h" +#include RWStructuredBuffer data; diff --git a/tools/clang/test/CodeGenSPIRV/coopmatrix.old.spirv.hlsl b/tools/clang/test/CodeGenSPIRV/coopmatrix.old.spirv.hlsl index 9a7c95e3b0..1469fc7017 100644 --- a/tools/clang/test/CodeGenSPIRV/coopmatrix.old.spirv.hlsl +++ b/tools/clang/test/CodeGenSPIRV/coopmatrix.old.spirv.hlsl @@ -1,6 +1,6 @@ -// RUN: not %dxc -fspv-target-env=vulkan1.1 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers -DTYPE=int %s 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=INTEGERS --check-prefix=INT32 +// RUN: not %dxc -fspv-target-env=vulkan1.1 -T cs_6_0 -E main -spirv -HV 2021 -DTYPE=int %s 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=INTEGERS --check-prefix=INT32 -#include "vk/khr/cooperative_matrix.h" +#include [numthreads(64, 1, 1)] void main() { } diff --git a/tools/clang/test/CodeGenSPIRV/coopmatrix_muladd_test.hlsl b/tools/clang/test/CodeGenSPIRV/coopmatrix_muladd_test.hlsl index 17a75e8f15..8474ae9931 100644 --- a/tools/clang/test/CodeGenSPIRV/coopmatrix_muladd_test.hlsl +++ b/tools/clang/test/CodeGenSPIRV/coopmatrix_muladd_test.hlsl @@ -1,6 +1,6 @@ -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers %s | FileCheck %s +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 %s | FileCheck %s -#include "vk/khr/cooperative_matrix.h" +#include RWStructuredBuffer data; uint stride; diff --git a/tools/clang/test/CodeGenSPIRV/inline-spirv/workgroupspirvpointer.const.hlsl b/tools/clang/test/CodeGenSPIRV/inline-spirv/workgroupspirvpointer.const.hlsl index c9df10f81b..110b502d87 100644 --- a/tools/clang/test/CodeGenSPIRV/inline-spirv/workgroupspirvpointer.const.hlsl +++ b/tools/clang/test/CodeGenSPIRV/inline-spirv/workgroupspirvpointer.const.hlsl @@ -1,6 +1,6 @@ -// RUN: not %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers %s 2>&1 | FileCheck %s +// RUN: not %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 %s 2>&1 | FileCheck %s -#include "vk/khr/cooperative_matrix.h" +#include RWStructuredBuffer data; diff --git a/tools/clang/test/CodeGenSPIRV/inline-spirv/workgroupspirvpointer.hlsl b/tools/clang/test/CodeGenSPIRV/inline-spirv/workgroupspirvpointer.hlsl index 208ffd0d7e..c17513970b 100644 --- a/tools/clang/test/CodeGenSPIRV/inline-spirv/workgroupspirvpointer.hlsl +++ b/tools/clang/test/CodeGenSPIRV/inline-spirv/workgroupspirvpointer.hlsl @@ -1,6 +1,6 @@ -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers %s 2>&1 | FileCheck %s +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 %s 2>&1 | FileCheck %s -#include "vk/spirv.h" +#include // CHECK-NOT: OpCapability VariablePointers diff --git a/tools/clang/test/CodeGenSPIRV/inline-spirv/workgroupspirvpointer.varpointer.hlsl b/tools/clang/test/CodeGenSPIRV/inline-spirv/workgroupspirvpointer.varpointer.hlsl index 422c5f936a..fecf79ca3b 100644 --- a/tools/clang/test/CodeGenSPIRV/inline-spirv/workgroupspirvpointer.varpointer.hlsl +++ b/tools/clang/test/CodeGenSPIRV/inline-spirv/workgroupspirvpointer.varpointer.hlsl @@ -1,6 +1,6 @@ -// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 -I %hlsl_headers %s 2>&1 | FileCheck %s +// RUN: %dxc -fspv-target-env=vulkan1.3 -T cs_6_0 -E main -spirv -HV 2021 %s 2>&1 | FileCheck %s -#include "vk/spirv.h" +#include // CHECK: OpCapability VariablePointers diff --git a/tools/clang/test/SemaHLSL/hlsl/linalg/linalg-matrix-ast.hlsl b/tools/clang/test/SemaHLSL/hlsl/linalg/linalg-matrix-ast.hlsl index f228aa53cc..66e8b7a8dd 100644 --- a/tools/clang/test/SemaHLSL/hlsl/linalg/linalg-matrix-ast.hlsl +++ b/tools/clang/test/SemaHLSL/hlsl/linalg/linalg-matrix-ast.hlsl @@ -1,5 +1,5 @@ // REQUIRES: dxil-1-10 -// RUN: %dxc -I %hlsl_headers -T lib_6_10 -ast-dump %s FileCheck %s +// RUN: %dxc -T lib_6_10 -ast-dump %s FileCheck %s #include using namespace dx::linalg; diff --git a/tools/clang/test/SemaHLSL/hlsl/linalg/linalg-matrix-error.hlsl b/tools/clang/test/SemaHLSL/hlsl/linalg/linalg-matrix-error.hlsl index 9fafa16bd4..5315ab3402 100644 --- a/tools/clang/test/SemaHLSL/hlsl/linalg/linalg-matrix-error.hlsl +++ b/tools/clang/test/SemaHLSL/hlsl/linalg/linalg-matrix-error.hlsl @@ -1,5 +1,5 @@ // REQUIRES: dxil-1-10 -// RUN: %dxc -I %hlsl_headers -T lib_6_10 -verify %s +// RUN: %dxc -T lib_6_10 -verify %s #include using namespace dx::linalg; diff --git a/tools/clang/test/SemaHLSL/hlsl/linalg/matrix-attributed-type-ast.hlsl b/tools/clang/test/SemaHLSL/hlsl/linalg/matrix-attributed-type-ast.hlsl index c1dfb8502a..885b0dee33 100644 --- a/tools/clang/test/SemaHLSL/hlsl/linalg/matrix-attributed-type-ast.hlsl +++ b/tools/clang/test/SemaHLSL/hlsl/linalg/matrix-attributed-type-ast.hlsl @@ -1,5 +1,5 @@ // REQUIRES: dxil-1-10 -// RUN: %dxc -I %hlsl_headers -T lib_6_10 -enable-16bit-types -ast-dump %s FileCheck %s +// RUN: %dxc -T lib_6_10 -enable-16bit-types -ast-dump %s FileCheck %s #include using namespace dx::linalg; diff --git a/tools/clang/test/SemaHLSL/hlsl/linalg/matrix-attributed-type-error.hlsl b/tools/clang/test/SemaHLSL/hlsl/linalg/matrix-attributed-type-error.hlsl index 3bd487f66f..7c21fc9725 100644 --- a/tools/clang/test/SemaHLSL/hlsl/linalg/matrix-attributed-type-error.hlsl +++ b/tools/clang/test/SemaHLSL/hlsl/linalg/matrix-attributed-type-error.hlsl @@ -1,5 +1,5 @@ // REQUIRES: dxil-1-10 -// RUN: %dxc -I %hlsl_headers -T lib_6_10 -enable-16bit-types -verify %s +// RUN: %dxc -T lib_6_10 -enable-16bit-types -verify %s #include using namespace dx::linalg; diff --git a/tools/clang/test/SemaHLSL/hlsl/vectors/slice-errors.hlsl b/tools/clang/test/SemaHLSL/hlsl/vectors/slice-errors.hlsl index 88d73d564d..603a69a417 100644 --- a/tools/clang/test/SemaHLSL/hlsl/vectors/slice-errors.hlsl +++ b/tools/clang/test/SemaHLSL/hlsl/vectors/slice-errors.hlsl @@ -1,4 +1,4 @@ -// RUN: %dxc -I %hlsl_headers -T ps_6_9 -E main -verify %s +// RUN: %dxc -T ps_6_9 -E main -verify %s #include diff --git a/tools/clang/test/SemaHLSL/hlsl/vectors/slice.hlsl b/tools/clang/test/SemaHLSL/hlsl/vectors/slice.hlsl index 573fb7fae7..e4c545d0ae 100644 --- a/tools/clang/test/SemaHLSL/hlsl/vectors/slice.hlsl +++ b/tools/clang/test/SemaHLSL/hlsl/vectors/slice.hlsl @@ -1,5 +1,5 @@ // REQUIRES: dxil-1-9 -// RUN: %dxc -I %hlsl_headers -T ps_6_9 -E main %s | FileCheck %s +// RUN: %dxc -T ps_6_9 -E main %s | FileCheck %s #include diff --git a/tools/clang/test/lit.cfg b/tools/clang/test/lit.cfg index bc1ebc1fd1..53c51a4720 100644 --- a/tools/clang/test/lit.cfg +++ b/tools/clang/test/lit.cfg @@ -228,7 +228,6 @@ if has_plugins and config.llvm_plugin_ext: config.substitutions.append( ('%llvmshlibdir', config.llvm_shlib_dir) ) config.substitutions.append( ('%pluginext', config.llvm_plugin_ext) ) -config.substitutions.append( ('%hlsl_headers', config.hlsl_headers_dir) ) #HLSL change if config.clang_examples: config.available_features.add('examples') diff --git a/tools/clang/test/lit.site.cfg.in b/tools/clang/test/lit.site.cfg.in index 80dcadf288..29e22eb4ee 100644 --- a/tools/clang/test/lit.site.cfg.in +++ b/tools/clang/test/lit.site.cfg.in @@ -21,7 +21,6 @@ config.enable_shared = @ENABLE_SHARED@ config.enable_backtrace = "@ENABLE_BACKTRACES@" config.host_arch = "@HOST_ARCH@" config.spirv = "@ENABLE_SPIRV_CODEGEN@" =="ON" -config.hlsl_headers_dir = "@HLSL_HEADERS_DIR@" # HLSL change config.metal = "@ENABLE_METAL_CODEGEN@".upper() == "ON" # HLSL change # Support substitution of the tools and libs dirs with user parameters. This is From d0a8ba57c9e2156c53043209c048fbd82f3701fc Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Tue, 12 May 2026 09:23:12 -0500 Subject: [PATCH 3/5] Cleanup overly verbose claude comments --- tools/clang/lib/Lex/PPDirectives.cpp | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/tools/clang/lib/Lex/PPDirectives.cpp b/tools/clang/lib/Lex/PPDirectives.cpp index 4eeacf9831..e6ac80d427 100644 --- a/tools/clang/lib/Lex/PPDirectives.cpp +++ b/tools/clang/lib/Lex/PPDirectives.cpp @@ -727,31 +727,21 @@ const FileEntry *Preprocessor::LookupFile( } } - // HLSL Change Begin - fall back to compiled-in HLSL header data when the - // angled #include's filename matches the relative path of one of the - // headers shipped under tools/clang/lib/Headers/hlsl. This lets the - // compiler resolve those headers without consulting the filesystem, - // while still allowing user-provided -I paths (or the source tree - // itself) to take precedence when present. + // HLSL Change Begin - Resolve #include's from compiled-in HLSL headers. + + // Doing this after the normal file lookup allows this to only trigger as a + // fallback so the user may override it. if (isAngled && !FromDir && !FromFile) { const llvm::StringMap &EmbeddedHeaders = hlsl::getEmbeddedHeaders(); - // The embedded-header map is keyed on POSIX-style relative paths - // (e.g. "dx/linalg.h"), but a user may write the include using - // Windows-style separators (e.g. ). Normalise any - // backslashes to forward slashes so either spelling resolves to - // the same compiled-in header. + // Normalize the filename to POSIX-style separators so that the lookup is + // consistent regardless of how the user spelled the include. SmallString<128> NormalizedFilename(Filename); std::replace(NormalizedFilename.begin(), NormalizedFilename.end(), '\\', '/'); auto It = EmbeddedHeaders.find(NormalizedFilename); if (It != EmbeddedHeaders.end()) { llvm::StringRef Data = It->second; - // Use a recognisable virtual filename so the bundled header is - // easy to identify in diagnostics and source listings. The - // virtual name uses the normalised (POSIX-style) relative path - // so the displayed filename is canonical regardless of how the - // user spelled the include. SmallString<128> VirtualName("/"); VirtualName.append(NormalizedFilename.begin(), NormalizedFilename.end()); From 9eaf8209a55cfc5b2c84637b3cfd031dfef46375 Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Tue, 12 May 2026 09:24:05 -0500 Subject: [PATCH 4/5] clang-format ../tools/clang/test/SemaHLSL/hlsl/embedded_headers/Inputs/enable_if.h --- tools/clang/lib/Lex/PPDirectives.cpp | 15 +++++++-------- .../hlsl/embedded_headers/Inputs/enable_if.h | 6 ++++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/tools/clang/lib/Lex/PPDirectives.cpp b/tools/clang/lib/Lex/PPDirectives.cpp index e6ac80d427..ceb4302b31 100644 --- a/tools/clang/lib/Lex/PPDirectives.cpp +++ b/tools/clang/lib/Lex/PPDirectives.cpp @@ -12,24 +12,24 @@ /// //===----------------------------------------------------------------------===// -#include "clang/Lex/Preprocessor.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/SourceManager.h" #include "clang/Lex/CodeCompletionHandler.h" +#include "clang/Lex/HLSLEmbeddedHeaders.h" #include "clang/Lex/HeaderSearch.h" #include "clang/Lex/HeaderSearchOptions.h" -#include "clang/Lex/HLSLEmbeddedHeaders.h" #include "clang/Lex/LexDiagnostic.h" #include "clang/Lex/LiteralSupport.h" #include "clang/Lex/MacroInfo.h" #include "clang/Lex/ModuleLoader.h" #include "clang/Lex/Pragma.h" +#include "clang/Lex/Preprocessor.h" +#include "clang/Lex/PreprocessorOptions.h" // HLSL Change - ignore line directives. #include "llvm/ADT/APInt.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Path.h" #include "llvm/Support/SaveAndRestore.h" -#include "clang/Lex/PreprocessorOptions.h" // HLSL Change - ignore line directives. #include // HLSL Change - std::replace for path separator normalisation. using namespace clang; @@ -728,7 +728,7 @@ const FileEntry *Preprocessor::LookupFile( } // HLSL Change Begin - Resolve #include's from compiled-in HLSL headers. - + // Doing this after the normal file lookup allows this to only trigger as a // fallback so the user may override it. if (isAngled && !FromDir && !FromFile) { @@ -737,14 +737,13 @@ const FileEntry *Preprocessor::LookupFile( // Normalize the filename to POSIX-style separators so that the lookup is // consistent regardless of how the user spelled the include. SmallString<128> NormalizedFilename(Filename); - std::replace(NormalizedFilename.begin(), NormalizedFilename.end(), - '\\', '/'); + std::replace(NormalizedFilename.begin(), NormalizedFilename.end(), '\\', + '/'); auto It = EmbeddedHeaders.find(NormalizedFilename); if (It != EmbeddedHeaders.end()) { llvm::StringRef Data = It->second; SmallString<128> VirtualName("/"); - VirtualName.append(NormalizedFilename.begin(), - NormalizedFilename.end()); + VirtualName.append(NormalizedFilename.begin(), NormalizedFilename.end()); const FileEntry *EmbeddedFE = FileMgr.getVirtualFile(VirtualName, Data.size(), /*ModTime=*/0); if (EmbeddedFE) { diff --git a/tools/clang/test/SemaHLSL/hlsl/embedded_headers/Inputs/enable_if.h b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/Inputs/enable_if.h index 662cbe580c..22f377d1f7 100644 --- a/tools/clang/test/SemaHLSL/hlsl/embedded_headers/Inputs/enable_if.h +++ b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/Inputs/enable_if.h @@ -7,9 +7,11 @@ namespace hlsl { -template struct enable_if {}; +template +struct enable_if {}; -template struct enable_if { +template +struct enable_if { using type = T; }; From 2fa8acf5e7d73538be57adfc0c7563374f25fb0c Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Tue, 12 May 2026 10:23:42 -0500 Subject: [PATCH 5/5] Don't put the hlsl namespace in the clang one --- tools/clang/include/clang/Lex/HLSLEmbeddedHeaders.h | 2 -- tools/clang/lib/Lex/HLSLEmbeddedHeaders.cpp | 2 -- 2 files changed, 4 deletions(-) diff --git a/tools/clang/include/clang/Lex/HLSLEmbeddedHeaders.h b/tools/clang/include/clang/Lex/HLSLEmbeddedHeaders.h index db4931f789..447c69105f 100644 --- a/tools/clang/include/clang/Lex/HLSLEmbeddedHeaders.h +++ b/tools/clang/include/clang/Lex/HLSLEmbeddedHeaders.h @@ -24,7 +24,6 @@ #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" -namespace clang { namespace hlsl { /// Returns a map from each HLSL header's relative path under @@ -33,6 +32,5 @@ namespace hlsl { const llvm::StringMap &getEmbeddedHeaders(); } // namespace hlsl -} // namespace clang #endif // LLVM_CLANG_LEX_HLSLEMBEDDEDHEADERS_H diff --git a/tools/clang/lib/Lex/HLSLEmbeddedHeaders.cpp b/tools/clang/lib/Lex/HLSLEmbeddedHeaders.cpp index addd9ffa47..50626ca67a 100644 --- a/tools/clang/lib/Lex/HLSLEmbeddedHeaders.cpp +++ b/tools/clang/lib/Lex/HLSLEmbeddedHeaders.cpp @@ -27,7 +27,6 @@ // ``llvm::StringRef Data`` at namespace scope. #include "HLSLEmbeddedHeadersDecls.inc" -namespace clang { namespace hlsl { const llvm::StringMap &getEmbeddedHeaders() { @@ -43,4 +42,3 @@ const llvm::StringMap &getEmbeddedHeaders() { } } // namespace hlsl -} // namespace clang