| #ifdef GET_ATTR_NAMES | |
| #undef GET_ATTR_NAMES | |
| #ifndef ATTRIBUTE_ALL | |
| #define ATTRIBUTE_ALL(FIRST, SECOND) | |
| #endif | |
| #ifndef ATTRIBUTE_ENUM | |
| #define ATTRIBUTE_ENUM(FIRST, SECOND) ATTRIBUTE_ALL(FIRST, SECOND) | |
| #endif | |
| ATTRIBUTE_ENUM(AllocAlign,allocalign) | |
| ATTRIBUTE_ENUM(AllocatedPointer,allocptr) | |
| ATTRIBUTE_ENUM(AlwaysInline,alwaysinline) | |
| ATTRIBUTE_ENUM(Builtin,builtin) | |
| ATTRIBUTE_ENUM(Cold,cold) | |
| ATTRIBUTE_ENUM(Convergent,convergent) | |
| ATTRIBUTE_ENUM(DisableSanitizerInstrumentation,disable_sanitizer_instrumentation) | |
| ATTRIBUTE_ENUM(FnRetThunkExtern,fn_ret_thunk_extern) | |
| ATTRIBUTE_ENUM(Hot,hot) | |
| ATTRIBUTE_ENUM(ImmArg,immarg) | |
| ATTRIBUTE_ENUM(InReg,inreg) | |
| ATTRIBUTE_ENUM(InlineHint,inlinehint) | |
| ATTRIBUTE_ENUM(JumpTable,jumptable) | |
| ATTRIBUTE_ENUM(MinSize,minsize) | |
| ATTRIBUTE_ENUM(MustProgress,mustprogress) | |
| ATTRIBUTE_ENUM(Naked,naked) | |
| ATTRIBUTE_ENUM(Nest,nest) | |
| ATTRIBUTE_ENUM(NoAlias,noalias) | |
| ATTRIBUTE_ENUM(NoBuiltin,nobuiltin) | |
| ATTRIBUTE_ENUM(NoCallback,nocallback) | |
| ATTRIBUTE_ENUM(NoCapture,nocapture) | |
| ATTRIBUTE_ENUM(NoCfCheck,nocf_check) | |
| ATTRIBUTE_ENUM(NoDuplicate,noduplicate) | |
| ATTRIBUTE_ENUM(NoFree,nofree) | |
| ATTRIBUTE_ENUM(NoImplicitFloat,noimplicitfloat) | |
| ATTRIBUTE_ENUM(NoInline,noinline) | |
| ATTRIBUTE_ENUM(NoMerge,nomerge) | |
| ATTRIBUTE_ENUM(NoProfile,noprofile) | |
| ATTRIBUTE_ENUM(NoRecurse,norecurse) | |
| ATTRIBUTE_ENUM(NoRedZone,noredzone) | |
| ATTRIBUTE_ENUM(NoReturn,noreturn) | |
| ATTRIBUTE_ENUM(NoSanitizeBounds,nosanitize_bounds) | |
| ATTRIBUTE_ENUM(NoSanitizeCoverage,nosanitize_coverage) | |
| ATTRIBUTE_ENUM(NoSync,nosync) | |
| ATTRIBUTE_ENUM(NoUndef,noundef) | |
| ATTRIBUTE_ENUM(NoUnwind,nounwind) | |
| ATTRIBUTE_ENUM(NonLazyBind,nonlazybind) | |
| ATTRIBUTE_ENUM(NonNull,nonnull) | |
| ATTRIBUTE_ENUM(NullPointerIsValid,null_pointer_is_valid) | |
| ATTRIBUTE_ENUM(OptForFuzzing,optforfuzzing) | |
| ATTRIBUTE_ENUM(OptimizeForSize,optsize) | |
| ATTRIBUTE_ENUM(OptimizeNone,optnone) | |
| ATTRIBUTE_ENUM(PresplitCoroutine,presplitcoroutine) | |
| ATTRIBUTE_ENUM(ReadNone,readnone) | |
| ATTRIBUTE_ENUM(ReadOnly,readonly) | |
| ATTRIBUTE_ENUM(Returned,returned) | |
| ATTRIBUTE_ENUM(ReturnsTwice,returns_twice) | |
| ATTRIBUTE_ENUM(SExt,signext) | |
| ATTRIBUTE_ENUM(SafeStack,safestack) | |
| ATTRIBUTE_ENUM(SanitizeAddress,sanitize_address) | |
| ATTRIBUTE_ENUM(SanitizeHWAddress,sanitize_hwaddress) | |
| ATTRIBUTE_ENUM(SanitizeMemTag,sanitize_memtag) | |
| ATTRIBUTE_ENUM(SanitizeMemory,sanitize_memory) | |
| ATTRIBUTE_ENUM(SanitizeThread,sanitize_thread) | |
| ATTRIBUTE_ENUM(ShadowCallStack,shadowcallstack) | |
| ATTRIBUTE_ENUM(SkipProfile,skipprofile) | |
| ATTRIBUTE_ENUM(Speculatable,speculatable) | |
| ATTRIBUTE_ENUM(SpeculativeLoadHardening,speculative_load_hardening) | |
| ATTRIBUTE_ENUM(StackProtect,ssp) | |
| ATTRIBUTE_ENUM(StackProtectReq,sspreq) | |
| ATTRIBUTE_ENUM(StackProtectStrong,sspstrong) | |
| ATTRIBUTE_ENUM(StrictFP,strictfp) | |
| ATTRIBUTE_ENUM(SwiftAsync,swiftasync) | |
| ATTRIBUTE_ENUM(SwiftError,swifterror) | |
| ATTRIBUTE_ENUM(SwiftSelf,swiftself) | |
| ATTRIBUTE_ENUM(WillReturn,willreturn) | |
| ATTRIBUTE_ENUM(WriteOnly,writeonly) | |
| ATTRIBUTE_ENUM(ZExt,zeroext) | |
| ATTRIBUTE_ENUM(ByRef,byref) | |
| ATTRIBUTE_ENUM(ByVal,byval) | |
| ATTRIBUTE_ENUM(ElementType,elementtype) | |
| ATTRIBUTE_ENUM(InAlloca,inalloca) | |
| ATTRIBUTE_ENUM(Preallocated,preallocated) | |
| ATTRIBUTE_ENUM(StructRet,sret) | |
| ATTRIBUTE_ENUM(Alignment,align) | |
| ATTRIBUTE_ENUM(AllocKind,allockind) | |
| ATTRIBUTE_ENUM(AllocSize,allocsize) | |
| ATTRIBUTE_ENUM(Dereferenceable,dereferenceable) | |
| ATTRIBUTE_ENUM(DereferenceableOrNull,dereferenceable_or_null) | |
| ATTRIBUTE_ENUM(Memory,memory) | |
| ATTRIBUTE_ENUM(StackAlignment,alignstack) | |
| ATTRIBUTE_ENUM(UWTable,uwtable) | |
| ATTRIBUTE_ENUM(VScaleRange,vscale_range) | |
| #undef ATTRIBUTE_ENUM | |
| #ifndef ATTRIBUTE_STRBOOL | |
| #define ATTRIBUTE_STRBOOL(FIRST, SECOND) ATTRIBUTE_ALL(FIRST, SECOND) | |
| #endif | |
| ATTRIBUTE_STRBOOL(ApproxFuncFPMath,approx-func-fp-math) | |
| ATTRIBUTE_STRBOOL(LessPreciseFPMAD,less-precise-fpmad) | |
| ATTRIBUTE_STRBOOL(NoInfsFPMath,no-infs-fp-math) | |
| ATTRIBUTE_STRBOOL(NoInlineLineTables,no-inline-line-tables) | |
| ATTRIBUTE_STRBOOL(NoJumpTables,no-jump-tables) | |
| ATTRIBUTE_STRBOOL(NoNansFPMath,no-nans-fp-math) | |
| ATTRIBUTE_STRBOOL(NoSignedZerosFPMath,no-signed-zeros-fp-math) | |
| ATTRIBUTE_STRBOOL(ProfileSampleAccurate,profile-sample-accurate) | |
| ATTRIBUTE_STRBOOL(UnsafeFPMath,unsafe-fp-math) | |
| ATTRIBUTE_STRBOOL(UseSampleProfile,use-sample-profile) | |
| #undef ATTRIBUTE_STRBOOL | |
| #undef ATTRIBUTE_ALL | |
| #endif | |
| #ifdef GET_ATTR_ENUM | |
| #undef GET_ATTR_ENUM | |
| FirstEnumAttr = 1, | |
| AllocAlign = 1, | |
| AllocatedPointer = 2, | |
| AlwaysInline = 3, | |
| Builtin = 4, | |
| Cold = 5, | |
| Convergent = 6, | |
| DisableSanitizerInstrumentation = 7, | |
| FnRetThunkExtern = 8, | |
| Hot = 9, | |
| ImmArg = 10, | |
| InReg = 11, | |
| InlineHint = 12, | |
| JumpTable = 13, | |
| MinSize = 14, | |
| MustProgress = 15, | |
| Naked = 16, | |
| Nest = 17, | |
| NoAlias = 18, | |
| NoBuiltin = 19, | |
| NoCallback = 20, | |
| NoCapture = 21, | |
| NoCfCheck = 22, | |
| NoDuplicate = 23, | |
| NoFree = 24, | |
| NoImplicitFloat = 25, | |
| NoInline = 26, | |
| NoMerge = 27, | |
| NoProfile = 28, | |
| NoRecurse = 29, | |
| NoRedZone = 30, | |
| NoReturn = 31, | |
| NoSanitizeBounds = 32, | |
| NoSanitizeCoverage = 33, | |
| NoSync = 34, | |
| NoUndef = 35, | |
| NoUnwind = 36, | |
| NonLazyBind = 37, | |
| NonNull = 38, | |
| NullPointerIsValid = 39, | |
| OptForFuzzing = 40, | |
| OptimizeForSize = 41, | |
| OptimizeNone = 42, | |
| PresplitCoroutine = 43, | |
| ReadNone = 44, | |
| ReadOnly = 45, | |
| Returned = 46, | |
| ReturnsTwice = 47, | |
| SExt = 48, | |
| SafeStack = 49, | |
| SanitizeAddress = 50, | |
| SanitizeHWAddress = 51, | |
| SanitizeMemTag = 52, | |
| SanitizeMemory = 53, | |
| SanitizeThread = 54, | |
| ShadowCallStack = 55, | |
| SkipProfile = 56, | |
| Speculatable = 57, | |
| SpeculativeLoadHardening = 58, | |
| StackProtect = 59, | |
| StackProtectReq = 60, | |
| StackProtectStrong = 61, | |
| StrictFP = 62, | |
| SwiftAsync = 63, | |
| SwiftError = 64, | |
| SwiftSelf = 65, | |
| WillReturn = 66, | |
| WriteOnly = 67, | |
| ZExt = 68, | |
| LastEnumAttr = 68, | |
| FirstTypeAttr = 69, | |
| ByRef = 69, | |
| ByVal = 70, | |
| ElementType = 71, | |
| InAlloca = 72, | |
| Preallocated = 73, | |
| StructRet = 74, | |
| LastTypeAttr = 74, | |
| FirstIntAttr = 75, | |
| Alignment = 75, | |
| AllocKind = 76, | |
| AllocSize = 77, | |
| Dereferenceable = 78, | |
| DereferenceableOrNull = 79, | |
| Memory = 80, | |
| StackAlignment = 81, | |
| UWTable = 82, | |
| VScaleRange = 83, | |
| LastIntAttr = 83, | |
| #endif | |
| #ifdef GET_ATTR_COMPAT_FUNC | |
| #undef GET_ATTR_COMPAT_FUNC | |
| static inline bool hasCompatibleFnAttrs(const Function &Caller, | |
| const Function &Callee) { | |
| bool Ret = true; | |
| Ret &= isEqual<SanitizeAddressAttr>(Caller, Callee); | |
| Ret &= isEqual<SanitizeThreadAttr>(Caller, Callee); | |
| Ret &= isEqual<SanitizeMemoryAttr>(Caller, Callee); | |
| Ret &= isEqual<SanitizeHWAddressAttr>(Caller, Callee); | |
| Ret &= isEqual<SanitizeMemTagAttr>(Caller, Callee); | |
| Ret &= isEqual<SafeStackAttr>(Caller, Callee); | |
| Ret &= isEqual<ShadowCallStackAttr>(Caller, Callee); | |
| Ret &= isEqual<UseSampleProfileAttr>(Caller, Callee); | |
| Ret &= isEqual<NoProfileAttr>(Caller, Callee); | |
| return Ret; | |
| } | |
| static inline void mergeFnAttrs(Function &Caller, | |
| const Function &Callee) { | |
| setAND<NoInfsFPMathAttr>(Caller, Callee); | |
| setAND<NoNansFPMathAttr>(Caller, Callee); | |
| setAND<ApproxFuncFPMathAttr>(Caller, Callee); | |
| setAND<NoSignedZerosFPMathAttr>(Caller, Callee); | |
| setAND<UnsafeFPMathAttr>(Caller, Callee); | |
| setOR<NoImplicitFloatAttr>(Caller, Callee); | |
| setOR<NoJumpTablesAttr>(Caller, Callee); | |
| setOR<ProfileSampleAccurateAttr>(Caller, Callee); | |
| setOR<SpeculativeLoadHardeningAttr>(Caller, Callee); | |
| adjustCallerSSPLevel(Caller, Callee); | |
| adjustCallerStackProbes(Caller, Callee); | |
| adjustCallerStackProbeSize(Caller, Callee); | |
| adjustMinLegalVectorWidth(Caller, Callee); | |
| adjustNullPointerValidAttr(Caller, Callee); | |
| setAND<MustProgressAttr>(Caller, Callee); | |
| setAND<LessPreciseFPMADAttr>(Caller, Callee); | |
| } | |
| #endif | |
| #ifdef GET_ATTR_PROP_TABLE | |
| #undef GET_ATTR_PROP_TABLE | |
| static const uint8_t AttrPropTable[] = { | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::FnAttr | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, | |
| 0 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr | AttributeProperty::ParamAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| 0 | AttributeProperty::FnAttr, | |
| }; | |
| #endif |