/Users/buildslave/jenkins/sharedspace/clang-stage2-coverage-R@2/llvm/include/llvm/IR/GlobalIFunc.h
Line | Count | Source (jump to first uncovered line) |
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 | | #include "llvm/IR/Value.h" |
24 | | |
25 | | namespace llvm { |
26 | | |
27 | | class Twine; |
28 | | class Module; |
29 | | |
30 | | // Traits class for using GlobalIFunc in symbol table in Module. |
31 | | template <typename ValueSubClass> class SymbolTableListTraits; |
32 | | |
33 | | class GlobalIFunc final : public GlobalIndirectSymbol, |
34 | | public ilist_node<GlobalIFunc> { |
35 | | friend class SymbolTableListTraits<GlobalIFunc>; |
36 | | |
37 | | GlobalIFunc(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, |
38 | | const Twine &Name, Constant *Resolver, Module *Parent); |
39 | | |
40 | | public: |
41 | | GlobalIFunc(const GlobalIFunc &) = delete; |
42 | | GlobalIFunc &operator=(const GlobalIFunc &) = delete; |
43 | | |
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 | 0 | void copyAttributesFrom(const GlobalIFunc *Src) { |
51 | 0 | GlobalValue::copyAttributesFrom(Src); |
52 | 0 | } |
53 | | |
54 | | /// This method unlinks 'this' from the containing module, but does not |
55 | | /// delete it. |
56 | | void removeFromParent(); |
57 | | |
58 | | /// This method unlinks 'this' from the containing module and deletes it. |
59 | | void eraseFromParent(); |
60 | | |
61 | | /// These methods retrieve and set ifunc resolver function. |
62 | 1 | void setResolver(Constant *Resolver) { |
63 | 1 | setIndirectSymbol(Resolver); |
64 | 1 | } |
65 | 184 | const Constant *getResolver() const { |
66 | 184 | return getIndirectSymbol(); |
67 | 184 | } |
68 | 0 | Constant *getResolver() { |
69 | 0 | return getIndirectSymbol(); |
70 | 0 | } |
71 | | |
72 | | // Methods for support type inquiry through isa, cast, and dyn_cast: |
73 | 7.54M | static bool classof(const Value *V) { |
74 | 7.54M | return V->getValueID() == Value::GlobalIFuncVal; |
75 | 7.54M | } |
76 | | }; |
77 | | |
78 | | } // end namespace llvm |
79 | | |
80 | | #endif // LLVM_IR_GLOBALIFUNC_H |