diff options
author | Richard Smith <richard@metafoo.co.uk> | 2023-07-21 17:37:55 -0700 |
---|---|---|
committer | Richard Smith <richard@metafoo.co.uk> | 2023-07-21 19:07:59 -0700 |
commit | 9d525bf94b255df89587db955b5fa2d3c03c2c3e (patch) | |
tree | ea9df28908ba14a54facb966e9d077b7dadcdf9c /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | 57bd882343f8e4cca598b6ad47da93476cffb987 (diff) | |
download | llvm-9d525bf94b255df89587db955b5fa2d3c03c2c3e.zip llvm-9d525bf94b255df89587db955b5fa2d3c03c2c3e.tar.gz llvm-9d525bf94b255df89587db955b5fa2d3c03c2c3e.tar.bz2 |
Optimize emission of `dynamic_cast` to final classes.
- When the destination is a final class type that does not derive from
the source type, the cast always fails and is now emitted as a null
pointer or call to __cxa_bad_cast.
- When the destination is a final class type that does derive from the
source type, emit a direct comparison against the corresponding base
class vptr value(s). There may be more than one such value in the case
of multiple inheritance; check them all.
For now, this is supported only for the Itanium ABI. I expect the same thing is
possible for the MS ABI too, but I don't know what guarantees are made about
vfptr uniqueness.
Reviewed By: rjmccall
Differential Revision: https://reviews.llvm.org/D154658
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index ef49349..bb5d180 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -7152,9 +7152,7 @@ llvm::Constant *CodeGenModule::GetAddrOfRTTIDescriptor(QualType Ty, // Return a bogus pointer if RTTI is disabled, unless it's for EH. // FIXME: should we even be calling this method if RTTI is disabled // and it's not for EH? - if ((!ForEH && !getLangOpts().RTTI) || getLangOpts().CUDAIsDevice || - (getLangOpts().OpenMP && getLangOpts().OpenMPIsTargetDevice && - getTriple().isNVPTX())) + if (!shouldEmitRTTI(ForEH)) return llvm::Constant::getNullValue(GlobalsInt8PtrTy); if (ForEH && Ty->isObjCObjectPointerType() && |