mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-20 10:24:12 +00:00
(and hopefully on Windows). The bots have been down most of the day because of this, and it's not clear to me what all will be required to fix it. The commits started with r153205, then r153207, r153208, and r153221. The first commit seems to be the real culprit, but I couldn't revert a smaller number of patches. When resubmitting, r153207 and r153208 should be folded into r153205, they were simple build fixes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153241 91177308-0d34-0410-b5e6-96231b3b80d8
112 lines
3.4 KiB
C++
112 lines
3.4 KiB
C++
//===-- RuntimeDyldImpl.h - Run-time dynamic linker for MC-JIT --*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Interface for the implementations of runtime dynamic linker facilities.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_RUNTIME_DYLD_IMPL_H
|
|
#define LLVM_RUNTIME_DYLD_IMPL_H
|
|
|
|
#include "llvm/ExecutionEngine/RuntimeDyld.h"
|
|
#include "llvm/ADT/DenseMap.h"
|
|
#include "llvm/ADT/StringMap.h"
|
|
#include "llvm/ADT/Twine.h"
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include "llvm/ExecutionEngine/ExecutionEngine.h"
|
|
#include "llvm/Support/Memory.h"
|
|
#include "llvm/Support/MemoryBuffer.h"
|
|
#include "llvm/Support/system_error.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include "llvm/Support/Debug.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace llvm {
|
|
class RuntimeDyldImpl {
|
|
protected:
|
|
unsigned CPUType;
|
|
unsigned CPUSubtype;
|
|
|
|
// The MemoryManager to load objects into.
|
|
RTDyldMemoryManager *MemMgr;
|
|
|
|
// For each section, we have a MemoryBlock of it's data.
|
|
// Indexed by SectionID.
|
|
SmallVector<sys::MemoryBlock, 32> Sections;
|
|
// For each section, the address it will be considered to live at for
|
|
// relocations. The same as the pointer to the above memory block for hosted
|
|
// JITs. Indexed by SectionID.
|
|
SmallVector<uint64_t, 32> SectionLoadAddress;
|
|
|
|
// Keep a map of starting local address to the SectionID which references it.
|
|
// Lookup function for when we assign virtual addresses.
|
|
DenseMap<void *, unsigned> SectionLocalMemToID;
|
|
|
|
// Master symbol table. As modules are loaded and external symbols are
|
|
// resolved, their addresses are stored here as a SectionID/Offset pair.
|
|
typedef std::pair<unsigned, uint64_t> SymbolLoc;
|
|
StringMap<SymbolLoc> SymbolTable;
|
|
|
|
bool HasError;
|
|
std::string ErrorStr;
|
|
|
|
// Set the error state and record an error string.
|
|
bool Error(const Twine &Msg) {
|
|
ErrorStr = Msg.str();
|
|
HasError = true;
|
|
return true;
|
|
}
|
|
|
|
uint8_t *getSectionAddress(unsigned SectionID) {
|
|
return (uint8_t*)Sections[SectionID].base();
|
|
}
|
|
void extractFunction(StringRef Name, uint8_t *StartAddress,
|
|
uint8_t *EndAddress);
|
|
|
|
public:
|
|
RuntimeDyldImpl(RTDyldMemoryManager *mm) : MemMgr(mm), HasError(false) {}
|
|
|
|
virtual ~RuntimeDyldImpl();
|
|
|
|
virtual bool loadObject(MemoryBuffer *InputBuffer) = 0;
|
|
|
|
void *getSymbolAddress(StringRef Name) {
|
|
// FIXME: Just look up as a function for now. Overly simple of course.
|
|
// Work in progress.
|
|
if (SymbolTable.find(Name) == SymbolTable.end())
|
|
return 0;
|
|
SymbolLoc Loc = SymbolTable.lookup(Name);
|
|
return getSectionAddress(Loc.first) + Loc.second;
|
|
}
|
|
|
|
virtual void resolveRelocations();
|
|
|
|
virtual void reassignSectionAddress(unsigned SectionID, uint64_t Addr) = 0;
|
|
|
|
void mapSectionAddress(void *LocalAddress, uint64_t TargetAddress);
|
|
|
|
// Is the linker in an error state?
|
|
bool hasError() { return HasError; }
|
|
|
|
// Mark the error condition as handled and continue.
|
|
void clearError() { HasError = false; }
|
|
|
|
// Get the error message.
|
|
StringRef getErrorString() { return ErrorStr; }
|
|
|
|
virtual bool isCompatibleFormat(const MemoryBuffer *InputBuffer) const = 0;
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
|
|
#endif
|