================
@@ -1616,29 +1622,70 @@ bool SemaHLSL::diagnosePositionType(QualType T, const
ParsedAttr &AL) {
return true;
}
-void SemaHLSL::handleSV_PositionAttr(Decl *D, const ParsedAttr &AL) {
- auto *VD = cast<ValueDecl>(D);
- if (!diagnosePositionType(VD->getType(), AL))
- return;
-
- D->addAttr(::new (getASTContext()) HLSLSV_PositionAttr(getASTContext(), AL));
-}
+void SemaHLSL::diagnoseSystemSemanticAttr(Decl *D, const ParsedAttr &AL,
+ std::optional<unsigned> Index) {
+ std::string SemanticName = AL.getAttrName()->getName().upper();
-void SemaHLSL::handleSV_GroupThreadIDAttr(Decl *D, const ParsedAttr &AL) {
auto *VD = cast<ValueDecl>(D);
- if (!diagnoseInputIDType(VD->getType(), AL))
- return;
-
- D->addAttr(::new (getASTContext())
- HLSLSV_GroupThreadIDAttr(getASTContext(), AL));
-}
+ QualType ValueType = VD->getType();
+ if (auto *FD = dyn_cast<FunctionDecl>(D))
+ ValueType = FD->getReturnType();
+
+ bool IsOutput = false;
+ if (HLSLParamModifierAttr *MA = D->getAttr<HLSLParamModifierAttr>()) {
+ if (MA->isOut()) {
+ IsOutput = true;
+ ValueType = cast<ReferenceType>(ValueType)->getPointeeType();
+ }
+ }
-void SemaHLSL::handleSV_GroupIDAttr(Decl *D, const ParsedAttr &AL) {
- auto *VD = cast<ValueDecl>(D);
- if (!diagnoseInputIDType(VD->getType(), AL))
+ Attr *Attribute = nullptr;
+ if (SemanticName == "SV_DISPATCHTHREADID") {
+ diagnoseInputIDType(ValueType, AL);
+ if (IsOutput)
+ Diag(AL.getLoc(), diag::err_hlsl_semantic_output_not_supported) << AL;
+ Attribute = createSemanticAttr<HLSLSV_DispatchThreadIDAttr>(AL, Index);
+ } else if (SemanticName == "SV_GROUPINDEX") {
+ if (IsOutput)
+ Diag(AL.getLoc(), diag::err_hlsl_semantic_output_not_supported) << AL;
+ Attribute = createSemanticAttr<HLSLSV_GroupIndexAttr>(AL, Index);
+ } else if (SemanticName == "SV_GROUPTHREADID") {
+ diagnoseInputIDType(ValueType, AL);
+ if (IsOutput)
+ Diag(AL.getLoc(), diag::err_hlsl_semantic_output_not_supported) << AL;
+ Attribute = createSemanticAttr<HLSLSV_GroupThreadIDAttr>(AL, Index);
+ } else if (SemanticName == "SV_GROUPID") {
+ diagnoseInputIDType(ValueType, AL);
+ if (IsOutput)
+ Diag(AL.getLoc(), diag::err_hlsl_semantic_output_not_supported) << AL;
+ Attribute = createSemanticAttr<HLSLSV_GroupIDAttr>(AL, Index);
+ } else if (SemanticName == "SV_POSITION") {
+ const auto *VT = ValueType->getAs<VectorType>();
+ if (!ValueType->hasFloatingRepresentation() ||
+ (VT && VT->getNumElements() > 4))
+ Diag(AL.getLoc(), diag::err_hlsl_attr_invalid_type)
+ << AL << "float/float1/float2/float3/float4";
+ Attribute = createSemanticAttr<HLSLSV_PositionAttr>(AL, Index);
+ } else
+ Diag(AL.getLoc(), diag::err_hlsl_unknown_semantic) << AL;
+
+ if (!Attribute)
return;
+ D->addAttr(Attribute);
+}
- D->addAttr(::new (getASTContext()) HLSLSV_GroupIDAttr(getASTContext(), AL));
+void SemaHLSL::handleSemanticAttr(Decl *D, const ParsedAttr &AL) {
+ uint32_t IndexValue, ExplicitIndex;
+ SemaRef.checkUInt32Argument(AL, AL.getArgAsExpr(0), IndexValue);
+ SemaRef.checkUInt32Argument(AL, AL.getArgAsExpr(1), ExplicitIndex);
----------------
shafik wrote:
It looks like you need to check the return value of `checkUInt32Argument`
otherwise you may use `ExplicitIndex ` uninitialized.
https://github.com/llvm/llvm-project/pull/158044
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits