diff --git a/clang/include/clang/Basic/TargetOptions.h b/clang/include/clang/Basic/TargetOptions.h --- a/clang/include/clang/Basic/TargetOptions.h +++ b/clang/include/clang/Basic/TargetOptions.h @@ -116,6 +116,9 @@ /// The entry point name for HLSL shader being compiled as specified by -E. std::string HLSLEntry; + + /// Not using legacy cbuffer layout for HLSL cbuffer. + unsigned HLSLNoLegacyCBufferLayout : 1; }; } // end namespace clang diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -6981,3 +6981,10 @@ Group, Flags<[DXCOption, NoXarchOption]>, HelpText<"Entry point name">; +def hlsl_disable_legacy_cbuffer_layout : Option<["-"], "hlsl-no-legacy-cbuffer-layout", KIND_FLAG>, + Group, + Flags<[CC1Option]>, + MarshallingInfoFlag>, + HelpText<"Do not use legacy cbuffer layout">; +def dxc_no_legacy_cbuf_layout : DXCFlag<"no-legacy-cbuf-layout">, + HelpText<"Do not use legacy cbuffer layout">; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3521,16 +3521,18 @@ static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs, types::ID InputType) { - const unsigned ForwardedArguments[] = {options::OPT_dxil_validator_version, - options::OPT_D, - options::OPT_I, - options::OPT_S, - options::OPT_O, - options::OPT_emit_llvm, - options::OPT_emit_obj, - options::OPT_disable_llvm_passes, - options::OPT_fnative_half_type, - options::OPT_hlsl_entrypoint}; + const unsigned ForwardedArguments[] = { + options::OPT_dxil_validator_version, + options::OPT_D, + options::OPT_I, + options::OPT_S, + options::OPT_O, + options::OPT_emit_llvm, + options::OPT_emit_obj, + options::OPT_disable_llvm_passes, + options::OPT_fnative_half_type, + options::OPT_hlsl_entrypoint, + options::OPT_hlsl_disable_legacy_cbuffer_layout}; if (!types::isHLSL(InputType)) return; for (const auto &Arg : ForwardedArguments) diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -164,6 +164,13 @@ A->claim(); continue; } + if (A->getOption().getID() == options::OPT_dxc_no_legacy_cbuf_layout) { + DAL->AddFlagArg( + nullptr, + Opts.getOption(options::OPT_hlsl_disable_legacy_cbuffer_layout)); + A->claim(); + continue; + } if (A->getOption().getID() == options::OPT__SLASH_O) { StringRef OStr = A->getValue(); if (OStr == "d") { diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -514,6 +514,10 @@ Diags.Report(diag::err_drv_argument_not_allowed_with) << "-hlsl-entry" << GetInputKindName(IK); + if (Args.hasArg(OPT_hlsl_disable_legacy_cbuffer_layout) && !LangOpts.HLSL) + Diags.Report(diag::err_drv_argument_not_allowed_with) + << "-hlsl-no-legacy-cbuffer-layout" << GetInputKindName(IK); + if (Args.hasArg(OPT_fgpu_allow_device_init) && !LangOpts.HIP) Diags.Report(diag::warn_ignored_hip_only_option) << Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args); diff --git a/clang/test/Driver/dxc_no_legacy_cbuf_layout.hlsl b/clang/test/Driver/dxc_no_legacy_cbuf_layout.hlsl new file mode 100644 --- /dev/null +++ b/clang/test/Driver/dxc_no_legacy_cbuf_layout.hlsl @@ -0,0 +1,10 @@ +// RUN: %clang_dxc -T lib_6_7 -no-legacy-cbuf-layout -### %s 2>&1 | FileCheck %s +// RUN: %clang_dxc -T lib_6_7 -### %s 2>&1 | FileCheck %s --check-prefix=LEGACY + +// Make sure hlsl-no-legacy-cbuffer-layout is enabled. +// CHECK: "-hlsl-no-legacy-cbuffer-layout" + +// Make sure hlsl-no-legacy-cbuffer-layout is not enabled. +// LEGACY-NOT: "-hlsl-no-legacy-cbuffer-layout" + + diff --git a/clang/unittests/Driver/DXCModeTest.cpp b/clang/unittests/Driver/DXCModeTest.cpp --- a/clang/unittests/Driver/DXCModeTest.cpp +++ b/clang/unittests/Driver/DXCModeTest.cpp @@ -237,3 +237,32 @@ // Make sure "-E" will set entry. EXPECT_STREQ(CInvok->getTargetOpts().HLSLEntry.c_str(), "bar"); } + +TEST(DxcModeTest, NoLegacyCBufLayout) { + IntrusiveRefCntPtr InMemoryFileSystem( + new llvm::vfs::InMemoryFileSystem); + + InMemoryFileSystem->addFile("foo.hlsl", 0, + llvm::MemoryBuffer::getMemBuffer("\n")); + + const char *Args[] = {"clang", "--driver-mode=dxc", "-Tcs_6_7", + "-no-legacy-cbuf-layout", "foo.hlsl"}; + + IntrusiveRefCntPtr Diags = + CompilerInstance::createDiagnostics(new DiagnosticOptions()); + + CreateInvocationOptions CIOpts; + CIOpts.Diags = Diags; + std::unique_ptr CInvok = + createInvocation(Args, std::move(CIOpts)); + EXPECT_TRUE(CInvok); + // Make sure HLSLNoLegacyCBufferLayout is enabled. + EXPECT_TRUE(CInvok->getTargetOpts().HLSLNoLegacyCBufferLayout); + + const char *DefaultArgs[] = {"clang", "--driver-mode=dxc", "-Tcs_6_7", + "foo.hlsl"}; + CInvok = createInvocation(DefaultArgs, std::move(CIOpts)); + EXPECT_TRUE(CInvok); + // Make sure HLSLNoLegacyCBufferLayout is disabled. + EXPECT_FALSE(CInvok->getTargetOpts().HLSLNoLegacyCBufferLayout); +}