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