Home | History | Annotate | Download | only in IR
      1 //===-------- llvm/GlobalAlias.h - GlobalAlias class ------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file contains the declaration of the GlobalAlias class, which
     11 // represents a single function or variable alias in the IR.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_IR_GLOBALALIAS_H
     16 #define LLVM_IR_GLOBALALIAS_H
     17 
     18 #include "llvm/ADT/Twine.h"
     19 #include "llvm/ADT/ilist_node.h"
     20 #include "llvm/IR/GlobalValue.h"
     21 #include "llvm/IR/OperandTraits.h"
     22 
     23 namespace llvm {
     24 
     25 class Module;
     26 template<typename ValueSubClass, typename ItemParentClass>
     27   class SymbolTableListTraits;
     28 
     29 class GlobalAlias : public GlobalValue, public ilist_node<GlobalAlias> {
     30   friend class SymbolTableListTraits<GlobalAlias, Module>;
     31   void operator=(const GlobalAlias &) LLVM_DELETED_FUNCTION;
     32   GlobalAlias(const GlobalAlias &) LLVM_DELETED_FUNCTION;
     33 
     34   void setParent(Module *parent);
     35 
     36 public:
     37   // allocate space for exactly one operand
     38   void *operator new(size_t s) {
     39     return User::operator new(s, 1);
     40   }
     41   /// GlobalAlias ctor - If a parent module is specified, the alias is
     42   /// automatically inserted into the end of the specified module's alias list.
     43   GlobalAlias(Type *Ty, LinkageTypes Linkage, const Twine &Name = "",
     44               Constant* Aliasee = 0, Module *Parent = 0);
     45 
     46   /// Provide fast operand accessors
     47   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant);
     48 
     49   /// removeFromParent - This method unlinks 'this' from the containing module,
     50   /// but does not delete it.
     51   ///
     52   virtual void removeFromParent();
     53 
     54   /// eraseFromParent - This method unlinks 'this' from the containing module
     55   /// and deletes it.
     56   ///
     57   virtual void eraseFromParent();
     58 
     59   /// set/getAliasee - These methods retrive and set alias target.
     60   void setAliasee(Constant *GV);
     61   const Constant *getAliasee() const {
     62     return getOperand(0);
     63   }
     64   Constant *getAliasee() {
     65     return getOperand(0);
     66   }
     67   /// getAliasedGlobal() - Aliasee can be either global or bitcast of
     68   /// global. This method retrives the global for both aliasee flavours.
     69   const GlobalValue *getAliasedGlobal() const;
     70 
     71   /// resolveAliasedGlobal() - This method tries to ultimately resolve the alias
     72   /// by going through the aliasing chain and trying to find the very last
     73   /// global. Returns NULL if a cycle was found. If stopOnWeak is false, then
     74   /// the whole chain aliasing chain is traversed, otherwise - only strong
     75   /// aliases.
     76   const GlobalValue *resolveAliasedGlobal(bool stopOnWeak = true) const;
     77 
     78   // Methods for support type inquiry through isa, cast, and dyn_cast:
     79   static inline bool classof(const Value *V) {
     80     return V->getValueID() == Value::GlobalAliasVal;
     81   }
     82 };
     83 
     84 template <>
     85 struct OperandTraits<GlobalAlias> :
     86   public FixedNumOperandTraits<GlobalAlias, 1> {
     87 };
     88 
     89 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(GlobalAlias, Constant)
     90 
     91 } // End llvm namespace
     92 
     93 #endif
     94