summaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CGExprConstant.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/CodeGen/CGExprConstant.cpp')
-rw-r--r--clang/lib/CodeGen/CGExprConstant.cpp23
1 files changed, 20 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp
index b016c6e36d1a..b21ebeee4bed 100644
--- a/clang/lib/CodeGen/CGExprConstant.cpp
+++ b/clang/lib/CodeGen/CGExprConstant.cpp
@@ -2049,10 +2049,13 @@ namespace {
struct ConstantLValue {
llvm::Constant *Value;
bool HasOffsetApplied;
+ bool HasDestPointerAuth;
/*implicit*/ ConstantLValue(llvm::Constant *value,
- bool hasOffsetApplied = false)
- : Value(value), HasOffsetApplied(hasOffsetApplied) {}
+ bool hasOffsetApplied = false,
+ bool hasDestPointerAuth = false)
+ : Value(value), HasOffsetApplied(hasOffsetApplied),
+ HasDestPointerAuth(hasDestPointerAuth) {}
/*implicit*/ ConstantLValue(ConstantAddress address)
: ConstantLValue(address.getPointer()) {}
@@ -2157,6 +2160,14 @@ llvm::Constant *ConstantLValueEmitter::tryEmit() {
value = applyOffset(value);
}
+ // Apply pointer-auth signing from the destination type.
+ if (PointerAuthQualifier PointerAuth = DestType.getPointerAuth();
+ PointerAuth && !result.HasDestPointerAuth) {
+ value = Emitter.tryEmitConstantSignedPointer(value, PointerAuth);
+ if (!value)
+ return nullptr;
+ }
+
// Convert to the appropriate type; this could be an lvalue for
// an integer. FIXME: performAddrSpaceCast
if (isa<llvm::PointerType>(destTy))
@@ -2200,6 +2211,12 @@ ConstantLValueEmitter::tryEmitBase(const APValue::LValueBase &base) {
return CGM.GetWeakRefReference(D).getPointer();
auto PtrAuthSign = [&](llvm::Constant *C) {
+ if (PointerAuthQualifier PointerAuth = DestType.getPointerAuth()) {
+ C = applyOffset(C);
+ C = Emitter.tryEmitConstantSignedPointer(C, PointerAuth);
+ return ConstantLValue(C, /*applied offset*/ true, /*signed*/ true);
+ }
+
CGPointerAuthInfo AuthInfo;
if (EnablePtrAuthFunctionTypeDiscrimination)
@@ -2213,7 +2230,7 @@ ConstantLValueEmitter::tryEmitBase(const APValue::LValueBase &base) {
C = CGM.getConstantSignedPointer(
C, AuthInfo.getKey(), nullptr,
cast_or_null<llvm::ConstantInt>(AuthInfo.getDiscriminator()));
- return ConstantLValue(C, /*applied offset*/ true);
+ return ConstantLValue(C, /*applied offset*/ true, /*signed*/ true);
}
return ConstantLValue(C);