| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- //===- llvm/GlobalIndirectSymbol.h - GlobalIndirectSymbol class -*- 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 file contains the declaration of the GlobalIndirectSymbol class, which
- // is a base class for GlobalAlias and GlobalIFunc. It contains all common code
- // for aliases and ifuncs.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_IR_GLOBALINDIRECTSYMBOL_H
- #define LLVM_IR_GLOBALINDIRECTSYMBOL_H
- #include "llvm/IR/GlobalObject.h"
- #include "llvm/IR/GlobalValue.h"
- #include "llvm/IR/OperandTraits.h"
- #include "llvm/IR/User.h"
- #include "llvm/IR/Value.h"
- #include "llvm/Support/Casting.h"
- #include <cstddef>
- namespace llvm {
- class GlobalIndirectSymbol : public GlobalValue {
- protected:
- GlobalIndirectSymbol(Type *Ty, ValueTy VTy, unsigned AddressSpace,
- LinkageTypes Linkage, const Twine &Name, Constant *Symbol);
- public:
- GlobalIndirectSymbol(const GlobalIndirectSymbol &) = delete;
- GlobalIndirectSymbol &operator=(const GlobalIndirectSymbol &) = delete;
- // allocate space for exactly one operand
- void *operator new(size_t s) {
- return User::operator new(s, 1);
- }
- /// Provide fast operand accessors
- DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant);
- void copyAttributesFrom(const GlobalValue *Src) {
- GlobalValue::copyAttributesFrom(Src);
- }
- /// These methods set and retrieve indirect symbol.
- void setIndirectSymbol(Constant *Symbol) {
- setOperand(0, Symbol);
- }
- const Constant *getIndirectSymbol() const {
- return getOperand(0);
- }
- Constant *getIndirectSymbol() {
- return const_cast<Constant *>(
- static_cast<const GlobalIndirectSymbol *>(this)->getIndirectSymbol());
- }
- const GlobalObject *getBaseObject() const;
- GlobalObject *getBaseObject() {
- return const_cast<GlobalObject *>(
- static_cast<const GlobalIndirectSymbol *>(this)->getBaseObject());
- }
- const GlobalObject *getBaseObject(const DataLayout &DL, APInt &Offset) const {
- return dyn_cast<GlobalObject>(
- getIndirectSymbol()->stripAndAccumulateInBoundsConstantOffsets(DL,
- Offset));
- }
- GlobalObject *getBaseObject(const DataLayout &DL, APInt &Offset) {
- return const_cast<GlobalObject *>(
- static_cast<const GlobalIndirectSymbol *>(this)
- ->getBaseObject(DL, Offset));
- }
- // Methods for support type inquiry through isa, cast, and dyn_cast:
- static bool classof(const Value *V) {
- return V->getValueID() == Value::GlobalAliasVal ||
- V->getValueID() == Value::GlobalIFuncVal;
- }
- };
- template <>
- struct OperandTraits<GlobalIndirectSymbol> :
- public FixedNumOperandTraits<GlobalIndirectSymbol, 1> {
- };
- DEFINE_TRANSPARENT_OPERAND_ACCESSORS(GlobalIndirectSymbol, Constant)
- } // end namespace llvm
- #endif // LLVM_IR_GLOBALINDIRECTSYMBOL_H
|