Skip to content

Commit f012108

Browse files
committed
move implementation to compilerinvocation, adjust test
1 parent e527041 commit f012108

File tree

2 files changed

+26
-74
lines changed

2 files changed

+26
-74
lines changed

clang/lib/Driver/ToolChains/HLSL.cpp

Lines changed: 14 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -66,48 +66,15 @@ bool isLegalShaderModel(Triple &T) {
6666
return false;
6767
}
6868

69-
struct ShaderModel {
70-
StringRef TargetKind;
71-
unsigned Major;
72-
unsigned Minor;
73-
bool OfflineLibMinor = false;
74-
};
75-
76-
std::optional<ShaderModel> GetShaderModelFromString(StringRef Profile) {
69+
std::optional<std::string> tryParseProfile(StringRef Profile) {
70+
// [ps|vs|gs|hs|ds|cs|ms|as]_[major]_[minor]
7771
SmallVector<StringRef, 3> Parts;
7872
Profile.split(Parts, "_");
7973
if (Parts.size() != 3)
8074
return std::nullopt;
8175

82-
unsigned long long Major = 0;
83-
if (llvm::getAsUnsignedInteger(Parts[1], 0, Major))
84-
return std::nullopt;
85-
86-
unsigned long long Minor = 0;
87-
bool isOfflineLibMinor = false;
88-
if (Parts[0] == "lib" && Parts[2] == "x")
89-
isOfflineLibMinor = true;
90-
else if (llvm::getAsUnsignedInteger(Parts[2], 0, Minor))
91-
return std::nullopt;
92-
93-
ShaderModel ret;
94-
ret.TargetKind = Parts[0];
95-
ret.Major = Major;
96-
ret.Minor = Minor;
97-
ret.OfflineLibMinor = isOfflineLibMinor;
98-
99-
return ret;
100-
}
101-
102-
std::optional<std::string> tryParseProfile(StringRef Profile) {
103-
std::optional<ShaderModel> SM = GetShaderModelFromString(Profile);
104-
if (!SM.has_value()) {
105-
return std::nullopt;
106-
}
107-
// [ps|vs|gs|hs|ds|cs|ms|as]_[major]_[minor]
108-
10976
Triple::EnvironmentType Kind =
110-
StringSwitch<Triple::EnvironmentType>(SM.value().TargetKind)
77+
StringSwitch<Triple::EnvironmentType>(Parts[0])
11178
.Case("ps", Triple::EnvironmentType::Pixel)
11279
.Case("vs", Triple::EnvironmentType::Vertex)
11380
.Case("gs", Triple::EnvironmentType::Geometry)
@@ -121,11 +88,21 @@ std::optional<std::string> tryParseProfile(StringRef Profile) {
12188
if (Kind == Triple::EnvironmentType::UnknownEnvironment)
12289
return std::nullopt;
12390

91+
unsigned long long Major = 0;
92+
if (llvm::getAsUnsignedInteger(Parts[1], 0, Major))
93+
return std::nullopt;
94+
95+
unsigned long long Minor = 0;
96+
if (Parts[2] == "x" && Kind == Triple::EnvironmentType::Library)
97+
Minor = OfflineLibMinor;
98+
else if (llvm::getAsUnsignedInteger(Parts[2], 0, Minor))
99+
return std::nullopt;
100+
124101
// dxil-unknown-shadermodel-hull
125102
llvm::Triple T;
126103
T.setArch(Triple::ArchType::dxil);
127104
T.setOSName(Triple::getOSTypeName(Triple::OSType::ShaderModel).str() +
128-
VersionTuple(SM.value().Major, SM.value().Minor).getAsString());
105+
VersionTuple(Major, Minor).getAsString());
129106
T.setEnvironment(Kind);
130107
if (isLegalShaderModel(T))
131108
return T.getTriple();
@@ -279,43 +256,6 @@ HLSLToolChain::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
279256
DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_O), "3");
280257
}
281258

282-
if (DAL->hasArg(options::OPT_fnative_half_type)) {
283-
284-
bool HVArgIsValid = true;
285-
bool TPArgIsValid = true;
286-
287-
const StringRef HVArg =
288-
DAL->getLastArgValue(options::OPT_std_EQ, "hlsl2021");
289-
290-
const StringRef TPArg =
291-
DAL->getLastArgValue(options::OPT_target_profile, "");
292-
std::optional<ShaderModel> parsedTargetProfile =
293-
GetShaderModelFromString(TPArg);
294-
295-
unsigned long long HV_year;
296-
StringRef HV_year_str = HVArg.drop_front(4);
297-
if (HV_year_str != "202x") {
298-
llvm::getAsUnsignedInteger(HV_year_str, 0, HV_year);
299-
if (HV_year < 2021)
300-
HVArgIsValid = false;
301-
}
302-
303-
if (!parsedTargetProfile.has_value())
304-
// This should be unreachable, target profile validation happens
305-
// before this point.
306-
return DAL;
307-
else {
308-
if (parsedTargetProfile.value().Major < 6 ||
309-
(parsedTargetProfile.value().Major == 6 &&
310-
parsedTargetProfile.value().Minor < 2))
311-
TPArgIsValid = false;
312-
}
313-
314-
// if the HLSL Version is not at least 2021, or the shader model is not at
315-
// least 6.2, then enable-16bit-types is an invalid flag.
316-
if (!(HVArgIsValid && TPArgIsValid))
317-
getDriver().Diag(diag::err_drv_hlsl_enable_16bit_types_option_invalid);
318-
}
319259
return DAL;
320260
}
321261

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4305,6 +4305,18 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
43054305
} else {
43064306
llvm_unreachable("expected DXIL or SPIR-V target");
43074307
}
4308+
// validate that if fnative-half-type is given, that
4309+
// the language standard is at least hlsl2021, and that
4310+
// the target shader model is at least 6.2
4311+
if (Args.getLastArg(OPT_fnative_half_type)) {
4312+
bool LangStdArgIsValid = Opts.LangStd >= LangStandard::lang_hlsl2021;
4313+
bool TPArgIsValid = T.getOSVersion() >= VersionTuple(6, 2);
4314+
4315+
// if the HLSL Version is not at least 2021, or the shader model is not
4316+
// at least 6.2, then enable-16bit-types is an invalid flag.
4317+
if (!(LangStdArgIsValid && TPArgIsValid))
4318+
Diags.Report(diag::err_drv_hlsl_enable_16bit_types_option_invalid);
4319+
}
43084320
} else
43094321
Diags.Report(diag::err_drv_hlsl_unsupported_target) << T.str();
43104322
}

0 commit comments

Comments
 (0)