[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