llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-hlsl Author: Justin Bogner (bogner) <details> <summary>Changes</summary> Rather than write a bunch of logic to shepherd between enums with the same sets of values, add the ability for EnumArgument to refer to an external enum in the first place. --- Patch is 31.99 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/70835.diff 7 Files Affected: - (modified) clang-tools-extra/modularize/ModularizeUtilities.cpp (+3-3) - (modified) clang/include/clang/AST/Attr.h (+2-1) - (modified) clang/include/clang/Basic/Attr.td (+43-40) - (modified) clang/lib/CodeGen/CGHLSLRuntime.cpp (+3-56) - (modified) clang/lib/Sema/HLSLExternalSemaSource.cpp (+4-5) - (modified) clang/unittests/Sema/SemaNoloadLookupTest.cpp (+1-1) - (modified) clang/utils/TableGen/ClangAttrEmitter.cpp (+53-38) ``````````diff diff --git a/clang-tools-extra/modularize/ModularizeUtilities.cpp b/clang-tools-extra/modularize/ModularizeUtilities.cpp index 043f6f5b20b80f2..089f52f52ec4d34 100644 --- a/clang-tools-extra/modularize/ModularizeUtilities.cpp +++ b/clang-tools-extra/modularize/ModularizeUtilities.cpp @@ -322,7 +322,7 @@ std::error_code ModularizeUtilities::loadModuleMap( // Walks the modules and collects referenced headers into // HeaderFileNames. bool ModularizeUtilities::collectModuleMapHeaders(clang::ModuleMap *ModMap) { - SmallVector<std::pair<StringRef, const Module *>, 0> Vec; + SmallVector<std::pair<StringRef, const clang::Module *>, 0> Vec; for (auto &M : ModMap->modules()) Vec.emplace_back(M.first(), M.second); llvm::sort(Vec, llvm::less_first()); @@ -349,14 +349,14 @@ bool ModularizeUtilities::collectModuleHeaders(const clang::Module &Mod) { for (auto *Submodule : Mod.submodules()) collectModuleHeaders(*Submodule); - if (std::optional<Module::Header> UmbrellaHeader = + if (std::optional<clang::Module::Header> UmbrellaHeader = Mod.getUmbrellaHeaderAsWritten()) { std::string HeaderPath = getCanonicalPath(UmbrellaHeader->Entry.getName()); // Collect umbrella header. HeaderFileNames.push_back(HeaderPath); // FUTURE: When needed, umbrella header header collection goes here. - } else if (std::optional<Module::DirectoryName> UmbrellaDir = + } else if (std::optional<clang::Module::DirectoryName> UmbrellaDir = Mod.getUmbrellaDirAsWritten()) { // If there normal headers, assume these are umbrellas and skip collection. if (Mod.Headers->size() == 0) { diff --git a/clang/include/clang/AST/Attr.h b/clang/include/clang/AST/Attr.h index 793732cd26b02ff..8884bd5a90de198 100644 --- a/clang/include/clang/AST/Attr.h +++ b/clang/include/clang/AST/Attr.h @@ -19,11 +19,12 @@ #include "clang/AST/Type.h" #include "clang/Basic/AttrKinds.h" #include "clang/Basic/AttributeCommonInfo.h" -#include "clang/Basic/LangOptions.h" #include "clang/Basic/LLVM.h" +#include "clang/Basic/LangOptions.h" #include "clang/Basic/OpenMPKinds.h" #include "clang/Basic/Sanitizers.h" #include "clang/Basic/SourceLocation.h" +#include "llvm/Frontend/HLSL/HLSLResource.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/VersionTuple.h" #include "llvm/Support/raw_ostream.h" diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 25231c5b82b907c..ac4210fffd22010 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -279,12 +279,13 @@ class DefaultIntArgument<string name, int default> : IntArgument<name, 1> { // This argument is more complex, it includes the enumerator type name, // a list of strings to accept, and a list of enumerators to map them to. -class EnumArgument<string name, string type, list<string> values, +class EnumArgument<string name, string type, bit ext, list<string> values, list<string> enums, bit opt = 0, bit fake = 0> : Argument<name, opt, fake> { string Type = type; list<string> Values = values; list<string> Enums = enums; + bit External = ext; } // FIXME: There should be a VariadicArgument type that takes any other type @@ -890,7 +891,7 @@ def ARMInterrupt : InheritableAttr, TargetSpecificAttr<TargetARM> { // MSP430Interrupt's, MipsInterrupt's and AnyX86Interrupt's spellings // must match. let Spellings = [GCC<"interrupt">]; - let Args = [EnumArgument<"Interrupt", "InterruptType", + let Args = [EnumArgument<"Interrupt", "InterruptType", /*ext=*/0, ["IRQ", "FIQ", "SWI", "ABORT", "UNDEF", ""], ["IRQ", "FIQ", "SWI", "ABORT", "UNDEF", "Generic"], 1>]; @@ -1015,7 +1016,8 @@ def ExternalSourceSymbol : InheritableAttr { def Blocks : InheritableAttr { let Spellings = [Clang<"blocks">]; - let Args = [EnumArgument<"Type", "BlockType", ["byref"], ["ByRef"]>]; + let Args = [EnumArgument<"Type", "BlockType", /*ext=*/0, + ["byref"], ["ByRef"]>]; let Documentation = [Undocumented]; } @@ -1553,7 +1555,7 @@ def FlagEnum : InheritableAttr { def EnumExtensibility : InheritableAttr { let Spellings = [Clang<"enum_extensibility">]; let Subjects = SubjectList<[Enum]>; - let Args = [EnumArgument<"Extensibility", "Kind", + let Args = [EnumArgument<"Extensibility", "Kind", /*ext=*/0, ["closed", "open"], ["Closed", "Open"]>]; let Documentation = [EnumExtensibilityDocs]; } @@ -1719,7 +1721,7 @@ def MipsInterrupt : InheritableAttr, TargetSpecificAttr<TargetMips32> { // must match. let Spellings = [GCC<"interrupt">]; let Subjects = SubjectList<[Function]>; - let Args = [EnumArgument<"Interrupt", "InterruptType", + let Args = [EnumArgument<"Interrupt", "InterruptType", /*ext=*/0, ["vector=sw0", "vector=sw1", "vector=hw0", "vector=hw1", "vector=hw2", "vector=hw3", "vector=hw4", "vector=hw5", "eic", ""], @@ -1907,7 +1909,7 @@ def NoMicroMips : InheritableAttr, TargetSpecificAttr<TargetMips32> { def RISCVInterrupt : InheritableAttr, TargetSpecificAttr<TargetRISCV> { let Spellings = [GCC<"interrupt">]; let Subjects = SubjectList<[Function]>; - let Args = [EnumArgument<"Interrupt", "InterruptType", + let Args = [EnumArgument<"Interrupt", "InterruptType", /*ext=*/0, ["supervisor", "machine"], ["supervisor", "machine"], 1>]; @@ -2269,7 +2271,7 @@ def ObjCException : InheritableAttr { def ObjCMethodFamily : InheritableAttr { let Spellings = [Clang<"objc_method_family">]; let Subjects = SubjectList<[ObjCMethod], ErrorDiag>; - let Args = [EnumArgument<"Family", "FamilyKind", + let Args = [EnumArgument<"Family", "FamilyKind", /*ext=*/0, ["none", "alloc", "copy", "init", "mutableCopy", "new"], ["OMF_None", "OMF_alloc", "OMF_copy", "OMF_init", "OMF_mutableCopy", "OMF_new"]>]; @@ -2443,7 +2445,7 @@ def IntelOclBicc : DeclOrTypeAttr { def Pcs : DeclOrTypeAttr { let Spellings = [GCC<"pcs">]; - let Args = [EnumArgument<"PCS", "PCSType", + let Args = [EnumArgument<"PCS", "PCSType", /*ext=*/0, ["aapcs", "aapcs-vfp"], ["AAPCS", "AAPCS_VFP"]>]; // let Subjects = [Function, ObjCMethod]; @@ -2552,7 +2554,7 @@ def SwiftObjCMembers : Attr { def SwiftError : InheritableAttr { let Spellings = [GNU<"swift_error">]; let Args = [ - EnumArgument<"Convention", "ConventionKind", + EnumArgument<"Convention", "ConventionKind", /*ext=*/0, ["none", "nonnull_error", "null_result", "zero_result", "nonzero_result"], ["None", "NonNullError", "NullResult", "ZeroResult", "NonZeroResult"]> ]; @@ -2568,7 +2570,7 @@ def SwiftName : InheritableAttr { def SwiftNewType : InheritableAttr { let Spellings = [GNU<"swift_newtype">, GNU<"swift_wrapper">]; - let Args = [EnumArgument<"NewtypeKind", "NewtypeKind", + let Args = [EnumArgument<"NewtypeKind", "NewtypeKind", /*ext=*/0, ["struct", "enum"], ["NK_Struct", "NK_Enum"]>]; let Subjects = SubjectList<[TypedefName], ErrorDiag>; let Documentation = [SwiftNewTypeDocs]; @@ -2726,7 +2728,7 @@ def SwiftIndirectResult : ParameterABIAttr { def SwiftAsync : InheritableAttr { let Spellings = [Clang<"swift_async">]; let Subjects = SubjectList<[Function, ObjCMethod]>; - let Args = [EnumArgument<"Kind", "Kind", + let Args = [EnumArgument<"Kind", "Kind", /*ext=*/0, ["none", "swift_private", "not_swift_private"], ["None", "SwiftPrivate", "NotSwiftPrivate"]>, ParamIdxArgument<"CompletionHandlerIndex", /*opt=*/1>]; @@ -2736,7 +2738,7 @@ def SwiftAsync : InheritableAttr { def SwiftAsyncError : InheritableAttr { let Spellings = [Clang<"swift_async_error">]; let Subjects = SubjectList<[Function, ObjCMethod]>; - let Args = [EnumArgument<"Convention", "ConventionKind", + let Args = [EnumArgument<"Convention", "ConventionKind", /*ext=*/0, ["none", "nonnull_error", "zero_argument", "nonzero_argument"], ["None", "NonNullError", "ZeroArgument", "NonZeroArgument"]>, UnsignedArgument<"HandlerParamIdx", /*opt=*/1>]; @@ -2773,7 +2775,7 @@ def ZeroCallUsedRegs : InheritableAttr { let Spellings = [GCC<"zero_call_used_regs">]; let Subjects = SubjectList<[Function], ErrorDiag>; let Args = [ - EnumArgument<"ZeroCallUsedRegs", "ZeroCallUsedRegsKind", + EnumArgument<"ZeroCallUsedRegs", "ZeroCallUsedRegsKind", /*ext=*/0, ["skip", "used-gpr-arg", "used-gpr", "used-arg", "used", "all-gpr-arg", "all-gpr", "all-arg", "all"], ["Skip", "UsedGPRArg", "UsedGPR", "UsedArg", "Used", @@ -2939,7 +2941,7 @@ def TransparentUnion : InheritableAttr { def Unavailable : InheritableAttr { let Spellings = [Clang<"unavailable">]; let Args = [StringArgument<"Message", 1>, - EnumArgument<"ImplicitReason", "ImplicitReason", + EnumArgument<"ImplicitReason", "ImplicitReason", /*ext=*/0, ["", "", "", ""], ["IR_None", "IR_ARCForbiddenType", @@ -2959,8 +2961,7 @@ def DiagnoseIf : InheritableAttr { let Spellings = [GNU<"diagnose_if">]; let Subjects = SubjectList<[Function, ObjCMethod, ObjCProperty]>; let Args = [ExprArgument<"Cond">, StringArgument<"Message">, - EnumArgument<"DiagnosticType", - "DiagnosticType", + EnumArgument<"DiagnosticType", "DiagnosticType", /*ext=*/0, ["error", "warning"], ["DT_Error", "DT_Warning"]>, BoolArgument<"ArgDependent", 0, /*fake*/ 1>, @@ -3062,7 +3063,7 @@ def MatrixType : TypeAttr { def Visibility : InheritableAttr { let Clone = 0; let Spellings = [GCC<"visibility">]; - let Args = [EnumArgument<"Visibility", "VisibilityType", + let Args = [EnumArgument<"Visibility", "VisibilityType", /*ext=*/0, ["default", "hidden", "internal", "protected"], ["Default", "Hidden", "Hidden", "Protected"]>]; let MeaningfulToClassTemplateDefinition = 1; @@ -3072,7 +3073,7 @@ def Visibility : InheritableAttr { def TypeVisibility : InheritableAttr { let Clone = 0; let Spellings = [Clang<"type_visibility">]; - let Args = [EnumArgument<"Visibility", "VisibilityType", + let Args = [EnumArgument<"Visibility", "VisibilityType", /*ext=*/0, ["default", "hidden", "internal", "protected"], ["Default", "Hidden", "Hidden", "Protected"]>]; // let Subjects = [Tag, ObjCInterface, Namespace]; @@ -3470,7 +3471,7 @@ def Consumable : InheritableAttr { // FIXME: should this attribute have a CPlusPlus language option? let Spellings = [Clang<"consumable", 0>]; let Subjects = SubjectList<[CXXRecord]>; - let Args = [EnumArgument<"DefaultState", "ConsumedState", + let Args = [EnumArgument<"DefaultState", "ConsumedState", /*ext=*/0, ["unknown", "consumed", "unconsumed"], ["Unknown", "Consumed", "Unconsumed"]>]; let Documentation = [ConsumableDocs]; @@ -3514,7 +3515,7 @@ def ParamTypestate : InheritableAttr { // FIXME: should this attribute have a CPlusPlus language option? let Spellings = [Clang<"param_typestate", 0>]; let Subjects = SubjectList<[ParmVar]>; - let Args = [EnumArgument<"ParamState", "ConsumedState", + let Args = [EnumArgument<"ParamState", "ConsumedState", /*ext=*/0, ["unknown", "consumed", "unconsumed"], ["Unknown", "Consumed", "Unconsumed"]>]; let Documentation = [ParamTypestateDocs]; @@ -3526,7 +3527,7 @@ def ReturnTypestate : InheritableAttr { // FIXME: should this attribute have a CPlusPlus language option? let Spellings = [Clang<"return_typestate", 0>]; let Subjects = SubjectList<[Function, ParmVar]>; - let Args = [EnumArgument<"State", "ConsumedState", + let Args = [EnumArgument<"State", "ConsumedState", /*ext=*/0, ["unknown", "consumed", "unconsumed"], ["Unknown", "Consumed", "Unconsumed"]>]; let Documentation = [ReturnTypestateDocs]; @@ -3538,7 +3539,7 @@ def SetTypestate : InheritableAttr { // FIXME: should this attribute have a CPlusPlus language option? let Spellings = [Clang<"set_typestate", 0>]; let Subjects = SubjectList<[CXXMethod]>; - let Args = [EnumArgument<"NewState", "ConsumedState", + let Args = [EnumArgument<"NewState", "ConsumedState", /*ext=*/0, ["unknown", "consumed", "unconsumed"], ["Unknown", "Consumed", "Unconsumed"]>]; let Documentation = [SetTypestateDocs]; @@ -3550,7 +3551,7 @@ def TestTypestate : InheritableAttr { // FIXME: should this attribute have a CPlusPlus language option? let Spellings = [Clang<"test_typestate", 0>]; let Subjects = SubjectList<[CXXMethod]>; - let Args = [EnumArgument<"TestState", "ConsumedState", + let Args = [EnumArgument<"TestState", "ConsumedState", /*ext=*/0, ["consumed", "unconsumed"], ["Consumed", "Unconsumed"]>]; let Documentation = [TestTypestateDocs]; @@ -3619,7 +3620,7 @@ def CFGuard : InheritableAttr, TargetSpecificAttr<TargetWindows> { // we might also want to support __declspec(guard(suppress)). let Spellings = [Declspec<"guard">, Clang<"guard">]; let Subjects = SubjectList<[Function]>; - let Args = [EnumArgument<"Guard", "GuardArg", ["nocf"], ["nocf"]>]; + let Args = [EnumArgument<"Guard", "GuardArg", /*ext=*/0, ["nocf"], ["nocf"]>]; let Documentation = [CFGuardDocs]; } @@ -3775,7 +3776,7 @@ def LoopHint : Attr { Pragma<"", "nounroll_and_jam">]; /// State of the loop optimization specified by the spelling. - let Args = [EnumArgument<"Option", "OptionType", + let Args = [EnumArgument<"Option", "OptionType", /*ext=*/0, ["vectorize", "vectorize_width", "interleave", "interleave_count", "unroll", "unroll_count", "unroll_and_jam", "unroll_and_jam_count", "pipeline", "pipeline_initiation_interval", "distribute", @@ -3784,7 +3785,7 @@ def LoopHint : Attr { "Unroll", "UnrollCount", "UnrollAndJam", "UnrollAndJamCount", "PipelineDisabled", "PipelineInitiationInterval", "Distribute", "VectorizePredicate"]>, - EnumArgument<"State", "LoopHintState", + EnumArgument<"State", "LoopHintState", /*ext=*/0, ["enable", "disable", "numeric", "fixed_width", "scalable_width", "assume_safety", "full"], ["Enable", "Disable", "Numeric", "FixedWidth", @@ -3873,7 +3874,7 @@ def OMPDeclareSimdDecl : Attr { let HasCustomParsing = 1; let Documentation = [OMPDeclareSimdDocs]; let Args = [ - EnumArgument<"BranchState", "BranchStateTy", + EnumArgument<"BranchState", "BranchStateTy", /*ext=*/0, [ "", "inbranch", "notinbranch" ], [ "BS_Undefined", "BS_Inbranch", "BS_Notinbranch" ]>, ExprArgument<"Simdlen">, VariadicExprArgument<"Uniforms">, @@ -3893,10 +3894,10 @@ def OMPDeclareTargetDecl : InheritableAttr { let Subjects = SubjectList<[Function, SharedVar]>; let Documentation = [OMPDeclareTargetDocs]; let Args = [ - EnumArgument<"MapType", "MapTypeTy", + EnumArgument<"MapType", "MapTypeTy", /*ext=*/0, [ "to", "enter", "link" ], [ "MT_To", "MT_Enter", "MT_Link" ]>, - EnumArgument<"DevType", "DevTypeTy", + EnumArgument<"DevType", "DevTypeTy", /*ext=*/0, [ "host", "nohost", "any" ], [ "DT_Host", "DT_NoHost", "DT_Any" ]>, ExprArgument<"IndirectExpr">, @@ -3918,7 +3919,7 @@ def OMPAllocateDecl : InheritableAttr { let Spellings = []; let SemaHandler = 0; let Args = [ - EnumArgument<"AllocatorType", "AllocatorTypeTy", + EnumArgument<"AllocatorType", "AllocatorTypeTy", /*ext=*/0, [ "omp_null_allocator", "omp_default_mem_alloc", "omp_large_cap_mem_alloc", "omp_const_mem_alloc", @@ -4167,7 +4168,7 @@ def HLSLShader : InheritableAttr { let Subjects = SubjectList<[HLSLEntry]>; let LangOpts = [HLSL]; let Args = [ - EnumArgument<"Type", "ShaderType", + EnumArgument<"Type", "ShaderType", /*ext=*/0, ["pixel", "vertex", "geometry", "hull", "domain", "compute", "raygeneration", "intersection", "anyhit", "closesthit", "miss", "callable", "mesh", "amplification"], @@ -4182,25 +4183,27 @@ def HLSLResource : InheritableAttr { let Spellings = []; let Subjects = SubjectList<[Struct]>; let LangOpts = [HLSL]; - let Args = [EnumArgument<"ResourceType", "ResourceClass", + let Args = [EnumArgument<"ResourceClass", + "llvm::hlsl::ResourceClass", /*ext=*/1, ["SRV", "UAV", "CBuffer", "Sampler"], ["SRV", "UAV", "CBuffer", "Sampler"] >, - EnumArgument<"ResourceShape", "ResourceKind", + EnumArgument<"ResourceKind", + "llvm::hlsl::ResourceKind", /*ext=*/1, ["Texture1D", "Texture2D", "Texture2DMS", "Texture3D", "TextureCube", "Texture1DArray", "Texture2DArray", "Texture2DMSArray", "TextureCubeArray", "TypedBuffer", "RawBuffer", - "StructuredBuffer", "CBufferKind", "SamplerKind", - "TBuffer", "RTAccelerationStructure", "FeedbackTexture2D", - "FeedbackTexture2DArray"], + "StructuredBuffer", "CBuffer", "Sampler", + "TBuffer", "RTAccelerationStructure", + "FeedbackTexture2D", "FeedbackTexture2DArray"], ["Texture1D", "Texture2D", "Texture2DMS", "Texture3D", "TextureCube", "Texture1DArray", "Texture2DArray", "Texture2DMSArray", "TextureCubeArray", "TypedBuffer", "RawBuffer", - "StructuredBuffer", "CBufferKind", "SamplerKind", - "TBuffer", "RTAccelerationStructure", "FeedbackTexture2D", - "FeedbackTexture2DArray"] + "StructuredBuffer", "CBuffer", "Sampler", + "TBuffer", "RTAccelerationStructure", + "FeedbackTexture2D", "FeedbackTexture2DArray"] > ]; let Documentation = [InternalOnly]; @@ -4230,7 +4233,7 @@ def : MutualExclusions<[RandomizeLayout, NoRandomizeLayout]>; def FunctionReturnThunks : InheritableAttr, TargetSpecificAttr<TargetAnyX86> { let Spellings = [GCC<"function_return">]; - let Args = [EnumArgument<"ThunkType", "Kind", + let Args = [EnumArgument<"ThunkType", "Kind", /*ext=*/0, ["keep", "thunk-extern"], ["Keep", "Extern"] >]; diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index e9fa273f21cc8d0..c239bc17ef267e8 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -223,56 +223,6 @@ void CGHLSLRuntime::addBufferResourceAnnotation(llvm::GlobalVariable *GV, ResourceMD->addOperand(Res.getMetadata()); } -static llvm::hlsl::ResourceKind -castResourceShapeToResourceKind(HLSLResourceAttr::ResourceKind RK) { - switch (RK) { - case HLSLResourceAttr::ResourceKind::Texture1D: - return llvm::hlsl::ResourceKind::Texture1D; - case HLSLResourceAttr::ResourceKind::Texture2D: - return llvm::hlsl::ResourceKind::Texture2D; - case HLSLResourceAttr::ResourceKind::Texture2DMS: - return llvm::hlsl::Re... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/70835 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits