GlobalAlias.h revision 7ed47a13356daed2a34cd2209a31f92552e3bdd8
14dccb90e92ba9e4abffe0177493b6db9949678ddTed Kremenek//===-------- llvm/GlobalAlias.h - GlobalAlias class ------------*- C++ -*-===//
2610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek//
3610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek//                     The LLVM Compiler Infrastructure
494b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek//
594b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek// This file is distributed under the University of Illinois Open Source
6610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek// License. See LICENSE.TXT for details.
7610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek//
8610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek//===----------------------------------------------------------------------===//
9610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek//
10610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek// This file contains the declaration of the GlobalAlias class, which
11610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek// represents a single function or variable alias in the IR.
12610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek//
13610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek//===----------------------------------------------------------------------===//
14610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
15610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek#ifndef LLVM_GLOBAL_ALIAS_H
16610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek#define LLVM_GLOBAL_ALIAS_H
17610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
18610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek#include "llvm/GlobalValue.h"
19610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
2094b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremeneknamespace llvm {
2194b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek
22610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekclass Module;
23610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekclass Constant;
24610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekclass PointerType;
25610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenektemplate<typename ValueSubClass, typename ItemParentClass>
2694b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek  class SymbolTableListTraits;
2794b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek
28610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekclass GlobalAlias : public GlobalValue {
29610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  friend class SymbolTableListTraits<GlobalAlias, Module>;
30610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  void operator=(const GlobalAlias &);     // Do not implement
31610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  GlobalAlias(const GlobalAlias &);     // Do not implement
3294b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek
3394b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek  void setParent(Module *parent);
34610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
35610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  GlobalAlias *Prev, *Next;
36610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  void setNext(GlobalAlias *N) { Next = N; }
37610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  void setPrev(GlobalAlias *N) { Prev = N; }
3894b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek
39610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  // getNext/Prev - Return the next or previous alias in the list.
40610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek        GlobalAlias *getNext()       { return Next; }
4194b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek  const GlobalAlias *getNext() const { return Next; }
42610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek        GlobalAlias *getPrev()       { return Prev; }
43610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  const GlobalAlias *getPrev() const { return Prev; }
44610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
45610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  Use Aliasee;
46610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenekpublic:
47610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  /// GlobalAlias ctor - If a parent module is specified, the alias is
48610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  /// automatically inserted into the end of the specified module's alias list.
49610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  GlobalAlias(const Type *Ty, LinkageTypes Linkage, const std::string &Name = "",
50610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek              Constant* Aliasee = 0, Module *Parent = 0);
51610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
52610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  /// isDeclaration - Is this global variable lacking an initializer?  If so,
53610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  /// the global variable is defined in some other translation unit, and is thus
5494b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek  /// only a declaration here.
55610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  virtual bool isDeclaration() const;
56610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
57610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  /// removeFromParent - This method unlinks 'this' from the containing module,
5894b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek  /// but does not delete it.
59610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  ///
6094b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek  void removeFromParent();
61610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
62610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  /// eraseFromParent - This method unlinks 'this' from the containing module
63610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  /// and deletes it.
6494b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek  ///
65610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  void eraseFromParent();
66610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
67610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  virtual void print(std::ostream &OS) const;
6894b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek  void print(std::ostream *OS) const { if (OS) print(*OS); }
69610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
70610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  /// set/getAliasee - These methods retrive and set alias target.
71610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  void setAliasee(Constant* GV);
7294b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek  const Constant* getAliasee() const {
73610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek    return cast_or_null<Constant>(getOperand(0));
74610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  }
75610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  Constant* getAliasee() {
7694b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek    return cast_or_null<Constant>(getOperand(0));
77610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  }
78610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  /// getAliasedGlobal() - Aliasee can be either global or bitcast of
79610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  /// global. This method retrives the global for both aliasee flavours.
8094b1b4d785bc0f09f6af4be394e59d51f35dda60Ted Kremenek  const GlobalValue* getAliasedGlobal() const;
81610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek
82610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  // Methods for support type inquiry through isa, cast, and dyn_cast:
83610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  static inline bool classof(const GlobalAlias *) { return true; }
84610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  static inline bool classof(const Value *V) {
85610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek    return V->getValueID() == Value::GlobalAliasVal;
86610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek  }
87610068c8cd2321f90e147b12cf794e1f840b6405Ted Kremenek};
88c104e53639de4424b83955acfadc977773b5883dTed Kremenek
89c104e53639de4424b83955acfadc977773b5883dTed Kremenek} // End llvm namespace
90c104e53639de4424b83955acfadc977773b5883dTed Kremenek
91c104e53639de4424b83955acfadc977773b5883dTed Kremenek#endif
92c104e53639de4424b83955acfadc977773b5883dTed Kremenek