From 417a7c06e8c0d891820050a8eca4c9b11d7b0377 Mon Sep 17 00:00:00 2001 From: Misha Brukman Date: Fri, 30 May 2003 20:39:37 +0000 Subject: [PATCH] Since malloc is no longer used, no need to free() memory. Fixed BasicBlock patching by supplying correct type for the displacement. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6453 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/ExecutionEngine/JIT/SparcEmitter.cpp | 26 ++++++++++-------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/lib/ExecutionEngine/JIT/SparcEmitter.cpp b/lib/ExecutionEngine/JIT/SparcEmitter.cpp index 601be92857d..f2a62d22175 100644 --- a/lib/ExecutionEngine/JIT/SparcEmitter.cpp +++ b/lib/ExecutionEngine/JIT/SparcEmitter.cpp @@ -32,16 +32,8 @@ namespace { std::pair > > BBRefs; std::map BBLocations; std::vector ConstantPoolAddresses; - std::vector funcMemory; public: SparcEmitter(VM &vm) : TheVM(vm) {} - ~SparcEmitter() { - while (! funcMemory.empty()) { - void* addr = funcMemory.back(); - free(addr); - funcMemory.pop_back(); - } - } virtual void startFunction(MachineFunction &F); virtual void finishFunction(MachineFunction &F); @@ -76,12 +68,12 @@ MachineCodeEmitter *VM::createSparcEmitter(VM &V) { // FIXME: This should be rewritten to support a real memory manager for // executable memory pages! -void * SparcEmitter::getMemory(unsigned NumPages) { +void* SparcEmitter::getMemory(unsigned NumPages) { void *pa; if (NumPages == 0) return 0; static const long pageSize = sysconf (_SC_PAGESIZE); pa = mmap(0, pageSize*NumPages, PROT_READ|PROT_WRITE|PROT_EXEC, - MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); if (pa == MAP_FAILED) { perror("mmap"); abort(); @@ -91,28 +83,32 @@ void * SparcEmitter::getMemory(unsigned NumPages) { void SparcEmitter::startFunction(MachineFunction &F) { - CurBlock = (unsigned char *)getMemory(8); std::cerr << "Starting function " << F.getFunction()->getName() << "\n"; + CurBlock = (unsigned char *)getMemory(8); CurByte = CurBlock; // Start writing at the beginning of the fn. TheVM.addGlobalMapping(F.getFunction(), CurBlock); } void SparcEmitter::finishFunction(MachineFunction &F) { + std::cerr << "Finishing function " << F.getFunction()->getName() << "\n"; ConstantPoolAddresses.clear(); // Re-write branches to BasicBlocks for the entire function for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) { unsigned Location = BBLocations[BBRefs[i].first]; unsigned *Ref = BBRefs[i].second.first; MachineInstr *MI = BBRefs[i].second.second; + std::cerr << "attempting to resolve BB: " << i << "\n"; for (unsigned i=0, e = MI->getNumOperands(); i != e; ++i) { MachineOperand &op = MI->getOperand(i); - if (op.isImmediate()) { - MI->SetMachineOperandConst(i, op.getType(), Location); + if (op.isPCRelativeDisp()) { + MI->SetMachineOperandConst(i, MachineOperand::MO_SignExtendedImmed, + Location); + std::cerr << "Rewrote BB ref: "; + unsigned fixedInstr = SparcV9CodeEmitter::getBinaryCodeForInstr(*MI); + *Ref = fixedInstr; break; } } - unsigned fixedInstr = SparcV9CodeEmitter::getBinaryCodeForInstr(*MI); - *Ref = fixedInstr; } BBRefs.clear(); BBLocations.clear();