brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 4a907b8 Raw
110 lines · cpp
1// RUN: %clang_cc1 -triple arm64 -fptrauth-calls -fptrauth-intrinsics -std=c++26 -verify %s2 3// This test intentionally does not enable the global address discrimination4// of vtable pointers. This lets us configure them with different schemas5// and verify that we're correctly tracking the existence of address discrimination6 7// expected-no-diagnostics8 9struct NonAddressDiscPtrauth {10  void * __ptrauth(1, 0, 1234) p;11};12 13static_assert(__builtin_is_cpp_trivially_relocatable(NonAddressDiscPtrauth));14 15struct AddressDiscPtrauth {16  void * __ptrauth(1, 1, 1234) p;17};18 19static_assert(!__builtin_is_cpp_trivially_relocatable(AddressDiscPtrauth));20 21struct MultipleBaseClasses : NonAddressDiscPtrauth, AddressDiscPtrauth {22 23};24 25static_assert(!__builtin_is_cpp_trivially_relocatable(MultipleBaseClasses));26 27struct MultipleMembers1 {28   NonAddressDiscPtrauth field0;29   AddressDiscPtrauth field1;30};31 32static_assert(!__builtin_is_cpp_trivially_relocatable(MultipleMembers1));33 34struct MultipleMembers2 {35   NonAddressDiscPtrauth field0;36   NonAddressDiscPtrauth field1;37};38 39static_assert(__builtin_is_cpp_trivially_relocatable(MultipleMembers2));40 41struct UnionOfPtrauth {42    union {43        NonAddressDiscPtrauth field0;44        AddressDiscPtrauth field1;45    } u;46};47 48static_assert(!__builtin_is_cpp_trivially_relocatable(UnionOfPtrauth));49 50struct [[clang::ptrauth_vtable_pointer(process_independent,address_discrimination,no_extra_discrimination)]] Polymorphic trivially_relocatable_if_eligible {51  virtual ~Polymorphic();52};53 54struct Foo : Polymorphic {55  Foo(const Foo&);56  ~Foo();57};58 59 60static_assert(!__builtin_is_cpp_trivially_relocatable(Polymorphic));61 62struct [[clang::ptrauth_vtable_pointer(process_independent,no_address_discrimination,no_extra_discrimination)]] NonAddressDiscriminatedPolymorphic trivially_relocatable_if_eligible {63  virtual ~NonAddressDiscriminatedPolymorphic();64};65 66static_assert(__builtin_is_cpp_trivially_relocatable(NonAddressDiscriminatedPolymorphic));67 68 69struct PolymorphicMembers {70    Polymorphic field;71};72 73static_assert(!__builtin_is_cpp_trivially_relocatable(PolymorphicMembers));74 75struct UnionOfPolymorphic {76  union trivially_relocatable_if_eligible {77    Polymorphic p;78    int i;79  } u;80};81 82static_assert(!__builtin_is_cpp_trivially_relocatable(UnionOfPolymorphic));83 84 85struct UnionOfNonAddressDiscriminatedPolymorphic {86  union trivially_relocatable_if_eligible {87    NonAddressDiscriminatedPolymorphic p;88    int i;89  } u;90};91static_assert(!__builtin_is_cpp_trivially_relocatable(UnionOfNonAddressDiscriminatedPolymorphic));92 93struct UnionOfNonAddressDiscriminatedPtrauth {94  union {95    NonAddressDiscPtrauth p;96    int i;97  } u;98};99 100static_assert(__builtin_is_cpp_trivially_relocatable(UnionOfNonAddressDiscriminatedPtrauth));101 102struct UnionOfAddressDisriminatedPtrauth {103  union {104    AddressDiscPtrauth p;105    int i;106  } u;107};108 109static_assert(!__builtin_is_cpp_trivially_relocatable(UnionOfAddressDisriminatedPtrauth));110