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