mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-13 23:25:06 +00:00
Support for allocation of TLS variables in the JIT. Allocation of a global
variable is moved to the execution engine. The JIT calls the TargetJITInfo to allocate thread local storage. Currently, only linux/x86 knows how to allocate thread local global variables. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58142 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -52,6 +52,12 @@ ExecutionEngine::~ExecutionEngine() {
|
||||
delete Modules[i];
|
||||
}
|
||||
|
||||
char* ExecutionEngine::getMemoryForGV(const GlobalVariable* GV) {
|
||||
const Type *ElTy = GV->getType()->getElementType();
|
||||
size_t GVSize = (size_t)getTargetData()->getABITypeSize(ElTy);
|
||||
return new char[GVSize];
|
||||
}
|
||||
|
||||
/// removeModuleProvider - Remove a ModuleProvider from the list of modules.
|
||||
/// Release module from ModuleProvider.
|
||||
Module* ExecutionEngine::removeModuleProvider(ModuleProvider *P,
|
||||
@@ -873,7 +879,6 @@ void ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) {
|
||||
/// their initializers into the memory.
|
||||
///
|
||||
void ExecutionEngine::emitGlobals() {
|
||||
const TargetData *TD = getTargetData();
|
||||
|
||||
// Loop over all of the global variables in the program, allocating the memory
|
||||
// to hold them. If there is more than one module, do a prepass over globals
|
||||
@@ -934,12 +939,7 @@ void ExecutionEngine::emitGlobals() {
|
||||
}
|
||||
|
||||
if (!I->isDeclaration()) {
|
||||
// Get the type of the global.
|
||||
const Type *Ty = I->getType()->getElementType();
|
||||
|
||||
// Allocate some memory for it!
|
||||
unsigned Size = TD->getABITypeSize(Ty);
|
||||
addGlobalMapping(I, new char[Size]);
|
||||
addGlobalMapping(I, getMemoryForGV(I));
|
||||
} else {
|
||||
// External variable reference. Try to use the dynamic loader to
|
||||
// get a pointer to it.
|
||||
@@ -991,15 +991,18 @@ void ExecutionEngine::EmitGlobalVariable(const GlobalVariable *GV) {
|
||||
void *GA = getPointerToGlobalIfAvailable(GV);
|
||||
DOUT << "Global '" << GV->getName() << "' -> " << GA << "\n";
|
||||
|
||||
const Type *ElTy = GV->getType()->getElementType();
|
||||
size_t GVSize = (size_t)getTargetData()->getABITypeSize(ElTy);
|
||||
if (GA == 0) {
|
||||
// If it's not already specified, allocate memory for the global.
|
||||
GA = new char[GVSize];
|
||||
GA = getMemoryForGV(GV);
|
||||
addGlobalMapping(GV, GA);
|
||||
}
|
||||
|
||||
InitializeMemory(GV->getInitializer(), GA);
|
||||
|
||||
// Don't initialize if it's thread local, let the client do it.
|
||||
if (!GV->isThreadLocal())
|
||||
InitializeMemory(GV->getInitializer(), GA);
|
||||
|
||||
const Type *ElTy = GV->getType()->getElementType();
|
||||
size_t GVSize = (size_t)getTargetData()->getABITypeSize(ElTy);
|
||||
NumInitBytes += (unsigned)GVSize;
|
||||
++NumGlobals;
|
||||
}
|
||||
|
Reference in New Issue
Block a user