Skip to content

Commit 2cf1f63

Browse files
Merge pull request #19397 from aschwaighofer/fix_tailelem_global
IRGen: Fix type of a global with tail allocated storage
2 parents eb7716b + 1a8eeda commit 2cf1f63

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

lib/IRGen/GenDecl.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1739,6 +1739,7 @@ Address IRGenModule::getAddrOfSILGlobalVariable(SILGlobalVariable *var,
17391739
ResilienceExpansion expansion = getResilienceExpansionForLayout(var);
17401740

17411741
llvm::Type *storageType;
1742+
llvm::Type *castStorageToType = nullptr;
17421743
Size fixedSize;
17431744
Alignment fixedAlignment;
17441745
bool inFixedBuffer = false;
@@ -1768,6 +1769,7 @@ Address IRGenModule::getAddrOfSILGlobalVariable(SILGlobalVariable *var,
17681769
storageType = Layout->getType();
17691770
fixedSize = Layout->getSize();
17701771
fixedAlignment = Layout->getAlignment();
1772+
castStorageToType = cast<FixedTypeInfo>(ti).getStorageType();
17711773
assert(fixedAlignment >= TargetInfo.HeapObjectAlignment);
17721774
} else if (isREPLVar || ti.isFixedSize(expansion)) {
17731775
// Allocate static storage.
@@ -1863,7 +1865,9 @@ Address IRGenModule::getAddrOfSILGlobalVariable(SILGlobalVariable *var,
18631865
// to a reference to it).
18641866
addr = llvm::ConstantExpr::getGetElementPtr(nullptr, gvar, Indices);
18651867
}
1866-
addr = llvm::ConstantExpr::getBitCast(addr, storageType->getPointerTo());
1868+
addr = llvm::ConstantExpr::getBitCast(
1869+
addr,
1870+
castStorageToType ? castStorageToType : storageType->getPointerTo());
18671871
return Address(addr, Alignment(gvar->getAlignment()));
18681872
}
18691873

test/IRGen/static_initializer.sil

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,31 @@ bb0:
152152
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s18static_initializer16TestArrayStorageCMa"(i64 0)
153153
// CHECK: [[MD:%[0-9]+]] = extractvalue %swift.metadata_response [[TMP]], 0
154154
// CHECK: [[O:%[0-9a-z]+]] = call %swift.refcounted* @swift_initStaticObject(%swift.type* [[MD]], %swift.refcounted* getelementptr inbounds (%T18static_initializer16TestArrayStorageC_tailelems0c, %T18static_initializer16TestArrayStorageC_tailelems0c* @static_array, i32 0, i32 1, i32 0))
155-
// CHECK: [[R:%[0-9]+]] = bitcast %swift.refcounted* [[O]] to %T18static_initializer16TestArrayStorageC_tailelems0*
156-
// CHECK: [[R2:%[0-9]+]] = bitcast %T18static_initializer16TestArrayStorageC_tailelems0* [[R]] to %T18static_initializer16TestArrayStorageC*
157-
// CHECK: ret %T18static_initializer16TestArrayStorageC* [[R2]]
155+
// CHECK: [[R:%[0-9]+]] = bitcast %swift.refcounted* [[O]] to %T18static_initializer16TestArrayStorageC*
156+
// CHECK: ret %T18static_initializer16TestArrayStorageC* [[R]]
158157
%0 = global_value @static_array : $TestArrayStorage
159158
%1 = struct $TestArray (%0 : $TestArrayStorage)
160159
return %1 : $TestArray
161160
}
162161

162+
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %T18static_initializer16TestArrayStorageC* @phi_nodes(i1, %T18static_initializer16TestArrayStorageC*)
163+
// CHECK: [[T0:%.*]] = call %swift.refcounted* @swift_initStaticObject
164+
// CHECK: [[T1:%.*]] = bitcast %swift.refcounted* [[T0]] to %T18static_initializer16TestArrayStorageC*
165+
// CHECK: br
166+
// CHECK: br
167+
// CHECK: [[T3:%.*]] = phi %T18static_initializer16TestArrayStorageC* [ %1, {{.*}} ], [ [[T1]], {{.*}} ]
168+
// CHECK: ret %T18static_initializer16TestArrayStorageC* [[T3]]
169+
sil @phi_nodes : $@convention(thin) (Builtin.Int1, TestArrayStorage) -> TestArrayStorage {
170+
bb0(%0 : $Builtin.Int1, %1 : $TestArrayStorage):
171+
cond_br %0, bb1, bb2
172+
173+
bb1:
174+
%2 = global_value @static_array : $TestArrayStorage
175+
br bb3(%2 : $TestArrayStorage)
176+
177+
bb2:
178+
br bb3(%1 : $TestArrayStorage)
179+
180+
bb3(%3 : $TestArrayStorage):
181+
return %3 : $TestArrayStorage
182+
}

0 commit comments

Comments
 (0)