diff options
author | Chris Bieneman <chris.bieneman@me.com> | 2022-03-28 15:01:41 -0500 |
---|---|---|
committer | Chris Bieneman <chris.bieneman@me.com> | 2022-03-28 16:16:17 -0500 |
commit | d394f9f8970d758cb39151328dd3040ba7f414ae (patch) | |
tree | c5f740d80e33f85ddfe1ff4d431ec372b2ebda10 /clang/lib/Frontend | |
parent | 577827cbbf1033612d6ce15169f33ee5709abbfc (diff) | |
download | llvm-d394f9f8970d758cb39151328dd3040ba7f414ae.zip llvm-d394f9f8970d758cb39151328dd3040ba7f414ae.tar.gz llvm-d394f9f8970d758cb39151328dd3040ba7f414ae.tar.bz2 |
Add HLSL Language Option and Preprocessor
Bringing in HLSL as a language as well as language options for each of
the HLSL language standards.
While the HLSL language is unimplemented, this patch adds the
HLSL-specific preprocessor defines which enables testing of the command
line options through the driver.
Reviewed By: pete, rnk
Differential Revision: https://reviews.llvm.org/D122087
Diffstat (limited to 'clang/lib/Frontend')
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 27 | ||||
-rw-r--r-- | clang/lib/Frontend/FrontendActions.cpp | 1 | ||||
-rw-r--r-- | clang/lib/Frontend/InitPreprocessor.cpp | 46 |
3 files changed, 74 insertions, 0 deletions
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index b222119..f8fd3a2 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -2623,6 +2623,9 @@ static void GenerateFrontendArgs(const FrontendOptions &Opts, case Language::LLVM_IR: Lang = "ir"; break; + case Language::HLSL: + Lang = "hlsl"; + break; } GenerateArg(Args, OPT_x, @@ -2809,6 +2812,7 @@ static bool ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, .Case("objective-c", Language::ObjC) .Case("objective-c++", Language::ObjCXX) .Case("renderscript", Language::RenderScript) + .Case("hlsl", Language::HLSL) .Default(Language::Unknown); // "objc[++]-cpp-output" is an acceptable synonym for @@ -3220,6 +3224,9 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, case Language::HIP: LangStd = LangStandard::lang_hip; break; + case Language::HLSL: + LangStd = LangStandard::lang_hlsl2021; + break; } } @@ -3241,6 +3248,8 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, Opts.HexFloats = Std.hasHexFloats(); Opts.ImplicitInt = Std.hasImplicitInt(); + Opts.HLSL = IK.getLanguage() == Language::HLSL; + // Set OpenCL Version. Opts.OpenCL = Std.isOpenCL(); if (LangStd == LangStandard::lang_opencl10) @@ -3257,6 +3266,18 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, Opts.OpenCLCPlusPlusVersion = 100; else if (LangStd == LangStandard::lang_openclcpp2021) Opts.OpenCLCPlusPlusVersion = 202100; + else if (LangStd == LangStandard::lang_hlsl2015) + Opts.HLSLVersion = (unsigned)LangOptions::HLSL_2015; + else if (LangStd == LangStandard::lang_hlsl2016) + Opts.HLSLVersion = (unsigned)LangOptions::HLSL_2016; + else if (LangStd == LangStandard::lang_hlsl2017) + Opts.HLSLVersion = (unsigned)LangOptions::HLSL_2017; + else if (LangStd == LangStandard::lang_hlsl2018) + Opts.HLSLVersion = (unsigned)LangOptions::HLSL_2018; + else if (LangStd == LangStandard::lang_hlsl2021) + Opts.HLSLVersion = (unsigned)LangOptions::HLSL_2021; + else if (LangStd == LangStandard::lang_hlsl202x) + Opts.HLSLVersion = (unsigned)LangOptions::HLSL_202x; // OpenCL has some additional defaults. if (Opts.OpenCL) { @@ -3341,6 +3362,9 @@ static bool IsInputCompatibleWithStandard(InputKind IK, // FIXME: The -std= value is not ignored; it affects the tokenization // and preprocessing rules if we're preprocessing this asm input. return true; + + case Language::HLSL: + return S.getLanguage() == Language::HLSL; } llvm_unreachable("unexpected input language"); @@ -3373,6 +3397,9 @@ static StringRef GetInputKindName(InputKind IK) { case Language::LLVM_IR: return "LLVM IR"; + case Language::HLSL: + return "HLSL"; + case Language::Unknown: break; } diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp index 2cd2096..e219be3 100644 --- a/clang/lib/Frontend/FrontendActions.cpp +++ b/clang/lib/Frontend/FrontendActions.cpp @@ -1078,6 +1078,7 @@ void PrintPreambleAction::ExecuteAction() { case Language::OpenCLCXX: case Language::CUDA: case Language::HIP: + case Language::HLSL: break; case Language::Unknown: diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 9d7a429..89e9cb0 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -371,6 +371,52 @@ static void InitializeStandardPredefinedMacros(const TargetInfo &TI, const LangOptions &LangOpts, const FrontendOptions &FEOpts, MacroBuilder &Builder) { + if (LangOpts.HLSL) { + Builder.defineMacro("__hlsl_clang"); + // HLSL Version + Builder.defineMacro("__HLSL_VERSION", + Twine((unsigned)LangOpts.getHLSLVersion())); + + // Shader target information + // "enums" for shader stages + Builder.defineMacro("__SHADER_STAGE_VERTEX", + Twine((uint32_t)ShaderStage::Vertex)); + Builder.defineMacro("__SHADER_STAGE_PIXEL", + Twine((uint32_t)ShaderStage::Pixel)); + Builder.defineMacro("__SHADER_STAGE_GEOMETRY", + Twine((uint32_t)ShaderStage::Geometry)); + Builder.defineMacro("__SHADER_STAGE_HULL", + Twine((uint32_t)ShaderStage::Hull)); + Builder.defineMacro("__SHADER_STAGE_DOMAIN", + Twine((uint32_t)ShaderStage::Domain)); + Builder.defineMacro("__SHADER_STAGE_COMPUTE", + Twine((uint32_t)ShaderStage::Compute)); + Builder.defineMacro("__SHADER_STAGE_AMPLIFICATION", + Twine((uint32_t)ShaderStage::Amplification)); + Builder.defineMacro("__SHADER_STAGE_MESH", + Twine((uint32_t)ShaderStage::Mesh)); + Builder.defineMacro("__SHADER_STAGE_LIBRARY", + Twine((uint32_t)ShaderStage::Library)); + // The current shader stage itself + uint32_t StageInteger = StageInteger = + (uint32_t)TI.getTriple().getEnvironment() - + (uint32_t)llvm::Triple::Pixel; + // TODO: When we add raytracing support we can clean this up + if (TI.getTriple().getEnvironment() == llvm::Triple::Mesh) + StageInteger = (uint32_t)ShaderStage::Mesh; + else if (TI.getTriple().getEnvironment() == llvm::Triple::Amplification) + StageInteger = (uint32_t)ShaderStage::Amplification; + + Builder.defineMacro("__SHADER_TARGET_STAGE", Twine(StageInteger)); + // Add target versions + if (TI.getTriple().getOS() == llvm::Triple::ShaderModel) { + VersionTuple Version = TI.getTriple().getOSVersion(); + Builder.defineMacro("__SHADER_TARGET_MAJOR", Twine(Version.getMajor())); + unsigned Minor = Version.getMinor() ? *Version.getMinor() : 0; + Builder.defineMacro("__SHADER_TARGET_MINOR", Twine(Minor)); + } + return; + } // C++ [cpp.predefined]p1: // The following macro names shall be defined by the implementation: |