1#ifdef GET_ATTR_NAMES 2#undef GET_ATTR_NAMES 3#ifndef ATTRIBUTE_ALL 4#define ATTRIBUTE_ALL(FIRST, SECOND) 5#endif 6 7#ifndef ATTRIBUTE_ENUM 8#define ATTRIBUTE_ENUM(FIRST, SECOND) ATTRIBUTE_ALL(FIRST, SECOND) 9#endif 10 11ATTRIBUTE_ENUM(AllocAlign,allocalign) 12ATTRIBUTE_ENUM(AllocatedPointer,allocptr) 13ATTRIBUTE_ENUM(AlwaysInline,alwaysinline) 14ATTRIBUTE_ENUM(Builtin,builtin) 15ATTRIBUTE_ENUM(Cold,cold) 16ATTRIBUTE_ENUM(Convergent,convergent) 17ATTRIBUTE_ENUM(DisableSanitizerInstrumentation,disable_sanitizer_instrumentation) 18ATTRIBUTE_ENUM(FnRetThunkExtern,fn_ret_thunk_extern) 19ATTRIBUTE_ENUM(Hot,hot) 20ATTRIBUTE_ENUM(ImmArg,immarg) 21ATTRIBUTE_ENUM(InReg,inreg) 22ATTRIBUTE_ENUM(InlineHint,inlinehint) 23ATTRIBUTE_ENUM(JumpTable,jumptable) 24ATTRIBUTE_ENUM(MinSize,minsize) 25ATTRIBUTE_ENUM(MustProgress,mustprogress) 26ATTRIBUTE_ENUM(Naked,naked) 27ATTRIBUTE_ENUM(Nest,nest) 28ATTRIBUTE_ENUM(NoAlias,noalias) 29ATTRIBUTE_ENUM(NoBuiltin,nobuiltin) 30ATTRIBUTE_ENUM(NoCallback,nocallback) 31ATTRIBUTE_ENUM(NoCapture,nocapture) 32ATTRIBUTE_ENUM(NoCfCheck,nocf_check) 33ATTRIBUTE_ENUM(NoDuplicate,noduplicate) 34ATTRIBUTE_ENUM(NoFree,nofree) 35ATTRIBUTE_ENUM(NoImplicitFloat,noimplicitfloat) 36ATTRIBUTE_ENUM(NoInline,noinline) 37ATTRIBUTE_ENUM(NoMerge,nomerge) 38ATTRIBUTE_ENUM(NoProfile,noprofile) 39ATTRIBUTE_ENUM(NoRecurse,norecurse) 40ATTRIBUTE_ENUM(NoRedZone,noredzone) 41ATTRIBUTE_ENUM(NoReturn,noreturn) 42ATTRIBUTE_ENUM(NoSanitizeBounds,nosanitize_bounds) 43ATTRIBUTE_ENUM(NoSanitizeCoverage,nosanitize_coverage) 44ATTRIBUTE_ENUM(NoSync,nosync) 45ATTRIBUTE_ENUM(NoUndef,noundef) 46ATTRIBUTE_ENUM(NoUnwind,nounwind) 47ATTRIBUTE_ENUM(NonLazyBind,nonlazybind) 48ATTRIBUTE_ENUM(NonNull,nonnull) 49ATTRIBUTE_ENUM(NullPointerIsValid,null_pointer_is_valid) 50ATTRIBUTE_ENUM(OptForFuzzing,optforfuzzing) 51ATTRIBUTE_ENUM(OptimizeForSize,optsize) 52ATTRIBUTE_ENUM(OptimizeNone,optnone) 53ATTRIBUTE_ENUM(PresplitCoroutine,presplitcoroutine) 54ATTRIBUTE_ENUM(ReadNone,readnone) 55ATTRIBUTE_ENUM(ReadOnly,readonly) 56ATTRIBUTE_ENUM(Returned,returned) 57ATTRIBUTE_ENUM(ReturnsTwice,returns_twice) 58ATTRIBUTE_ENUM(SExt,signext) 59ATTRIBUTE_ENUM(SafeStack,safestack) 60ATTRIBUTE_ENUM(SanitizeAddress,sanitize_address) 61ATTRIBUTE_ENUM(SanitizeHWAddress,sanitize_hwaddress) 62ATTRIBUTE_ENUM(SanitizeMemTag,sanitize_memtag) 63ATTRIBUTE_ENUM(SanitizeMemory,sanitize_memory) 64ATTRIBUTE_ENUM(SanitizeThread,sanitize_thread) 65ATTRIBUTE_ENUM(ShadowCallStack,shadowcallstack) 66ATTRIBUTE_ENUM(SkipProfile,skipprofile) 67ATTRIBUTE_ENUM(Speculatable,speculatable) 68ATTRIBUTE_ENUM(SpeculativeLoadHardening,speculative_load_hardening) 69ATTRIBUTE_ENUM(StackProtect,ssp) 70ATTRIBUTE_ENUM(StackProtectReq,sspreq) 71ATTRIBUTE_ENUM(StackProtectStrong,sspstrong) 72ATTRIBUTE_ENUM(StrictFP,strictfp) 73ATTRIBUTE_ENUM(SwiftAsync,swiftasync) 74ATTRIBUTE_ENUM(SwiftError,swifterror) 75ATTRIBUTE_ENUM(SwiftSelf,swiftself) 76ATTRIBUTE_ENUM(WillReturn,willreturn) 77ATTRIBUTE_ENUM(WriteOnly,writeonly) 78ATTRIBUTE_ENUM(ZExt,zeroext) 79ATTRIBUTE_ENUM(ByRef,byref) 80ATTRIBUTE_ENUM(ByVal,byval) 81ATTRIBUTE_ENUM(ElementType,elementtype) 82ATTRIBUTE_ENUM(InAlloca,inalloca) 83ATTRIBUTE_ENUM(Preallocated,preallocated) 84ATTRIBUTE_ENUM(StructRet,sret) 85ATTRIBUTE_ENUM(Alignment,align) 86ATTRIBUTE_ENUM(AllocKind,allockind) 87ATTRIBUTE_ENUM(AllocSize,allocsize) 88ATTRIBUTE_ENUM(Dereferenceable,dereferenceable) 89ATTRIBUTE_ENUM(DereferenceableOrNull,dereferenceable_or_null) 90ATTRIBUTE_ENUM(Memory,memory) 91ATTRIBUTE_ENUM(StackAlignment,alignstack) 92ATTRIBUTE_ENUM(UWTable,uwtable) 93ATTRIBUTE_ENUM(VScaleRange,vscale_range) 94#undef ATTRIBUTE_ENUM 95 96#ifndef ATTRIBUTE_STRBOOL 97#define ATTRIBUTE_STRBOOL(FIRST, SECOND) ATTRIBUTE_ALL(FIRST, SECOND) 98#endif 99 100ATTRIBUTE_STRBOOL(ApproxFuncFPMath,approx-func-fp-math) 101ATTRIBUTE_STRBOOL(LessPreciseFPMAD,less-precise-fpmad) 102ATTRIBUTE_STRBOOL(NoInfsFPMath,no-infs-fp-math) 103ATTRIBUTE_STRBOOL(NoInlineLineTables,no-inline-line-tables) 104ATTRIBUTE_STRBOOL(NoJumpTables,no-jump-tables) 105ATTRIBUTE_STRBOOL(NoNansFPMath,no-nans-fp-math) 106ATTRIBUTE_STRBOOL(NoSignedZerosFPMath,no-signed-zeros-fp-math) 107ATTRIBUTE_STRBOOL(ProfileSampleAccurate,profile-sample-accurate) 108ATTRIBUTE_STRBOOL(UnsafeFPMath,unsafe-fp-math) 109ATTRIBUTE_STRBOOL(UseSampleProfile,use-sample-profile) 110#undef ATTRIBUTE_STRBOOL 111 112#undef ATTRIBUTE_ALL 113#endif 114 115#ifdef GET_ATTR_ENUM 116#undef GET_ATTR_ENUM 117FirstEnumAttr = 1, 118AllocAlign = 1, 119AllocatedPointer = 2, 120AlwaysInline = 3, 121Builtin = 4, 122Cold = 5, 123Convergent = 6, 124DisableSanitizerInstrumentation = 7, 125FnRetThunkExtern = 8, 126Hot = 9, 127ImmArg = 10, 128InReg = 11, 129InlineHint = 12, 130JumpTable = 13, 131MinSize = 14, 132MustProgress = 15, 133Naked = 16, 134Nest = 17, 135NoAlias = 18, 136NoBuiltin = 19, 137NoCallback = 20, 138NoCapture = 21, 139NoCfCheck = 22, 140NoDuplicate = 23, 141NoFree = 24, 142NoImplicitFloat = 25, 143NoInline = 26, 144NoMerge = 27, 145NoProfile = 28, 146NoRecurse = 29, 147NoRedZone = 30, 148NoReturn = 31, 149NoSanitizeBounds = 32, 150NoSanitizeCoverage = 33, 151NoSync = 34, 152NoUndef = 35, 153NoUnwind = 36, 154NonLazyBind = 37, 155NonNull = 38, 156NullPointerIsValid = 39, 157OptForFuzzing = 40, 158OptimizeForSize = 41, 159OptimizeNone = 42, 160PresplitCoroutine = 43, 161ReadNone = 44, 162ReadOnly = 45, 163Returned = 46, 164ReturnsTwice = 47, 165SExt = 48, 166SafeStack = 49, 167SanitizeAddress = 50, 168SanitizeHWAddress = 51, 169SanitizeMemTag = 52, 170SanitizeMemory = 53, 171SanitizeThread = 54, 172ShadowCallStack = 55, 173SkipProfile = 56, 174Speculatable = 57, 175SpeculativeLoadHardening = 58, 176StackProtect = 59, 177StackProtectReq = 60, 178StackProtectStrong = 61, 179StrictFP = 62, 180SwiftAsync = 63, 181SwiftError = 64, 182SwiftSelf = 65, 183WillReturn = 66, 184WriteOnly = 67, 185ZExt = 68, 186LastEnumAttr = 68, 187FirstTypeAttr = 69, 188ByRef = 69, 189ByVal = 70, 190ElementType = 71, 191InAlloca = 72, 192Preallocated = 73, 193StructRet = 74, 194LastTypeAttr = 74, 195FirstIntAttr = 75, 196Alignment = 75, 197AllocKind = 76, 198AllocSize = 77, 199Dereferenceable = 78, 200DereferenceableOrNull = 79, 201Memory = 80, 202StackAlignment = 81, 203UWTable = 82, 204VScaleRange = 83, 205LastIntAttr = 83, 206#endif 207 208#ifdef GET_ATTR_COMPAT_FUNC 209#undef GET_ATTR_COMPAT_FUNC 210static inline bool hasCompatibleFnAttrs(const Function &Caller, 211 const Function &Callee) { 212 bool Ret = true; 213 214 Ret &= isEqual<SanitizeAddressAttr>(Caller, Callee); 215 Ret &= isEqual<SanitizeThreadAttr>(Caller, Callee); 216 Ret &= isEqual<SanitizeMemoryAttr>(Caller, Callee); 217 Ret &= isEqual<SanitizeHWAddressAttr>(Caller, Callee); 218 Ret &= isEqual<SanitizeMemTagAttr>(Caller, Callee); 219 Ret &= isEqual<SafeStackAttr>(Caller, Callee); 220 Ret &= isEqual<ShadowCallStackAttr>(Caller, Callee); 221 Ret &= isEqual<UseSampleProfileAttr>(Caller, Callee); 222 Ret &= isEqual<NoProfileAttr>(Caller, Callee); 223 224 return Ret; 225} 226 227static inline void mergeFnAttrs(Function &Caller, 228 const Function &Callee) { 229 setAND<NoInfsFPMathAttr>(Caller, Callee); 230 setAND<NoNansFPMathAttr>(Caller, Callee); 231 setAND<ApproxFuncFPMathAttr>(Caller, Callee); 232 setAND<NoSignedZerosFPMathAttr>(Caller, Callee); 233 setAND<UnsafeFPMathAttr>(Caller, Callee); 234 setOR<NoImplicitFloatAttr>(Caller, Callee); 235 setOR<NoJumpTablesAttr>(Caller, Callee); 236 setOR<ProfileSampleAccurateAttr>(Caller, Callee); 237 setOR<SpeculativeLoadHardeningAttr>(Caller, Callee); 238 adjustCallerSSPLevel(Caller, Callee); 239 adjustCallerStackProbes(Caller, Callee); 240 adjustCallerStackProbeSize(Caller, Callee); 241 adjustMinLegalVectorWidth(Caller, Callee); 242 adjustNullPointerValidAttr(Caller, Callee); 243 setAND<MustProgressAttr>(Caller, Callee); 244 setAND<LessPreciseFPMADAttr>(Caller, Callee); 245} 246 247#endif 248#ifdef GET_ATTR_PROP_TABLE 249#undef GET_ATTR_PROP_TABLE 250static const uint8_t AttrPropTable[] = { 2510 | AttributeProperty::ParamAttr, 2520 | AttributeProperty::ParamAttr, 2530 | AttributeProperty::FnAttr, 2540 | AttributeProperty::FnAttr, 2550 | AttributeProperty::FnAttr, 2560 | AttributeProperty::FnAttr, 2570 | AttributeProperty::FnAttr, 2580 | AttributeProperty::FnAttr, 2590 | AttributeProperty::FnAttr, 2600 | AttributeProperty::ParamAttr, 2610 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, 2620 | AttributeProperty::FnAttr, 2630 | AttributeProperty::FnAttr, 2640 | AttributeProperty::FnAttr, 2650 | AttributeProperty::FnAttr, 2660 | AttributeProperty::FnAttr, 2670 | AttributeProperty::ParamAttr, 2680 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, 2690 | AttributeProperty::FnAttr, 2700 | AttributeProperty::FnAttr, 2710 | AttributeProperty::ParamAttr, 2720 | AttributeProperty::FnAttr, 2730 | AttributeProperty::FnAttr, 2740 | AttributeProperty::FnAttr | AttributeProperty::ParamAttr, 2750 | AttributeProperty::FnAttr, 2760 | AttributeProperty::FnAttr, 2770 | AttributeProperty::FnAttr, 2780 | AttributeProperty::FnAttr, 2790 | AttributeProperty::FnAttr, 2800 | AttributeProperty::FnAttr, 2810 | AttributeProperty::FnAttr, 2820 | AttributeProperty::FnAttr, 2830 | AttributeProperty::FnAttr, 2840 | AttributeProperty::FnAttr, 2850 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, 2860 | AttributeProperty::FnAttr, 2870 | AttributeProperty::FnAttr, 2880 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, 2890 | AttributeProperty::FnAttr, 2900 | AttributeProperty::FnAttr, 2910 | AttributeProperty::FnAttr, 2920 | AttributeProperty::FnAttr, 2930 | AttributeProperty::FnAttr, 2940 | AttributeProperty::ParamAttr, 2950 | AttributeProperty::ParamAttr, 2960 | AttributeProperty::ParamAttr, 2970 | AttributeProperty::FnAttr, 2980 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, 2990 | AttributeProperty::FnAttr, 3000 | AttributeProperty::FnAttr, 3010 | AttributeProperty::FnAttr, 3020 | AttributeProperty::FnAttr, 3030 | AttributeProperty::FnAttr, 3040 | AttributeProperty::FnAttr, 3050 | AttributeProperty::FnAttr, 3060 | AttributeProperty::FnAttr, 3070 | AttributeProperty::FnAttr, 3080 | AttributeProperty::FnAttr, 3090 | AttributeProperty::FnAttr, 3100 | AttributeProperty::FnAttr, 3110 | AttributeProperty::FnAttr, 3120 | AttributeProperty::FnAttr, 3130 | AttributeProperty::ParamAttr, 3140 | AttributeProperty::ParamAttr, 3150 | AttributeProperty::ParamAttr, 3160 | AttributeProperty::FnAttr, 3170 | AttributeProperty::ParamAttr, 3180 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, 3190 | AttributeProperty::ParamAttr, 3200 | AttributeProperty::ParamAttr, 3210 | AttributeProperty::ParamAttr, 3220 | AttributeProperty::ParamAttr, 3230 | AttributeProperty::FnAttr | AttributeProperty::ParamAttr, 3240 | AttributeProperty::ParamAttr, 3250 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, 3260 | AttributeProperty::FnAttr, 3270 | AttributeProperty::FnAttr, 3280 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, 3290 | AttributeProperty::ParamAttr | AttributeProperty::RetAttr, 3300 | AttributeProperty::FnAttr, 3310 | AttributeProperty::FnAttr | AttributeProperty::ParamAttr, 3320 | AttributeProperty::FnAttr, 3330 | AttributeProperty::FnAttr, 334}; 335#endif 336