[PATCH] D47299: [CodeGenCXX] Emit strip.invariant.group with -fstrict-vtable-pointers
Piotr Padlewski via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 15 15:33:05 PDT 2018
Prazek marked 5 inline comments as done.
Prazek added inline comments.
================
Comment at: clang/lib/CodeGen/CGExprScalar.cpp:1623
+ const CXXRecordDecl *SourceClassDecl =
+ E->getType().getTypePtr()->getPointeeCXXRecordDecl();
+ const CXXRecordDecl *DstClassDecl = DestTy->getPointeeCXXRecordDecl();
----------------
rjmccall wrote:
> Unnecessary `getTypePtr()`.
getType returns QualType and it does not have getPointeeCXXRecordDecl. Am I missing something?
================
Comment at: clang/lib/CodeGen/CGExprScalar.cpp:1647
+ }
+ }
+
----------------
rjmccall wrote:
> Incidentally, how do you protect against code like this?
>
> A *ptr;
> reinterpret_cast<B *&>(ptr) = new B();
> ptr->foo();
>
> Presumably there needs to be a launder/strip here, but I guess it would have to be introduced by the middle-end when forwarding the store? The way I've written this is an aliasing violation, but (1) I assume your pass isn't disabled whenever strict-aliasing is disabled and (2) you can do this with a memcpy and still pretty reliably expect that LLVM will be able to eventually forward the store.
Can you add more info on what is A and B so I can make sure I understand it correctly?
Is the prefix of the layout the same for both, but they are not in the hierarchy?
I haven't thought about the strict aliasing. I think the only sane way would be to require strict aliasing for the strict vtable pointers.
Repository:
rL LLVM
https://reviews.llvm.org/D47299
More information about the llvm-commits
mailing list