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/ilist_node.h" 19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/GlobalIndirectSymbol.h" 207bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov 217bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovnamespace llvm { 227bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov 23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass Twine; 247bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovclass Module; 25f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <typename ValueSubClass> class SymbolTableListTraits; 267bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov 27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass GlobalAlias : public GlobalIndirectSymbol, 28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar public ilist_node<GlobalAlias> { 29f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar friend class SymbolTableListTraits<GlobalAlias>; 30ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines void operator=(const GlobalAlias &) = delete; 31ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines GlobalAlias(const GlobalAlias &) = delete; 327bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov 337bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov void setParent(Module *parent); 347bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov 35f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar GlobalAlias(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, 36f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const Twine &Name, Constant *Aliasee, Module *Parent); 37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 387bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikovpublic: 39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// If a parent module is specified, the alias is automatically inserted into 40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// the end of the specified module's alias list. 41f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar static GlobalAlias *create(Type *Ty, unsigned AddressSpace, 42f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar LinkageTypes Linkage, const Twine &Name, 43f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Constant *Aliasee, Module *Parent); 44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Without the Aliasee. 46f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar static GlobalAlias *create(Type *Ty, unsigned AddressSpace, 47f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar LinkageTypes Linkage, const Twine &Name, 48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Module *Parent); 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // The module is taken from the Aliasee. 51f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar static GlobalAlias *create(Type *Ty, unsigned AddressSpace, 52f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar LinkageTypes Linkage, const Twine &Name, 53f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar GlobalValue *Aliasee); 54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Type, Parent and AddressSpace taken from the Aliasee. 56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines static GlobalAlias *create(LinkageTypes Linkage, const Twine &Name, 57c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines GlobalValue *Aliasee); 58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Linkage, Type, Parent and AddressSpace taken from the Aliasee. 60c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines static GlobalAlias *create(const Twine &Name, GlobalValue *Aliasee); 617bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov 627bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov /// removeFromParent - This method unlinks 'this' from the containing module, 637bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov /// but does not delete it. 647bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov /// 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void removeFromParent() override; 667bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov 677bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov /// eraseFromParent - This method unlinks 'this' from the containing module 687bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov /// and deletes it. 697bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov /// 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void eraseFromParent() override; 717bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov 72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// These methods retrieve and set alias target. 73c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void setAliasee(Constant *Aliasee); 74c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const Constant *getAliasee() const { 75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return getIndirectSymbol(); 76a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov } 77c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Constant *getAliasee() { 78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return getIndirectSymbol(); 79abd37961d55680e5e946b9e336ce14b4ac56f830Peter Collingbourne } 80e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov 811a525e8c80305777e3ca0cba0e1903fdbf04aa86Rafael Espindola static bool isValidLinkage(LinkageTypes L) { 821a525e8c80305777e3ca0cba0e1903fdbf04aa86Rafael Espindola return isExternalLinkage(L) || isLocalLinkage(L) || 831a525e8c80305777e3ca0cba0e1903fdbf04aa86Rafael Espindola isWeakLinkage(L) || isLinkOnceLinkage(L); 841a525e8c80305777e3ca0cba0e1903fdbf04aa86Rafael Espindola } 851a525e8c80305777e3ca0cba0e1903fdbf04aa86Rafael Espindola 867bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov // Methods for support type inquiry through isa, cast, and dyn_cast: 877bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov static inline bool classof(const Value *V) { 887bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov return V->getValueID() == Value::GlobalAliasVal; 897bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov } 907bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov}; 917bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov 927bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov} // End llvm namespace 937bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov 947bc428fa6f182f5adf04ff62d72370091f64beebAnton Korobeynikov#endif 95