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