[PATCH] D150887: [clang] Convert a few tests to opaque pointers

Sergei Barannikov via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri May 19 09:20:14 PDT 2023


barannikov88 added inline comments.


================
Comment at: clang/test/CodeGenCXX/const-init-cxx11.cpp:353
   };
-  // CHECK: @_ZN14VirtualMembersL13sGlobalMemoryE = internal global { i8** } { i8** getelementptr inbounds ({ [3 x i8*] }, { [3 x i8*] }* @_ZTVN14VirtualMembers12nsMemoryImplE, i32 0, inrange i32 0, i32 2) }
+  // CHECK: @_ZN14VirtualMembersL13sGlobalMemoryE = internal global %"struct.VirtualMembers::nsMemoryImpl" { ptr getelementptr inbounds ({ [3 x ptr] }, ptr @_ZTVN14VirtualMembers12nsMemoryImplE, i32 0, inrange i32 0, i32 2) }
   __attribute__((used))
----------------
barannikov88 wrote:
> nikic wrote:
> > barannikov88 wrote:
> > > This was one suspicious change. An anonymous struct became named.
> > > 
> > Not sure why exactly this happened, but should be harmless. I believe we sometimes generate anon structs for initializaton because the types used for initialization are not always compatible with the nominal LLVM memory type -- I guess there previously was a mismatch in pointer types here or something.
> This is where the behavior diverges:
> ```
> llvm::Constant *ConstantAggregateBuilder::buildFrom(
>     CodeGenModule &CGM, ArrayRef<llvm::Constant *> Elems,
>     ArrayRef<CharUnits> Offsets, CharUnits StartOffset, CharUnits Size,
>     bool NaturalLayout, llvm::Type *DesiredTy, bool AllowOversized) {
> ...
>   // Pick the type to use.  If the type is layout identical to the desired
>   // type then use it, otherwise use whatever the builder produced for us.
>   if (llvm::StructType *DesiredSTy = dyn_cast<llvm::StructType>(DesiredTy)) {
>     if (DesiredSTy->isLayoutIdentical(STy))
>       STy = DesiredSTy;
>   }
> ...
> ```
> With typed pointers, STy and DesiredSTy respectively are:
> ```
> { i8** }
> %struct.nsMemoryImpl = type { i32 (...)** }
> ```
> `isLayoutIdentical`, despite its name, actually checks for full equivalence of structs, not just the layout. That is, it is no different from `operator==`.
> 
> The code snippet above is the only use of `isLayoutIdentical`.
> 
>  That is, it is no different from operator==.

Quick test shows this is not true...



Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150887/new/

https://reviews.llvm.org/D150887



More information about the cfe-commits mailing list