1a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov//===-------- llvm/GlobalAlias.h - GlobalAlias class ------------*- C++ -*-===//
27bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov//
37bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov//                     The LLVM Compiler Infrastructure
47bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
77bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov//
87bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov//===----------------------------------------------------------------------===//
97bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov//
107bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov// This file contains the declaration of the GlobalAlias class, which
11a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov// represents a single function or variable alias in the IR.
127bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov//
137bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov//===----------------------------------------------------------------------===//
147bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
15674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_IR_GLOBALALIAS_H
16674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_IR_GLOBALALIAS_H
177bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
18255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/Twine.h"
19255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/ilist_node.h"
200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalValue.h"
210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/OperandTraits.h"
227bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
237bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovnamespace llvm {
247bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
257bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovclass Module;
267bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovtemplate<typename ValueSubClass, typename ItemParentClass>
277bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  class SymbolTableListTraits;
287bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
29fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass GlobalAlias : public GlobalValue, public ilist_node<GlobalAlias> {
307bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  friend class SymbolTableListTraits<GlobalAlias, Module>;
319f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper  void operator=(const GlobalAlias &) LLVM_DELETED_FUNCTION;
329f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper  GlobalAlias(const GlobalAlias &) LLVM_DELETED_FUNCTION;
337bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
347bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  void setParent(Module *parent);
357bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
367bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovpublic:
37efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  // allocate space for exactly one operand
38051a950000e21935165db56695e35bade668193bGabor Greif  void *operator new(size_t s) {
39efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif    return User::operator new(s, 1);
40051a950000e21935165db56695e35bade668193bGabor Greif  }
417bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  /// GlobalAlias ctor - If a parent module is specified, the alias is
42a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  /// automatically inserted into the end of the specified module's alias list.
43db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  GlobalAlias(Type *Ty, LinkageTypes Linkage, const Twine &Name = "",
44a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov              Constant* Aliasee = 0, Module *Parent = 0);
457bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
46efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  /// Provide fast operand accessors
474f2d6950fb4dfc91359e549dd454059d2cb2cb5fJay Foad  DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant);
48efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
497bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  /// removeFromParent - This method unlinks 'this' from the containing module,
507bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  /// but does not delete it.
517bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  ///
5271c8c175fb2a477b90efe745aaf48ed9265300a9Daniel Dunbar  virtual void removeFromParent();
537bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
547bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  /// eraseFromParent - This method unlinks 'this' from the containing module
557bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  /// and deletes it.
567bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  ///
5771c8c175fb2a477b90efe745aaf48ed9265300a9Daniel Dunbar  virtual void eraseFromParent();
587bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
59a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  /// set/getAliasee - These methods retrive and set alias target.
601afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  void setAliasee(Constant *GV);
611afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  const Constant *getAliasee() const {
624f2d6950fb4dfc91359e549dd454059d2cb2cb5fJay Foad    return getOperand(0);
63a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  }
641afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  Constant *getAliasee() {
654f2d6950fb4dfc91359e549dd454059d2cb2cb5fJay Foad    return getOperand(0);
66a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  }
67c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov  /// getAliasedGlobal() - Aliasee can be either global or bitcast of
68c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov  /// global. This method retrives the global for both aliasee flavours.
691afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  const GlobalValue *getAliasedGlobal() const;
70e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov
71aff167819b8e78424c6de26c90f6d8e1777fe09dAnton Korobeynikov  /// resolveAliasedGlobal() - This method tries to ultimately resolve the alias
72aff167819b8e78424c6de26c90f6d8e1777fe09dAnton Korobeynikov  /// by going through the aliasing chain and trying to find the very last
7319e861a4ffb896f16a691d5ac869e894df3cd464Anton Korobeynikov  /// global. Returns NULL if a cycle was found. If stopOnWeak is false, then
74832b2a9cd8870211bf2d347d7b435beacbb06c8dAnton Korobeynikov  /// the whole chain aliasing chain is traversed, otherwise - only strong
75832b2a9cd8870211bf2d347d7b435beacbb06c8dAnton Korobeynikov  /// aliases.
761afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  const GlobalValue *resolveAliasedGlobal(bool stopOnWeak = true) const;
77e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov
787bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  // Methods for support type inquiry through isa, cast, and dyn_cast:
797bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  static inline bool classof(const Value *V) {
807bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov    return V->getValueID() == Value::GlobalAliasVal;
817bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov  }
827bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov};
837bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
84efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greiftemplate <>
8567c619ba3eae68dcdb3f9340d82b33173aa0c256Jay Foadstruct OperandTraits<GlobalAlias> :
8667c619ba3eae68dcdb3f9340d82b33173aa0c256Jay Foad  public FixedNumOperandTraits<GlobalAlias, 1> {
87efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif};
88efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
89ff7782bcc9235b1dc4c7fcb0497c52e4717eeffcJay FoadDEFINE_TRANSPARENT_OPERAND_ACCESSORS(GlobalAlias, Constant)
90efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
917bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov} // End llvm namespace
927bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov
937bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov#endif
94