Home | History | Annotate | Download | only in IR
      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   void copyAttributesFrom(const GlobalIFunc *Src) {
     51     GlobalValue::copyAttributesFrom(Src);
     52   }
     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   void setResolver(Constant *Resolver) {
     63     setIndirectSymbol(Resolver);
     64   }
     65   const Constant *getResolver() const {
     66     return getIndirectSymbol();
     67   }
     68   Constant *getResolver() {
     69     return getIndirectSymbol();
     70   }
     71 
     72   // Methods for support type inquiry through isa, cast, and dyn_cast:
     73   static bool classof(const Value *V) {
     74     return V->getValueID() == Value::GlobalIFuncVal;
     75   }
     76 };
     77 
     78 } // end namespace llvm
     79 
     80 #endif // LLVM_IR_GLOBALIFUNC_H
     81