1//===-------- llvm/GlobalAlias.h - GlobalAlias class ------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains the declaration of the GlobalAlias class, which
11// represents a single function or variable alias in the IR.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_IR_GLOBALALIAS_H
16#define LLVM_IR_GLOBALALIAS_H
17
18#include "llvm/ADT/ilist_node.h"
19#include "llvm/IR/GlobalIndirectSymbol.h"
20#include "llvm/IR/Value.h"
21
22namespace llvm {
23
24class Twine;
25class Module;
26template <typename ValueSubClass> class SymbolTableListTraits;
27
28class GlobalAlias : public GlobalIndirectSymbol,
29                    public ilist_node<GlobalAlias> {
30  friend class SymbolTableListTraits<GlobalAlias>;
31
32  GlobalAlias(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage,
33              const Twine &Name, Constant *Aliasee, Module *Parent);
34
35public:
36  GlobalAlias(const GlobalAlias &) = delete;
37  GlobalAlias &operator=(const GlobalAlias &) = delete;
38
39  /// If a parent module is specified, the alias is automatically inserted into
40  /// the end of the specified module's alias list.
41  static GlobalAlias *create(Type *Ty, unsigned AddressSpace,
42                             LinkageTypes Linkage, const Twine &Name,
43                             Constant *Aliasee, Module *Parent);
44
45  // Without the Aliasee.
46  static GlobalAlias *create(Type *Ty, unsigned AddressSpace,
47                             LinkageTypes Linkage, const Twine &Name,
48                             Module *Parent);
49
50  // The module is taken from the Aliasee.
51  static GlobalAlias *create(Type *Ty, unsigned AddressSpace,
52                             LinkageTypes Linkage, const Twine &Name,
53                             GlobalValue *Aliasee);
54
55  // Type, Parent and AddressSpace taken from the Aliasee.
56  static GlobalAlias *create(LinkageTypes Linkage, const Twine &Name,
57                             GlobalValue *Aliasee);
58
59  // Linkage, Type, Parent and AddressSpace taken from the Aliasee.
60  static GlobalAlias *create(const Twine &Name, GlobalValue *Aliasee);
61
62  void copyAttributesFrom(const GlobalValue *Src) {
63    GlobalValue::copyAttributesFrom(Src);
64  }
65
66  /// removeFromParent - This method unlinks 'this' from the containing module,
67  /// but does not delete it.
68  ///
69  void removeFromParent();
70
71  /// eraseFromParent - This method unlinks 'this' from the containing module
72  /// and deletes it.
73  ///
74  void eraseFromParent();
75
76  /// These methods retrieve and set alias target.
77  void setAliasee(Constant *Aliasee);
78  const Constant *getAliasee() const {
79    return getIndirectSymbol();
80  }
81  Constant *getAliasee() {
82    return getIndirectSymbol();
83  }
84
85  static bool isValidLinkage(LinkageTypes L) {
86    return isExternalLinkage(L) || isLocalLinkage(L) ||
87      isWeakLinkage(L) || isLinkOnceLinkage(L);
88  }
89
90  // Methods for support type inquiry through isa, cast, and dyn_cast:
91  static inline bool classof(const Value *V) {
92    return V->getValueID() == Value::GlobalAliasVal;
93  }
94};
95
96} // end namespace llvm
97
98#endif // LLVM_IR_GLOBALALIAS_H
99