| #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(Alignment,align) |
| ATTRIBUTE_ENUM(AllocSize,allocsize) |
| ATTRIBUTE_ENUM(AlwaysInline,alwaysinline) |
| ATTRIBUTE_ENUM(ArgMemOnly,argmemonly) |
| ATTRIBUTE_ENUM(Builtin,builtin) |
| ATTRIBUTE_ENUM(ByVal,byval) |
| ATTRIBUTE_ENUM(Cold,cold) |
| ATTRIBUTE_ENUM(Convergent,convergent) |
| ATTRIBUTE_ENUM(Dereferenceable,dereferenceable) |
| ATTRIBUTE_ENUM(DereferenceableOrNull,dereferenceable_or_null) |
| ATTRIBUTE_ENUM(ImmArg,immarg) |
| ATTRIBUTE_ENUM(InAlloca,inalloca) |
| ATTRIBUTE_ENUM(InReg,inreg) |
| ATTRIBUTE_ENUM(InaccessibleMemOnly,inaccessiblememonly) |
| ATTRIBUTE_ENUM(InaccessibleMemOrArgMemOnly,inaccessiblemem_or_argmemonly) |
| ATTRIBUTE_ENUM(InlineHint,inlinehint) |
| ATTRIBUTE_ENUM(JumpTable,jumptable) |
| ATTRIBUTE_ENUM(MinSize,minsize) |
| ATTRIBUTE_ENUM(Naked,naked) |
| ATTRIBUTE_ENUM(Nest,nest) |
| ATTRIBUTE_ENUM(NoAlias,noalias) |
| ATTRIBUTE_ENUM(NoBuiltin,nobuiltin) |
| 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(NoRecurse,norecurse) |
| ATTRIBUTE_ENUM(NoRedZone,noredzone) |
| ATTRIBUTE_ENUM(NoReturn,noreturn) |
| ATTRIBUTE_ENUM(NoSync,nosync) |
| ATTRIBUTE_ENUM(NoUnwind,nounwind) |
| ATTRIBUTE_ENUM(NonLazyBind,nonlazybind) |
| ATTRIBUTE_ENUM(NonNull,nonnull) |
| ATTRIBUTE_ENUM(OptForFuzzing,optforfuzzing) |
| ATTRIBUTE_ENUM(OptimizeForSize,optsize) |
| ATTRIBUTE_ENUM(OptimizeNone,optnone) |
| 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(Speculatable,speculatable) |
| ATTRIBUTE_ENUM(SpeculativeLoadHardening,speculative_load_hardening) |
| ATTRIBUTE_ENUM(StackAlignment,alignstack) |
| ATTRIBUTE_ENUM(StackProtect,ssp) |
| ATTRIBUTE_ENUM(StackProtectReq,sspreq) |
| ATTRIBUTE_ENUM(StackProtectStrong,sspstrong) |
| ATTRIBUTE_ENUM(StrictFP,strictfp) |
| ATTRIBUTE_ENUM(StructRet,sret) |
| ATTRIBUTE_ENUM(SwiftError,swifterror) |
| ATTRIBUTE_ENUM(SwiftSelf,swiftself) |
| ATTRIBUTE_ENUM(UWTable,uwtable) |
| ATTRIBUTE_ENUM(WillReturn,willreturn) |
| ATTRIBUTE_ENUM(WriteOnly,writeonly) |
| ATTRIBUTE_ENUM(ZExt,zeroext) |
| #undef ATTRIBUTE_ENUM |
| |
| #ifndef ATTRIBUTE_STRBOOL |
| #define ATTRIBUTE_STRBOOL(FIRST, SECOND) ATTRIBUTE_ALL(FIRST, SECOND) |
| #endif |
| |
| 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(ProfileSampleAccurate,profile-sample-accurate) |
| ATTRIBUTE_STRBOOL(UnsafeFPMath,unsafe-fp-math) |
| #undef ATTRIBUTE_STRBOOL |
| |
| #undef ATTRIBUTE_ALL |
| #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); |
| |
| return Ret; |
| } |
| |
| static inline void mergeFnAttrs(Function &Caller, |
| const Function &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<LessPreciseFPMADAttr>(Caller, Callee); |
| setAND<NoInfsFPMathAttr>(Caller, Callee); |
| setAND<NoNansFPMathAttr>(Caller, Callee); |
| } |
| |
| #endif |