Skip to content

Commit 7d169a9

Browse files
committed
Add additional PointerAuthInfo::emit api
1 parent 64f9165 commit 7d169a9

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

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,

0 commit comments

Comments
 (0)