aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorusama hameed <u_hameed@apple.com>2022-11-06 17:36:57 -0800
committerusama hameed <u_hameed@apple.com>2022-11-17 13:46:59 -0800
commit7052164f98a389d06a22ea54b673b25d634aa98a (patch)
tree7fecf3b963f90b7184bbda87fc8f20e4414ed194
parent950f2486305078ce0e6fbc671fd4de4b4d33d246 (diff)
downloadllvm-7052164f98a389d06a22ea54b673b25d634aa98a.zip
llvm-7052164f98a389d06a22ea54b673b25d634aa98a.tar.gz
llvm-7052164f98a389d06a22ea54b673b25d634aa98a.tar.bz2
[UBSan] Implementation NonUniqueARMRTTIBit __type_name has higher bits set on arm64
Differential Revision: https://reviews.llvm.org/D137518
-rw-r--r--compiler-rt/lib/ubsan/ubsan_type_hash_itanium.cpp23
1 files changed, 17 insertions, 6 deletions
diff --git a/compiler-rt/lib/ubsan/ubsan_type_hash_itanium.cpp b/compiler-rt/lib/ubsan/ubsan_type_hash_itanium.cpp
index d82b542..468a8fc 100644
--- a/compiler-rt/lib/ubsan/ubsan_type_hash_itanium.cpp
+++ b/compiler-rt/lib/ubsan/ubsan_type_hash_itanium.cpp
@@ -17,6 +17,7 @@
#include "sanitizer_common/sanitizer_common.h"
#include "sanitizer_common/sanitizer_ptrauth.h"
+#include <stdint.h>
// The following are intended to be binary compatible with the definitions
// given in the Itanium ABI. We make no attempt to be ODR-compatible with
@@ -25,9 +26,20 @@
namespace std {
class type_info {
public:
+ typedef const char *__type_name_t;
virtual ~type_info();
const char *__type_name;
+
+ __type_name_t name() const {
+#if defined(__APPLE__) && defined(__LP64__) && !defined(__x86_64__)
+ uintptr_t __non_unique_rtti_bit =
+ (1ULL << ((__CHAR_BIT__ * sizeof(__type_name_t)) - 1));
+ return (__type_name_t)((uintptr_t)__type_name & ~__non_unique_rtti_bit);
+#else
+ return __type_name;
+#endif
+ }
};
}
@@ -117,7 +129,7 @@ static __ubsan::HashValue *getTypeCacheHashTableBucket(__ubsan::HashValue V) {
static bool isDerivedFromAtOffset(const abi::__class_type_info *Derived,
const abi::__class_type_info *Base,
sptr Offset) {
- if (Derived->__type_name == Base->__type_name ||
+ if (Derived->name() == Base->name() ||
__ubsan::checkTypeInfoEquality(Derived, Base))
return Offset == 0;
@@ -254,17 +266,16 @@ __ubsan::getDynamicTypeInfoFromVtable(void *VtablePtr) {
const abi::__class_type_info *ObjectType = findBaseAtOffset(
static_cast<const abi::__class_type_info*>(Vtable->TypeInfo),
-Vtable->Offset);
- return DynamicTypeInfo(Vtable->TypeInfo->__type_name, -Vtable->Offset,
- ObjectType ? ObjectType->__type_name : "<unknown>");
+ return DynamicTypeInfo(Vtable->TypeInfo->name(), -Vtable->Offset,
+ ObjectType ? ObjectType->name() : "<unknown>");
}
bool __ubsan::checkTypeInfoEquality(const void *TypeInfo1,
const void *TypeInfo2) {
auto TI1 = static_cast<const std::type_info *>(TypeInfo1);
auto TI2 = static_cast<const std::type_info *>(TypeInfo2);
- return SANITIZER_NON_UNIQUE_TYPEINFO && TI1->__type_name[0] != '*' &&
- TI2->__type_name[0] != '*' &&
- !internal_strcmp(TI1->__type_name, TI2->__type_name);
+ return SANITIZER_NON_UNIQUE_TYPEINFO && TI1->name()[0] != '*' &&
+ TI2->name()[0] != '*' && !internal_strcmp(TI1->name(), TI2->name());
}
#endif // CAN_SANITIZE_UB && !SANITIZER_WINDOWS