[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 08:55: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))
----------------
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`.
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