//===----- CGPointerAuthInfo.h - -------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Pointer auth info class. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_LIB_CODEGEN_CGPOINTERAUTHINFO_H #define LLVM_CLANG_LIB_CODEGEN_CGPOINTERAUTHINFO_H #include "clang/AST/Type.h" #include "clang/Basic/LangOptions.h" #include "llvm/IR/Type.h" #include "llvm/IR/Value.h" namespace clang { namespace CodeGen { class CGPointerAuthInfo { private: PointerAuthenticationMode AuthenticationMode : 2; unsigned IsIsaPointer : 1; unsigned AuthenticatesNullValues : 1; unsigned Key : 2; llvm::Value *Discriminator; public: CGPointerAuthInfo() : AuthenticationMode(PointerAuthenticationMode::None), IsIsaPointer(false), AuthenticatesNullValues(false), Key(0), Discriminator(nullptr) {} CGPointerAuthInfo(unsigned Key, PointerAuthenticationMode AuthenticationMode, bool IsIsaPointer, bool AuthenticatesNullValues, llvm::Value *Discriminator) : AuthenticationMode(AuthenticationMode), IsIsaPointer(IsIsaPointer), AuthenticatesNullValues(AuthenticatesNullValues), Key(Key), Discriminator(Discriminator) { assert(!Discriminator || Discriminator->getType()->isIntegerTy() || Discriminator->getType()->isPointerTy()); } explicit operator bool() const { return isSigned(); } bool isSigned() const { return AuthenticationMode != PointerAuthenticationMode::None; } unsigned getKey() const { assert(isSigned()); return Key; } llvm::Value *getDiscriminator() const { assert(isSigned()); return Discriminator; } PointerAuthenticationMode getAuthenticationMode() const { return AuthenticationMode; } bool isIsaPointer() const { return IsIsaPointer; } bool authenticatesNullValues() const { return AuthenticatesNullValues; } bool shouldStrip() const { return AuthenticationMode == PointerAuthenticationMode::Strip || AuthenticationMode == PointerAuthenticationMode::SignAndStrip; } bool shouldSign() const { return AuthenticationMode == PointerAuthenticationMode::SignAndStrip || AuthenticationMode == PointerAuthenticationMode::SignAndAuth; } bool shouldAuth() const { return AuthenticationMode == PointerAuthenticationMode::SignAndAuth; } friend bool operator!=(const CGPointerAuthInfo &LHS, const CGPointerAuthInfo &RHS) { return LHS.Key != RHS.Key || LHS.Discriminator != RHS.Discriminator || LHS.AuthenticationMode != RHS.AuthenticationMode; } friend bool operator==(const CGPointerAuthInfo &LHS, const CGPointerAuthInfo &RHS) { return !(LHS != RHS); } }; } // end namespace CodeGen } // end namespace clang #endif