Home | History | Annotate | Download | only in ExecutionEngine
      1 //===-- RTDyldMemoryManager.cpp - Memory manager for MC-JIT -----*- 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 // Interface of the runtime dynamic memory manager base class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_EXECUTIONENGINE_RT_DYLD_MEMORY_MANAGER_H
     15 #define LLVM_EXECUTIONENGINE_RT_DYLD_MEMORY_MANAGER_H
     16 
     17 #include "llvm/ADT/StringRef.h"
     18 #include "llvm/Support/CBindingWrapping.h"
     19 #include "llvm/Support/Memory.h"
     20 #include "llvm-c/ExecutionEngine.h"
     21 
     22 namespace llvm {
     23 
     24 // RuntimeDyld clients often want to handle the memory management of
     25 // what gets placed where. For JIT clients, this is the subset of
     26 // JITMemoryManager required for dynamic loading of binaries.
     27 //
     28 // FIXME: As the RuntimeDyld fills out, additional routines will be needed
     29 //        for the varying types of objects to be allocated.
     30 class RTDyldMemoryManager {
     31   RTDyldMemoryManager(const RTDyldMemoryManager&) LLVM_DELETED_FUNCTION;
     32   void operator=(const RTDyldMemoryManager&) LLVM_DELETED_FUNCTION;
     33 public:
     34   RTDyldMemoryManager() {}
     35   virtual ~RTDyldMemoryManager();
     36 
     37   /// Allocate a memory block of (at least) the given size suitable for
     38   /// executable code. The SectionID is a unique identifier assigned by the JIT
     39   /// engine, and optionally recorded by the memory manager to access a loaded
     40   /// section.
     41   virtual uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
     42                                        unsigned SectionID) = 0;
     43 
     44   /// Allocate a memory block of (at least) the given size suitable for data.
     45   /// The SectionID is a unique identifier assigned by the JIT engine, and
     46   /// optionally recorded by the memory manager to access a loaded section.
     47   virtual uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
     48                                        unsigned SectionID, bool IsReadOnly) = 0;
     49 
     50   /// Register the EH frames with the runtime so that c++ exceptions work.
     51   virtual void registerEHFrames(StringRef SectionData);
     52 
     53   /// This method returns the address of the specified function. As such it is
     54   /// only useful for resolving library symbols, not code generated symbols.
     55   ///
     56   /// If \p AbortOnFailure is false and no function with the given name is
     57   /// found, this function returns a null pointer. Otherwise, it prints a
     58   /// message to stderr and aborts.
     59   virtual void *getPointerToNamedFunction(const std::string &Name,
     60                                           bool AbortOnFailure = true);
     61 
     62   /// This method is called when object loading is complete and section page
     63   /// permissions can be applied.  It is up to the memory manager implementation
     64   /// to decide whether or not to act on this method.  The memory manager will
     65   /// typically allocate all sections as read-write and then apply specific
     66   /// permissions when this method is called.  Code sections cannot be executed
     67   /// until this function has been called.  In addition, any cache coherency
     68   /// operations needed to reliably use the memory are also performed.
     69   ///
     70   /// Returns true if an error occurred, false otherwise.
     71   virtual bool finalizeMemory(std::string *ErrMsg = 0) = 0;
     72 };
     73 
     74 // Create wrappers for C Binding types (see CBindingWrapping.h).
     75 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(
     76     RTDyldMemoryManager, LLVMMCJITMemoryManagerRef)
     77 
     78 } // namespace llvm
     79 
     80 #endif // LLVM_EXECUTIONENGINE_RT_DYLD_MEMORY_MANAGER_H
     81