Skip to content

Commit 75a9137

Browse files
committed
Enclose with begin_access[signed]/end_access during SILGen of implicit value ctor
1 parent 75dfb56 commit 75a9137

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

lib/IRGen/IRGenSIL.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5835,7 +5835,8 @@ void IRGenSILFunction::visitBeginAccessInst(BeginAccessInst *access) {
58355835
setLoweredAddress(access, temp.getAddress());
58365836
return;
58375837
}
5838-
if (access->getAccessKind() == SILAccessKind::Modify) {
5838+
if (access->getAccessKind() == SILAccessKind::Modify ||
5839+
access->getAccessKind() == SILAccessKind::Init) {
58395840
// When we see a signed modify access, create a shadow stack location and
58405841
// set the lowered address of the access to this stack location.
58415842
auto temp = ti.allocateStack(*this, access->getType(), "ptrauth.temp");
@@ -5926,7 +5927,8 @@ void IRGenSILFunction::visitEndAccessInst(EndAccessInst *i) {
59265927
}
59275928

59285929
case SILAccessEnforcement::Signed: {
5929-
if (access->getAccessKind() != SILAccessKind::Modify) {
5930+
if (access->getAccessKind() != SILAccessKind::Modify ||
5931+
access->getAccessKind() != SILAccessKind::Init) {
59305932
// nothing to do.
59315933
return;
59325934
}

lib/SILGen/SILGenConstructor.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,13 @@ static void emitImplicitValueConstructor(SILGenFunction &SGF,
207207
SILValue slot =
208208
SGF.B.createStructElementAddr(Loc, resultSlot, field,
209209
fieldTy.getAddressType());
210+
211+
if (SGF.getOptions().EnableImportPtrauthFieldFunctionPointers &&
212+
field->getPointerAuthQualifier().isPresent()) {
213+
slot = SGF.B.createBeginAccess(
214+
Loc, slot, SILAccessKind::Init, SILAccessEnforcement::Signed,
215+
/* noNestedConflict */ false, /* fromBuiltin */ false);
216+
}
210217
InitializationPtr init(new KnownAddressInitialization(slot));
211218

212219
// If it's memberwise initialized, do so now.
@@ -260,6 +267,10 @@ static void emitImplicitValueConstructor(SILGenFunction &SGF,
260267

261268
SGF.emitExprInto(field->getParentInitializer(), init.get());
262269
}
270+
if (SGF.getOptions().EnableImportPtrauthFieldFunctionPointers &&
271+
field->getPointerAuthQualifier().isPresent()) {
272+
SGF.B.createEndAccess(Loc, slot, /* aborted */ false);
273+
}
263274
}
264275

265276
SGF.B.createReturn(ImplicitReturnLocation(Loc),

0 commit comments

Comments
 (0)