1//===-------- llvm/GlobalIFunc.h - GlobalIFunc 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/// \brief
11/// This file contains the declaration of the GlobalIFunc class, which
12/// represents a single indirect function in the IR. Indirect function uses
13/// ELF symbol type extension to mark that the address of a declaration should
14/// be resolved at runtime by calling a resolver function.
15///
16//===----------------------------------------------------------------------===//
17
18#ifndef LLVM_IR_GLOBALIFUNC_H
19#define LLVM_IR_GLOBALIFUNC_H
20
21#include "llvm/ADT/ilist_node.h"
22#include "llvm/IR/GlobalIndirectSymbol.h"
23
24namespace llvm {
25
26class Twine;
27class Module;
28
29// Traits class for using GlobalIFunc in symbol table in Module.
30template <typename ValueSubClass> class SymbolTableListTraits;
31
32class GlobalIFunc final : public GlobalIndirectSymbol,
33                          public ilist_node<GlobalIFunc> {
34  friend class SymbolTableListTraits<GlobalIFunc>;
35  void operator=(const GlobalIFunc &) = delete;
36  GlobalIFunc(const GlobalIFunc &) = delete;
37
38  void setParent(Module *parent);
39
40  GlobalIFunc(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage,
41              const Twine &Name, Constant *Resolver, Module *Parent);
42
43public:
44  /// If a parent module is specified, the ifunc is automatically inserted into
45  /// the end of the specified module's ifunc list.
46  static GlobalIFunc *create(Type *Ty, unsigned AddressSpace,
47                             LinkageTypes Linkage, const Twine &Name,
48                             Constant *Resolver, Module *Parent);
49
50  /// This method unlinks 'this' from the containing module, but does not
51  /// delete it.
52  void removeFromParent() final;
53
54  /// This method unlinks 'this' from the containing module and deletes it.
55  void eraseFromParent() final;
56
57  /// These methods retrieve and set ifunc resolver function.
58  void setResolver(Constant *Resolver) {
59    setIndirectSymbol(Resolver);
60  }
61  const Constant *getResolver() const {
62    return getIndirectSymbol();
63  }
64  Constant *getResolver() {
65    return getIndirectSymbol();
66  }
67
68  // Methods for support type inquiry through isa, cast, and dyn_cast:
69  static inline bool classof(const Value *V) {
70    return V->getValueID() == Value::GlobalIFuncVal;
71  }
72};
73
74} // End llvm namespace
75
76#endif
77