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