mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 04:33:05 +00:00
Streamlined memory manager hierarchy for MCJIT and RuntimeDyld.
Patch by Ashok Thirumurthi git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167192 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
08e712b9ff
commit
647d6d7d3b
@ -10,7 +10,9 @@
|
||||
#ifndef LLVM_EXECUTION_ENGINE_JIT_MEMMANAGER_H
|
||||
#define LLVM_EXECUTION_ENGINE_JIT_MEMMANAGER_H
|
||||
|
||||
#include "llvm/ExecutionEngine/RuntimeDyld.h"
|
||||
#include "llvm/Support/DataTypes.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace llvm {
|
||||
@ -22,7 +24,7 @@ namespace llvm {
|
||||
/// memory for the code generated by the JIT. This can be reimplemented by
|
||||
/// clients that have a strong desire to control how the layout of JIT'd memory
|
||||
/// works.
|
||||
class JITMemoryManager {
|
||||
class JITMemoryManager : public RTDyldMemoryManager {
|
||||
protected:
|
||||
bool HasGOT;
|
||||
|
||||
@ -47,17 +49,6 @@ public:
|
||||
/// debugging, and may be turned on by default in debug mode.
|
||||
virtual void setPoisonMemory(bool poison) = 0;
|
||||
|
||||
/// getPointerToNamedFunction - This method returns the address of the
|
||||
/// specified function. As such it is only useful for resolving library
|
||||
/// symbols, not code generated symbols.
|
||||
///
|
||||
/// If AbortOnFailure is false and no function with the given name is
|
||||
/// found, this function silently returns a null pointer. Otherwise,
|
||||
/// it prints a message to stderr and aborts.
|
||||
///
|
||||
virtual void *getPointerToNamedFunction(const std::string &Name,
|
||||
bool AbortOnFailure = true) = 0;
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Global Offset Table Management
|
||||
//===--------------------------------------------------------------------===//
|
||||
@ -112,22 +103,6 @@ public:
|
||||
virtual void endFunctionBody(const Function *F, uint8_t *FunctionStart,
|
||||
uint8_t *FunctionEnd) = 0;
|
||||
|
||||
/// allocateCodeSection - Allocate a memory block of (at least) the given
|
||||
/// size suitable for executable code. The SectionID is a unique identifier
|
||||
/// assigned by the JIT and passed through to the memory manager for
|
||||
/// the instance class to use if it needs to communicate to the JIT about
|
||||
/// a given section after the fact.
|
||||
virtual uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
|
||||
unsigned SectionID) = 0;
|
||||
|
||||
/// allocateDataSection - Allocate a memory block of (at least) the given
|
||||
/// size suitable for data. The SectionID is a unique identifier
|
||||
/// assigned by the JIT and passed through to the memory manager for
|
||||
/// the instance class to use if it needs to communicate to the JIT about
|
||||
/// a given section after the fact.
|
||||
virtual uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
|
||||
unsigned SectionID) = 0;
|
||||
|
||||
/// allocateSpace - Allocate a memory block of the given size. This method
|
||||
/// cannot be called between calls to startFunctionBody and endFunctionBody.
|
||||
virtual uint8_t *allocateSpace(intptr_t Size, unsigned Alignment) = 0;
|
||||
|
@ -24,9 +24,9 @@ class RuntimeDyldImpl;
|
||||
class ObjectImage;
|
||||
|
||||
// RuntimeDyld clients often want to handle the memory management of
|
||||
// what gets placed where. For JIT clients, this is an abstraction layer
|
||||
// over the JITMemoryManager, which references objects by their source
|
||||
// representations in LLVM IR.
|
||||
// what gets placed where. For JIT clients, this is the subset of
|
||||
// JITMemoryManager required for dynamic loading of binaries.
|
||||
//
|
||||
// FIXME: As the RuntimeDyld fills out, additional routines will be needed
|
||||
// for the varying types of objects to be allocated.
|
||||
class RTDyldMemoryManager {
|
||||
@ -37,15 +37,26 @@ public:
|
||||
virtual ~RTDyldMemoryManager();
|
||||
|
||||
/// allocateCodeSection - Allocate a memory block of (at least) the given
|
||||
/// size suitable for executable code.
|
||||
/// size suitable for executable code. The SectionID is a unique identifier
|
||||
/// assigned by the JIT engine, and optionally recorded by the memory manager
|
||||
/// to access a loaded section.
|
||||
virtual uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
|
||||
unsigned SectionID) = 0;
|
||||
|
||||
/// allocateDataSection - Allocate a memory block of (at least) the given
|
||||
/// size suitable for data.
|
||||
/// size suitable for data. The SectionID is a unique identifier
|
||||
/// assigned by the JIT engine, and optionally recorded by the memory manager
|
||||
/// to access a loaded section.
|
||||
virtual uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
|
||||
unsigned SectionID) = 0;
|
||||
|
||||
/// getPointerToNamedFunction - This method returns the address of the
|
||||
/// specified function. As such it is only useful for resolving library
|
||||
/// symbols, not code generated symbols.
|
||||
///
|
||||
/// If AbortOnFailure is false and no function with the given name is
|
||||
/// found, this function returns a null pointer. Otherwise, it prints a
|
||||
/// message to stderr and aborts.
|
||||
virtual void *getPointerToNamedFunction(const std::string &Name,
|
||||
bool AbortOnFailure = true) = 0;
|
||||
};
|
||||
|
@ -1,4 +1,3 @@
|
||||
add_llvm_library(LLVMMCJIT
|
||||
MCJIT.cpp
|
||||
MCJITMemoryManager.cpp
|
||||
)
|
||||
|
@ -8,7 +8,6 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "MCJIT.h"
|
||||
#include "MCJITMemoryManager.h"
|
||||
#include "llvm/DerivedTypes.h"
|
||||
#include "llvm/Function.h"
|
||||
#include "llvm/ExecutionEngine/GenericValue.h"
|
||||
@ -46,7 +45,7 @@ ExecutionEngine *MCJIT::createJIT(Module *M,
|
||||
// FIXME: Don't do this here.
|
||||
sys::DynamicLibrary::LoadLibraryPermanently(0, NULL);
|
||||
|
||||
return new MCJIT(M, TM, new MCJITMemoryManager(JMM), GVsWithCode);
|
||||
return new MCJIT(M, TM, JMM, GVsWithCode);
|
||||
}
|
||||
|
||||
MCJIT::MCJIT(Module *m, TargetMachine *tm, RTDyldMemoryManager *MM,
|
||||
|
@ -1,14 +0,0 @@
|
||||
//==-- MCJITMemoryManager.cpp - Definition for the Memory Manager -*-C++ -*-==//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "MCJITMemoryManager.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
void MCJITMemoryManager::anchor() { }
|
@ -1,50 +0,0 @@
|
||||
//===-- MCJITMemoryManager.h - Definition for the Memory Manager ---C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_LIB_EXECUTIONENGINE_MCJITMEMORYMANAGER_H
|
||||
#define LLVM_LIB_EXECUTIONENGINE_MCJITMEMORYMANAGER_H
|
||||
|
||||
#include "llvm/Module.h"
|
||||
#include "llvm/ExecutionEngine/JITMemoryManager.h"
|
||||
#include "llvm/ExecutionEngine/RuntimeDyld.h"
|
||||
#include <assert.h>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
// The MCJIT memory manager is a layer between the standard JITMemoryManager
|
||||
// and the RuntimeDyld interface that maps objects, by name, onto their
|
||||
// matching LLVM IR counterparts in the module(s) being compiled.
|
||||
class MCJITMemoryManager : public RTDyldMemoryManager {
|
||||
virtual void anchor();
|
||||
OwningPtr<JITMemoryManager> JMM;
|
||||
|
||||
public:
|
||||
MCJITMemoryManager(JITMemoryManager *jmm) :
|
||||
JMM(jmm?jmm:JITMemoryManager::CreateDefaultMemManager()) {}
|
||||
|
||||
uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
|
||||
unsigned SectionID) {
|
||||
return JMM->allocateDataSection(Size, Alignment, SectionID);
|
||||
}
|
||||
|
||||
uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
|
||||
unsigned SectionID) {
|
||||
return JMM->allocateCodeSection(Size, Alignment, SectionID);
|
||||
}
|
||||
|
||||
virtual void *getPointerToNamedFunction(const std::string &Name,
|
||||
bool AbortOnFailure = true) {
|
||||
return JMM->getPointerToNamedFunction(Name, AbortOnFailure);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
@ -242,7 +242,7 @@ public:
|
||||
// the data cache but not to the instruction cache.
|
||||
virtual void invalidateInstructionCache();
|
||||
|
||||
// The MCJITMemoryManager doesn't use the following functions, so we don't
|
||||
// The RTDyldMemoryManager doesn't use the following functions, so we don't
|
||||
// need implement them.
|
||||
virtual void setMemoryWritable() {
|
||||
llvm_unreachable("Unexpected call!");
|
||||
|
Loading…
Reference in New Issue
Block a user