diff --git a/tools/clang/include/clang/Lex/HLSLEmbeddedHeaders.h b/tools/clang/include/clang/Lex/HLSLEmbeddedHeaders.h new file mode 100644 index 0000000000..447c69105f --- /dev/null +++ b/tools/clang/include/clang/Lex/HLSLEmbeddedHeaders.h @@ -0,0 +1,36 @@ +//===- 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 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 + +#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..50626ca67a --- /dev/null +++ b/tools/clang/lib/Lex/HLSLEmbeddedHeaders.cpp @@ -0,0 +1,44 @@ +//===- 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 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 diff --git a/tools/clang/lib/Lex/PPDirectives.cpp b/tools/clang/lib/Lex/PPDirectives.cpp index 08af04e9c5..ceb4302b31 100644 --- a/tools/clang/lib/Lex/PPDirectives.cpp +++ b/tools/clang/lib/Lex/PPDirectives.cpp @@ -12,10 +12,10 @@ /// //===----------------------------------------------------------------------===// -#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/LexDiagnostic.h" @@ -23,11 +23,14 @@ #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; //===----------------------------------------------------------------------===// @@ -724,6 +727,49 @@ 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) { + const llvm::StringMap &EmbeddedHeaders = + hlsl::getEmbeddedHeaders(); + // 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; + 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/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/embedded_headers/Inputs/enable_if.h b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/Inputs/enable_if.h new file mode 100644 index 0000000000..22f377d1f7 --- /dev/null +++ b/tools/clang/test/SemaHLSL/hlsl/embedded_headers/Inputs/enable_if.h @@ -0,0 +1,18 @@ +// 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/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 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:]))