Skip to content

Commit 5d17c84

Browse files
authored
Merge pull request swiftlang#63475 from meg-gupta/ptrauthaddchanges
Misc changes to support import of structs with ptrauth qualified field function ptrs
2 parents ddf0936 + 7d169a9 commit 5d17c84

File tree

6 files changed

+61
-7
lines changed

6 files changed

+61
-7
lines changed

lib/ClangImporter/ImportDecl.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2044,7 +2044,9 @@ namespace {
20442044
// C structs. That'll require some SIL and IRGen work, though.
20452045
if (decl->isNonTrivialToPrimitiveCopy() ||
20462046
decl->isNonTrivialToPrimitiveDestroy()) {
2047-
isNonTrivialPtrAuth = isNonTrivialDueToAddressDiversifiedPtrAuth(decl);
2047+
isNonTrivialPtrAuth = Impl.SwiftContext.SILOpts
2048+
.EnableImportPtrauthFieldFunctionPointers &&
2049+
isNonTrivialDueToAddressDiversifiedPtrAuth(decl);
20482050
if (!isNonTrivialPtrAuth) {
20492051
// Note that there is a third predicate related to these,
20502052
// isNonTrivialToPrimitiveDefaultInitialize. That one's not important

lib/IRGen/Callee.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@ namespace irgen {
8282
clang::PointerAuthQualifier pointerAuthQual,
8383
llvm::Value *storageAddress);
8484

85+
static PointerAuthInfo emit(IRGenFunction &IGF,
86+
const PointerAuthSchema &schema,
87+
llvm::Value *storageAddress,
88+
llvm::ConstantInt *otherDiscriminator);
89+
8590
static PointerAuthInfo forFunctionPointer(IRGenModule &IGM,
8691
CanSILFunctionType fnType);
8792

lib/IRGen/GenPointerAuth.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,33 @@ PointerAuthInfo::emit(IRGenFunction &IGF,
265265
return PointerAuthInfo(key, discriminator);
266266
}
267267

268+
PointerAuthInfo PointerAuthInfo::emit(IRGenFunction &IGF,
269+
const PointerAuthSchema &schema,
270+
llvm::Value *storageAddress,
271+
llvm::ConstantInt *otherDiscriminator) {
272+
if (!schema)
273+
return PointerAuthInfo();
274+
275+
unsigned key = schema.getKey();
276+
277+
llvm::Value *discriminator = otherDiscriminator;
278+
279+
// Factor in the address.
280+
if (schema.isAddressDiscriminated()) {
281+
assert(storageAddress &&
282+
"no storage address for address-discriminated schema");
283+
284+
if (!otherDiscriminator->isZero()) {
285+
discriminator = emitPointerAuthBlend(IGF, storageAddress, discriminator);
286+
} else {
287+
discriminator =
288+
IGF.Builder.CreatePtrToInt(storageAddress, IGF.IGM.Int64Ty);
289+
}
290+
}
291+
292+
return PointerAuthInfo(key, discriminator);
293+
}
294+
268295
llvm::ConstantInt *
269296
PointerAuthInfo::getOtherDiscriminator(IRGenModule &IGM,
270297
const PointerAuthSchema &schema,

lib/IRGen/IRGenSIL.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5837,7 +5837,8 @@ void IRGenSILFunction::visitBeginAccessInst(BeginAccessInst *access) {
58375837
setLoweredAddress(access, temp.getAddress());
58385838
return;
58395839
}
5840-
if (access->getAccessKind() == SILAccessKind::Modify) {
5840+
if (access->getAccessKind() == SILAccessKind::Modify ||
5841+
access->getAccessKind() == SILAccessKind::Init) {
58415842
// When we see a signed modify access, create a shadow stack location and
58425843
// set the lowered address of the access to this stack location.
58435844
auto temp = ti.allocateStack(*this, access->getType(), "ptrauth.temp");
@@ -5928,7 +5929,8 @@ void IRGenSILFunction::visitEndAccessInst(EndAccessInst *i) {
59285929
}
59295930

59305931
case SILAccessEnforcement::Signed: {
5931-
if (access->getAccessKind() != SILAccessKind::Modify) {
5932+
if (access->getAccessKind() != SILAccessKind::Modify ||
5933+
access->getAccessKind() != SILAccessKind::Init) {
59325934
// nothing to do.
59335935
return;
59345936
}

lib/SIL/Verifier/SILVerifier.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2342,8 +2342,11 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
23422342
switch (BAI->getAccessKind()) {
23432343
case SILAccessKind::Init:
23442344
case SILAccessKind::Deinit:
2345-
require(BAI->getEnforcement() == SILAccessEnforcement::Static,
2346-
"init/deinit accesses cannot use non-static enforcement");
2345+
// A signed access preserves the access marker until IRGen
2346+
require(
2347+
BAI->getEnforcement() == SILAccessEnforcement::Static ||
2348+
BAI->getEnforcement() == SILAccessEnforcement::Signed,
2349+
"init/deinit accesses cannot use non-static/non-signed enforcement");
23472350
break;
23482351

23492352
case SILAccessKind::Read:
@@ -3286,7 +3289,10 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
32863289
EI->getForwardingOwnershipKind() == OwnershipKind::Guaranteed,
32873290
"invalid forwarding ownership kind on tuple_extract instruction");
32883291

3289-
require(!EI->getStructDecl()->isNonTrivialPtrAuth(),
3292+
require(!EI->getModule()
3293+
.getOptions()
3294+
.EnableImportPtrauthFieldFunctionPointers ||
3295+
!EI->getField()->getPointerAuthQualifier().isPresent(),
32903296
"Imported structs with ptrauth qualified fields should not be "
32913297
"promoted to a value");
32923298

@@ -3337,7 +3343,8 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
33373343
require(EI->getField()->getDeclContext() == sd,
33383344
"struct_element_addr field is not a member of the struct");
33393345

3340-
if (EI->getStructDecl()->isNonTrivialPtrAuth()) {
3346+
if (EI->getModule().getOptions().EnableImportPtrauthFieldFunctionPointers &&
3347+
EI->getField()->getPointerAuthQualifier().isPresent()) {
33413348
for (auto *use : EI->getUses()) {
33423349
auto *bai = dyn_cast<BeginAccessInst>(use->getUser());
33433350
require(bai && bai->getEnforcement() == SILAccessEnforcement::Signed,

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)