python3kgae created this revision.
python3kgae added reviewers: beanz, steven_wu, JonChesterfield, sscalpone,
pow2clk, rnk, bogner, MaskRay, dexonsmith.
Herald added subscribers: Anastasia, StephenFan.
Herald added a project: All.
python3kgae requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
-E option will set entry function for hlsl.
The format is -E entry_name.
To avoid conflict with existing option with name 'E', add an extra prefix '--'.
A new field HLSLEntry is added to TargetOption.
To share code with HLSLShaderAttr, entry function will be add HLSLShaderAttr
attribute too.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D124751
Files:
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/include/clang/Basic/TargetOptions.h
clang/include/clang/Driver/Options.td
clang/include/clang/Sema/Sema.h
clang/lib/Driver/ToolChains/Clang.cpp
clang/lib/Sema/SemaDecl.cpp
clang/test/SemaHLSL/entry.hlsl
clang/test/SemaHLSL/prohibit_pointer.hlsl
Index: clang/test/SemaHLSL/prohibit_pointer.hlsl
===================================================================
--- clang/test/SemaHLSL/prohibit_pointer.hlsl
+++ clang/test/SemaHLSL/prohibit_pointer.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -o - -fsyntax-only %s -verify
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -o - -fsyntax-only %s -verify
// expected-error@+1 {{pointers are unsupported in HLSL}}
typedef int (*fn_int)(int);
Index: clang/test/SemaHLSL/entry.hlsl
===================================================================
--- /dev/null
+++ clang/test/SemaHLSL/entry.hlsl
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-compute -x hlsl -Efoo -DWITH_NUM_THREADS -ast-dump -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-compute -x hlsl -Efoo -o - %s -verify
+
+
+// Make sure add HLSLShaderAttr along with HLSLNumThreadsAttr.
+// CHECK:HLSLNumThreadsAttr 0x{{.*}} <line:10:2, col:18> 1 1 1
+// CHECK:HLSLShaderAttr 0x{{.*}} <line:13:1> Compute
+
+#ifdef WITH_NUM_THREADS
+[numthreads(1,1,1)]
+#endif
+// expected-error@+1 {{missing numthreads attribute for Compute shader entry}}
+void foo() {
+
+}
\ No newline at end of file
Index: clang/lib/Sema/SemaDecl.cpp
===================================================================
--- clang/lib/Sema/SemaDecl.cpp
+++ clang/lib/Sema/SemaDecl.cpp
@@ -9863,6 +9863,55 @@
}
}
+ if (getLangOpts().HLSL) {
+ auto &TargetInfo = getASTContext().getTargetInfo();
+ if (!NewFD->isInvalidDecl() &&
+ // Skip operator overload which not identifier.
+ Name.isIdentifier() &&
+ NewFD->getName() == TargetInfo.getTargetOpts().HLSLEntry &&
+ // Make sure it is in translation-unit scope.
+ S->getDepth() == 0) {
+ CheckHLSLEntryPoint(NewFD);
+ if (!NewFD->isInvalidDecl()) {
+ auto TripeShaderType = TargetInfo.getTriple().getEnvironment();
+ AttributeCommonInfo AL(NewFD->getBeginLoc());
+ HLSLShaderAttr::ShaderType ShaderType =
+ HLSLShaderAttr::ShaderType::Callable;
+ switch (TripeShaderType) {
+ default:
+ break;
+ case llvm::Triple::EnvironmentType::Compute:
+ ShaderType = HLSLShaderAttr::ShaderType::Compute;
+ break;
+ case llvm::Triple::EnvironmentType::Vertex:
+ ShaderType = HLSLShaderAttr::ShaderType::Vertex;
+ break;
+ case llvm::Triple::EnvironmentType::Hull:
+ ShaderType = HLSLShaderAttr::ShaderType::Hull;
+ break;
+ case llvm::Triple::EnvironmentType::Domain:
+ ShaderType = HLSLShaderAttr::ShaderType::Domain;
+ break;
+ case llvm::Triple::EnvironmentType::Geometry:
+ ShaderType = HLSLShaderAttr::ShaderType::Geometry;
+ break;
+ case llvm::Triple::EnvironmentType::Pixel:
+ ShaderType = HLSLShaderAttr::ShaderType::Pixel;
+ break;
+ case llvm::Triple::EnvironmentType::Mesh:
+ ShaderType = HLSLShaderAttr::ShaderType::Mesh;
+ break;
+ case llvm::Triple::EnvironmentType::Amplification:
+ ShaderType = HLSLShaderAttr::ShaderType::Amplification;
+ break;
+ }
+ // To share code with HLSLShaderAttr, add HLSLShaderAttr to entry function.
+ if (HLSLShaderAttr *Attr = mergeHLSLShaderAttr(NewFD, AL, ShaderType))
+ NewFD->addAttr(Attr);
+ }
+ }
+ }
+
if (!getLangOpts().CPlusPlus) {
// Perform semantic checking on the function declaration.
if (!NewFD->isInvalidDecl() && NewFD->isMain())
@@ -11683,6 +11732,21 @@
}
}
+void Sema::CheckHLSLEntryPoint(FunctionDecl *FD) {
+ auto &TargetInfo = getASTContext().getTargetInfo();
+ switch (TargetInfo.getTriple().getEnvironment()) {
+ default:
+ // FIXME: check all shader profiles.
+ break;
+ case llvm::Triple::EnvironmentType::Compute:
+ if (!FD->hasAttr<HLSLNumThreadsAttr>()) {
+ Diag(FD->getLocation(), diag::err_hlsl_missing_numthreads) << "Compute";
+ FD->setInvalidDecl();
+ }
+ break;
+ }
+}
+
bool Sema::CheckForConstantInitializer(Expr *Init, QualType DclT) {
// FIXME: Need strict checking. In C89, we need to check for
// any assignment, increment, decrement, function-calls, or
Index: clang/lib/Driver/ToolChains/Clang.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -3470,7 +3470,8 @@
static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs,
types::ID InputType) {
- const unsigned ForwardedArguments[] = {options::OPT_dxil_validator_version};
+ const unsigned ForwardedArguments[] = {options::OPT_dxil_validator_version,
+ options::OPT_hlsl_entrypoint};
for (const auto &Arg : ForwardedArguments)
if (const auto *A = Args.getLastArg(Arg))
Index: clang/include/clang/Sema/Sema.h
===================================================================
--- clang/include/clang/Sema/Sema.h
+++ clang/include/clang/Sema/Sema.h
@@ -2814,6 +2814,7 @@
QualType NewT, QualType OldT);
void CheckMain(FunctionDecl *FD, const DeclSpec &D);
void CheckMSVCRTEntryPoint(FunctionDecl *FD);
+ void CheckHLSLEntryPoint(FunctionDecl *FD);
Attr *getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD,
bool IsDefinition);
void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D);
Index: clang/include/clang/Driver/Options.td
===================================================================
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -6760,3 +6760,9 @@
"lib_6_3, lib_6_4, lib_6_5, lib_6_6, lib_6_7, lib_6_x,"
"ms_6_5, ms_6_6, ms_6_7,"
"as_6_5, as_6_6, as_6_7">;
+
+def hlsl_entrypoint : Option<["--", "/", "-"], "E", KIND_JOINED_OR_SEPARATE>,
+ Group<dxc_Group>,
+ Flags<[DXCOption, CC1Option, NoXarchOption]>,
+ MarshallingInfoString<TargetOpts<"HLSLEntry">>,
+ HelpText<"Entry point name">;
Index: clang/include/clang/Basic/TargetOptions.h
===================================================================
--- clang/include/clang/Basic/TargetOptions.h
+++ clang/include/clang/Basic/TargetOptions.h
@@ -113,6 +113,9 @@
/// The validator version for dxil.
std::string DxilValidatorVersion;
+
+ /// The entry point name for HLSL shader being compiled as specified by -E.
+ std::string HLSLEntry;
};
} // end namespace clang
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -11603,6 +11603,7 @@
def err_hlsl_numthreads_argument_oor : Error<"argument '%select{X|Y|Z}0' to numthreads attribute cannot exceed %1">;
def err_hlsl_numthreads_invalid : Error<"total number of threads cannot exceed %0">;
+def err_hlsl_missing_numthreads : Error<"missing numthreads attribute for %0 shader entry">;
def err_hlsl_attribute_param_mismatch : Error<"%0 attribute parameters do not match the previous declaration">;
def err_hlsl_pointers_unsupported : Error<
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits