Skip to content

Commit

Permalink
[HLSL] Add -HV option translation to clang-dxc.exe (#83938)
Browse files Browse the repository at this point in the history
Previously, clang-dxc.exe would not recognize -HV as a valid argument to
DXC, and would be unable to translate the argument to a legal clang
argument. This PR implements a translation of the HV option and its
value to the appropriate clang flag and the appropriate value. It adds a
test by using the -### option to spit out the translated options, and
checks to see that the correct option was generated.
Fixes #83479

---------

Co-authored-by: Chris B <cbieneman@microsoft.com>
  • Loading branch information
bob80905 and llvm-beanz committed Mar 14, 2024
1 parent 274db64 commit 162180d
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 0 deletions.
1 change: 1 addition & 0 deletions clang/include/clang/Basic/LangStandard.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ struct LangStandard {
bool isOpenCL() const { return Flags & OpenCL; }

static Kind getLangKind(StringRef Name);
static Kind getHLSLLangKind(StringRef Name);
static const LangStandard &getLangStandardForKind(Kind K);
static const LangStandard *getLangStandardForName(StringRef Name);
};
Expand Down
5 changes: 5 additions & 0 deletions clang/include/clang/Driver/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -8578,6 +8578,11 @@ def dxc_entrypoint : Option<["--", "/", "-"], "E", KIND_JOINED_OR_SEPARATE>,
Group<dxc_Group>,
Visibility<[DXCOption]>,
HelpText<"Entry point name">;
def dxc_hlsl_version : Option<["/", "-"], "HV", KIND_JOINED_OR_SEPARATE>,
Group<dxc_Group>,
Visibility<[DXCOption]>,
HelpText<"HLSL Version">,
Values<"2016, 2017, 2018, 2021, 202x">;
def dxc_validator_path_EQ : Joined<["--"], "dxv-path=">, Group<dxc_Group>,
HelpText<"DXIL validator installation path">;
def dxc_disable_validation : DXCFlag<"Vd">,
Expand Down
10 changes: 10 additions & 0 deletions clang/lib/Basic/LangStandards.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,16 @@ LangStandard::Kind LangStandard::getLangKind(StringRef Name) {
.Default(lang_unspecified);
}

LangStandard::Kind LangStandard::getHLSLLangKind(StringRef Name) {
return llvm::StringSwitch<LangStandard::Kind>(Name)
.Case("2016", LangStandard::lang_hlsl2016)
.Case("2017", LangStandard::lang_hlsl2017)
.Case("2018", LangStandard::lang_hlsl2018)
.Case("2021", LangStandard::lang_hlsl2021)
.Case("202x", LangStandard::lang_hlsl202x)
.Default(LangStandard::lang_unspecified);
}

const LangStandard *LangStandard::getLangStandardForName(StringRef Name) {
Kind K = getLangKind(Name);
if (K == lang_unspecified)
Expand Down
15 changes: 15 additions & 0 deletions clang/lib/Driver/ToolChains/HLSL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,21 @@ HLSLToolChain::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
A->claim();
continue;
}
if (A->getOption().getID() == options::OPT_dxc_hlsl_version) {
// Translate -HV into -std for llvm
// depending on the value given
LangStandard::Kind LangStd = LangStandard::getHLSLLangKind(A->getValue());
if (LangStd != LangStandard::lang_unspecified) {
LangStandard l = LangStandard::getLangStandardForKind(LangStd);
DAL->AddSeparateArg(nullptr, Opts.getOption(options::OPT_std_EQ),
l.getName());
} else {
getDriver().Diag(diag::err_drv_invalid_value) << "HV" << A->getValue();
}

A->claim();
continue;
}
DAL->append(A);
}

Expand Down
20 changes: 20 additions & 0 deletions clang/test/Options/HV.hlsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// RUN: %clang_dxc -T lib_6_4 -HV 2016 %s 2>&1 -### | FileCheck -check-prefix=2016 %s
// RUN: %clang_dxc -T lib_6_4 -HV 2017 %s 2>&1 -### | FileCheck -check-prefix=2017 %s
// RUN: %clang_dxc -T lib_6_4 /HV 2018 %s 2>&1 -### | FileCheck -check-prefix=2018 %s
// RUN: %clang_dxc -T lib_6_4 /HV 2021 %s 2>&1 -### | FileCheck -check-prefix=2021 %s
// RUN: %clang_dxc -T lib_6_4 /HV 202x %s 2>&1 -### | FileCheck -check-prefix=202x %s
// RUN: %clang_dxc -T lib_6_4 %s 2>&1 -### | FileCheck -check-prefix=NO_HV %s
// RUN: not %clang_dxc -T lib_6_4 /HV gibberish -### %s 2>&1 | FileCheck -check-prefix=CHECK-ERR %s

// 2016: "-std=hlsl2016"
// 2017: "-std=hlsl2017"
// 2018: "-std=hlsl2018"
// 2021: "-std=hlsl2021"
// 202x: "-std=hlsl202x"
// NO_HV-NOT: "-std="
// CHECK-ERR: error: invalid value 'gibberish' in 'HV'
float4 main(float4 a : A) : SV_TARGET
{
return -a.yxxx;
}

0 comments on commit 162180d

Please sign in to comment.