--- Ia32CodeEmitter-orignal.cpp 2008-08-19 08:05:24.000000000 +0000 +++ Ia32CodeEmitter.cpp 2008-08-20 12:02:20.000000000 +0000 @@ -63,7 +63,7 @@ void emitCode(); void registerExceptionHandlers(); void registerExceptionRegion(void * regionStart, void * regionEnd, Node * regionDispatchNode); - void packCode(); + int packCode(); void postPass(); void registerDirectCall(MethodDesc * md, void * instStartAddr); @@ -297,7 +297,7 @@ constantAreaLayout.doLayout(irManager); irManager->resolveRuntimeInfo(); emitCode(); - packCode(); + //....packCode(); //.this phase of function is moved into code emit phase postPass(); constantAreaLayout.finalizeSwitchTables(); traversalInfo.resize(irManager->getFlowGraph()->getMaxNodeId() + 1, 0); @@ -457,6 +457,7 @@ // as the current scheme only process basic blocks as jmp targets const unsigned maxMethodSize = (irManager->getMaxInstId() + irManager->getFlowGraph()->getMaxNodeId())*MAX_NATIVE_INST_SIZE; + // U_8 * codeStreamStart = (U_8*)malloc( maxMethodSize ); //+---- free() below @@ -472,6 +473,7 @@ LoopTree * lt = irManager->getFlowGraph()->getLoopTree(); U_8 * ip = codeStreamStart; + for( BasicBlock * bb = (BasicBlock*)irManager->getFlowGraph()->getEntryNode(); bb != NULL; bb=bb->getLayoutSucc()) { assert(bb->getFirstInst()!=NULL); @@ -543,8 +545,16 @@ unsigned codeSize = (unsigned)(ip-codeStreamStart); assert( codeSize < maxMethodSize ); +/*....Perform code pack to resolve target addresses of +branck instructions before copy the native code to code buffer....*/ + irManager->setCodeStartAddr(codeStreamStart); + int my_displacement = packCode(); + codeSize = codeSize - my_displacement; + + U_8 * codeBlock = (U_8*)irManager->getCompilationInterface().allocateCodeBlock( codeSize , JMP_TARGET_ALIGMENT, getCodeSectionHeat(0), 0, false ); + memcpy(codeBlock, codeStreamStart, codeSize); irManager->setCodeStartAddr(codeBlock); @@ -555,8 +565,10 @@ // } + //________________________________________________________________________________________ -void CodeEmitter::packCode() { +int CodeEmitter::packCode() { + int bbDisplacement = 0; bool newOpndsCreated = false; for( BasicBlock * bb = (BasicBlock*)irManager->getFlowGraph()->getEntryNode(), * succ; bb != NULL; bb = succ) { succ = (BasicBlock*)bb->getLayoutSucc(); @@ -588,7 +600,7 @@ int succCodeOffset = succ->getCodeOffset(); int bbCodeSize = bb->getCodeSize(); int succCodeSize = succ->getCodeSize(); - int bbDisplacement = succCodeOffset - bbCodeOffset - bbCodeSize; + bbDisplacement = succCodeOffset - bbCodeOffset - bbCodeSize; if (bbDisplacement != 0){ U_8 * ps = (U_8*)irManager->getCodeStartAddr() + succCodeOffset; U_8 * pd = ps - bbDisplacement; @@ -602,6 +614,9 @@ } if (newOpndsCreated) irManager->fixLivenessInfo(); + + return bbDisplacement; + } //________________________________________________________________________________________