1de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===- llvm/GlobalIndirectSymbol.h - GlobalIndirectSymbol class -*- C++ -*-===//
2de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
3de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
4de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
5de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
6de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// License. See LICENSE.TXT for details.
7de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
8de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
9de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file contains the declaration of the GlobalIndirectSymbol class, which
11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// is a base class for GlobalAlias and GlobalIFunc. It contains all common code
12de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// for aliases and ifuncs.
13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
14de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifndef LLVM_IR_GLOBALINDIRECTSYMBOL_H
17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define LLVM_IR_GLOBALINDIRECTSYMBOL_H
18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/GlobalValue.h"
20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/OperandTraits.h"
21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace llvm {
23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass GlobalIndirectSymbol : public GlobalValue {
25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void operator=(const GlobalIndirectSymbol &) = delete;
26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  GlobalIndirectSymbol(const GlobalIndirectSymbol &) = delete;
27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprotected:
29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  GlobalIndirectSymbol(Type *Ty, ValueTy VTy, unsigned AddressSpace,
30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      LinkageTypes Linkage, const Twine &Name, Constant *Symbol);
31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // allocate space for exactly one operand
34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void *operator new(size_t s) {
35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return User::operator new(s, 1);
36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Provide fast operand accessors
39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant);
40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// These methods set and retrieve indirect symbol.
42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void setIndirectSymbol(Constant *Symbol) {
43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    setOperand(0, Symbol);
44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Constant *getIndirectSymbol() const {
46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return const_cast<GlobalIndirectSymbol *>(this)->getIndirectSymbol();
47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Constant *getIndirectSymbol() {
49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return getOperand(0);
50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const GlobalObject *getBaseObject() const {
53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return const_cast<GlobalIndirectSymbol *>(this)->getBaseObject();
54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  GlobalObject *getBaseObject() {
56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return dyn_cast<GlobalObject>(getIndirectSymbol()->stripInBoundsOffsets());
57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const GlobalObject *getBaseObject(const DataLayout &DL, APInt &Offset) const {
60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return const_cast<GlobalIndirectSymbol *>(this)->getBaseObject(DL, Offset);
61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  GlobalObject *getBaseObject(const DataLayout &DL, APInt &Offset) {
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return dyn_cast<GlobalObject>(
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        getIndirectSymbol()->stripAndAccumulateInBoundsConstantOffsets(DL,
65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                                       Offset));
66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Methods for support type inquiry through isa, cast, and dyn_cast:
69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static inline bool classof(const Value *V) {
70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return V->getValueID() == Value::GlobalAliasVal ||
71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar           V->getValueID() == Value::GlobalIFuncVal;
72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <>
76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct OperandTraits<GlobalIndirectSymbol> :
77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  public FixedNumOperandTraits<GlobalIndirectSymbol, 1> {
78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarDEFINE_TRANSPARENT_OPERAND_ACCESSORS(GlobalIndirectSymbol, Constant)
81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // End llvm namespace
83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#endif
85