aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2021-08-23 13:12:24 +0100
committerJonathan Wakely <jwakely@redhat.com>2021-08-23 14:45:00 +0100
commitda6ce351069bda74d814b723934008d75bd4e8b0 (patch)
tree2d9a2c128877375521ca94a0582099f9b6e18323
parentbc97e736a5597ac1545b7f9069472117b6caa867 (diff)
downloadgcc-da6ce351069bda74d814b723934008d75bd4e8b0.zip
gcc-da6ce351069bda74d814b723934008d75bd4e8b0.tar.gz
gcc-da6ce351069bda74d814b723934008d75bd4e8b0.tar.bz2
libstdc++: Use __builtin_expect in __dynamic_cast
The null pointer check is never needed for correct code, only to gracefully handle undefined cases. Add __builtin_expect to be sure that we don't pessimize the valid uses. libstdc++-v3/ChangeLog: * libsupc++/dyncast.cc (__dynamic_cast): Add __builtin_expect to precondition check.
-rw-r--r--libstdc++-v3/libsupc++/dyncast.cc8
1 files changed, 4 insertions, 4 deletions
diff --git a/libstdc++-v3/libsupc++/dyncast.cc b/libstdc++-v3/libsupc++/dyncast.cc
index f8f707e..a1138d0 100644
--- a/libstdc++-v3/libsupc++/dyncast.cc
+++ b/libstdc++-v3/libsupc++/dyncast.cc
@@ -47,9 +47,9 @@ __dynamic_cast (const void *src_ptr, // object started from
const __class_type_info *dst_type, // desired target type
ptrdiff_t src2dst) // how src and dst are related
{
- if (!src_ptr)
- /* Handle precondition violations gracefully. */
- return NULL;
+ if (__builtin_expect(!src_ptr, 0))
+ return NULL; // Handle precondition violations gracefully.
+
const void *vtable = *static_cast <const void *const *> (src_ptr);
const vtable_prefix *prefix =
(adjust_pointer <vtable_prefix>
@@ -70,7 +70,7 @@ __dynamic_cast (const void *src_ptr, // object started from
(whole_vtable, -ptrdiff_t (offsetof (vtable_prefix, origin))));
if (whole_prefix->whole_type != whole_type)
return NULL;
-
+
whole_type->__do_dyncast (src2dst, __class_type_info::__contained_public,
dst_type, whole_ptr, src_type, src_ptr, result);
if (!result.dst_ptr)