//===-- Address.h - An aligned address -------------------------*- 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 // //===----------------------------------------------------------------------===// // // This class provides a simple wrapper for a pair of a pointer and an // alignment. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_LIB_CODEGEN_ADDRESS_H #define LLVM_CLANG_LIB_CODEGEN_ADDRESS_H #include "CGPointerAuthInfo.h" #include "clang/AST/CharUnits.h" #include "clang/AST/Type.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/IR/Constants.h" #include "llvm/Support/MathExtras.h" namespace clang { namespace CodeGen { class Address; class CGBuilderTy; class CodeGenFunction; class CodeGenModule; // Indicates whether a pointer is known not to be null. enum KnownNonNull_t { … }; /// An abstract representation of an aligned address. This is designed to be an /// IR-level abstraction, carrying just the information necessary to perform IR /// operations on an address like loads and stores. In particular, it doesn't /// carry C type information or allow the representation of things like /// bit-fields; clients working at that level should generally be using /// `LValue`. /// The pointer contained in this class is known to be unsigned. class RawAddress { … }; /// Like RawAddress, an abstract representation of an aligned address, but the /// pointer contained in this class is possibly signed. /// /// This is designed to be an IR-level abstraction, carrying just the /// information necessary to perform IR operations on an address like loads and /// stores. In particular, it doesn't carry C type information or allow the /// representation of things like bit-fields; clients working at that level /// should generally be using `LValue`. /// /// An address may be either *raw*, meaning that it's an ordinary machine /// pointer, or *signed*, meaning that the pointer carries an embedded /// pointer-authentication signature. Representing signed pointers directly in /// this abstraction allows the authentication to be delayed as long as possible /// without forcing IRGen to use totally different code paths for signed and /// unsigned values or to separately propagate signature information through /// every API that manipulates addresses. Pointer arithmetic on signed addresses /// (e.g. drilling down to a struct field) is accumulated into a separate offset /// which is applied when the address is finally accessed. class Address { … }; inline RawAddress::RawAddress(Address Addr) : … { … } /// A specialization of Address that requires the address to be an /// LLVM Constant. class ConstantAddress : public RawAddress { … }; } // Present a minimal LLVM-like casting interface. template <class U> inline U cast(CodeGen::Address addr) { … } template <class U> inline bool isa(CodeGen::Address addr) { … } } #endif