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