Home | History | Annotate | Download | only in ExecutionEngine
      1 //===-- RuntimeDyld.h - Run-time dynamic linker 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 for the runtime dynamic linker facilities of the MC-JIT.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_RUNTIME_DYLD_H
     15 #define LLVM_RUNTIME_DYLD_H
     16 
     17 #include "llvm/ADT/StringRef.h"
     18 #include "llvm/Support/Memory.h"
     19 
     20 namespace llvm {
     21 
     22 class RuntimeDyldImpl;
     23 class MemoryBuffer;
     24 
     25 // RuntimeDyld clients often want to handle the memory management of
     26 // what gets placed where. For JIT clients, this is an abstraction layer
     27 // over the JITMemoryManager, which references objects by their source
     28 // representations in LLVM IR.
     29 // FIXME: As the RuntimeDyld fills out, additional routines will be needed
     30 //        for the varying types of objects to be allocated.
     31 class RTDyldMemoryManager {
     32   RTDyldMemoryManager(const RTDyldMemoryManager&);  // DO NOT IMPLEMENT
     33   void operator=(const RTDyldMemoryManager&);       // DO NOT IMPLEMENT
     34 public:
     35   RTDyldMemoryManager() {}
     36   virtual ~RTDyldMemoryManager();
     37 
     38   // Allocate ActualSize bytes, or more, for the named function. Return
     39   // a pointer to the allocated memory and update Size to reflect how much
     40   // memory was acutally allocated.
     41   virtual uint8_t *startFunctionBody(const char *Name, uintptr_t &Size) = 0;
     42 
     43   // Mark the end of the function, including how much of the allocated
     44   // memory was actually used.
     45   virtual void endFunctionBody(const char *Name, uint8_t *FunctionStart,
     46                                uint8_t *FunctionEnd) = 0;
     47 };
     48 
     49 class RuntimeDyld {
     50   RuntimeDyld(const RuntimeDyld &);     // DO NOT IMPLEMENT
     51   void operator=(const RuntimeDyld &);  // DO NOT IMPLEMENT
     52 
     53   // RuntimeDyldImpl is the actual class. RuntimeDyld is just the public
     54   // interface.
     55   RuntimeDyldImpl *Dyld;
     56   RTDyldMemoryManager *MM;
     57 public:
     58   RuntimeDyld(RTDyldMemoryManager*);
     59   ~RuntimeDyld();
     60 
     61   bool loadObject(MemoryBuffer *InputBuffer);
     62   // Get the address of our local copy of the symbol. This may or may not
     63   // be the address used for relocation (clients can copy the data around
     64   // and resolve relocatons based on where they put it).
     65   void *getSymbolAddress(StringRef Name);
     66   // Resolve the relocations for all symbols we currently know about.
     67   void resolveRelocations();
     68   // Change the address associated with a symbol when resolving relocations.
     69   // Any relocations already associated with the symbol will be re-resolved.
     70   void reassignSymbolAddress(StringRef Name, uint8_t *Addr);
     71   StringRef getErrorString();
     72 };
     73 
     74 } // end namespace llvm
     75 
     76 #endif
     77