diff options
Diffstat (limited to 'lib/Target')
-rw-r--r-- | lib/Target/SparcV9/SparcV9CodeEmitter.cpp | 71 |
1 files changed, 36 insertions, 35 deletions
diff --git a/lib/Target/SparcV9/SparcV9CodeEmitter.cpp b/lib/Target/SparcV9/SparcV9CodeEmitter.cpp index be4d3df..b1e260d 100644 --- a/lib/Target/SparcV9/SparcV9CodeEmitter.cpp +++ b/lib/Target/SparcV9/SparcV9CodeEmitter.cpp @@ -14,15 +14,15 @@ #include "llvm/CodeGen/MachineInstr.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetData.h" +#include "Support/Statistic.h" #include "Support/hash_set" #include "SparcInternals.h" #include "SparcV9CodeEmitter.h" bool UltraSparc::addPassesToEmitMachineCode(PassManager &PM, MachineCodeEmitter &MCE) { - //PM.add(new SparcV9CodeEmitter(MCE)); - //MachineCodeEmitter *M = MachineCodeEmitter::createDebugMachineCodeEmitter(); - MachineCodeEmitter *M = MachineCodeEmitter::createFilePrinterEmitter(MCE); + MachineCodeEmitter *M = &MCE; + DEBUG(MachineCodeEmitter::createFilePrinterEmitter(MCE)); PM.add(new SparcV9CodeEmitter(*this, *M)); PM.add(createMachineCodeDestructionPass()); // Free stuff no longer needed return false; @@ -182,7 +182,7 @@ uint64_t JITResolver::insertFarJumpAtAddr(int64_t Target, uint64_t Addr) { void JITResolver::CompilationCallback() { uint64_t CameFrom = (uint64_t)(intptr_t)__builtin_return_address(0); int64_t Target = (int64_t)TheJITResolver->resolveFunctionReference(CameFrom); - std::cerr << "In callback! Addr=0x" << std::hex << CameFrom << "\n"; + DEBUG(std::cerr << "In callback! Addr=0x" << std::hex << CameFrom << "\n"); // Rewrite the call target... so that we don't fault every time we execute // the call. @@ -275,8 +275,8 @@ void JITResolver::CompilationCallback() { uint64_t JITResolver::emitStubForFunction(Function *F) { MCE.startFunctionStub(*F, 6); - std::cerr << "Emitting stub at addr: 0x" - << std::hex << MCE.getCurrentPCValue() << "\n"; + DEBUG(std::cerr << "Emitting stub at addr: 0x" + << std::hex << MCE.getCurrentPCValue() << "\n"); unsigned o6 = SparcIntRegClass::o6; // save %sp, -192, %sp @@ -289,7 +289,8 @@ uint64_t JITResolver::emitStubForFunction(Function *F) { int64_t CallTarget = (Addr-CurrPC) >> 2; if (CallTarget >= (1 << 30) || CallTarget <= -(1 << 30)) { - std::cerr << "Call target beyond 30 bit limit of CALL: " <<CallTarget<<"\n"; + std::cerr << "Call target beyond 30 bit limit of CALL: " + << CallTarget << "\n"; abort(); } // call CallTarget ;; invoke the callback @@ -403,30 +404,29 @@ int64_t SparcV9CodeEmitter::getMachineOpValue(MachineInstr &MI, // or things that get fixed up later by the JIT. if (MO.isVirtualRegister()) { - std::cerr << "ERROR: virtual register found in machine code.\n"; + DEBUG(std::cerr << "ERROR: virtual register found in machine code.\n"); abort(); } else if (MO.isPCRelativeDisp()) { - std::cerr << "PCRelativeDisp: "; + DEBUG(std::cerr << "PCRelativeDisp: "); Value *V = MO.getVRegValue(); if (BasicBlock *BB = dyn_cast<BasicBlock>(V)) { - std::cerr << "Saving reference to BB (VReg)\n"; + DEBUG(std::cerr << "Saving reference to BB (VReg)\n"); unsigned* CurrPC = (unsigned*)(intptr_t)MCE.getCurrentPCValue(); BBRefs.push_back(std::make_pair(BB, std::make_pair(CurrPC, &MI))); } else if (const Constant *C = dyn_cast<Constant>(V)) { if (ConstantMap.find(C) != ConstantMap.end()) { rv = (int64_t)MCE.getConstantPoolEntryAddress(ConstantMap[C]); - std::cerr << "const: 0x" << std::hex << rv - << "\n" << std::dec; + DEBUG(std::cerr << "const: 0x" << std::hex << rv << "\n"); } else { - std::cerr << "ERROR: constant not in map:" << MO << "\n"; + DEBUG(std::cerr << "ERROR: constant not in map:" << MO << "\n"); abort(); } } else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) { // same as MO.isGlobalAddress() - std::cerr << "GlobalValue: "; + DEBUG(std::cerr << "GlobalValue: "); // external function calls, etc.? if (Function *F = dyn_cast<Function>(GV)) { - std::cerr << "Function: "; + DEBUG(std::cerr << "Function: "); if (F->isExternal()) { // Sparc backend broken: this MO should be `ExternalSymbol' rv = (int64_t)MCE.getGlobalValueAddress(F->getName()); @@ -434,31 +434,30 @@ int64_t SparcV9CodeEmitter::getMachineOpValue(MachineInstr &MI, rv = (int64_t)MCE.getGlobalValueAddress(F); } if (rv == 0) { - std::cerr << "not yet generated\n"; + DEBUG(std::cerr << "not yet generated\n"); // Function has not yet been code generated! TheJITResolver->addFunctionReference(MCE.getCurrentPCValue(), F); // Delayed resolution... rv = TheJITResolver->getLazyResolver(F); } else { - std::cerr << "already generated: 0x" << std::hex << rv << "\n" - << std::dec; + DEBUG(std::cerr << "already generated: 0x" << std::hex << rv << "\n"); } } else { - std::cerr << "not a function: " << *GV << "\n"; + DEBUG(std::cerr << "not a function: " << *GV << "\n"); abort(); } // The real target of the call is Addr = PC + (rv * 4) // So undo that: give the instruction (Addr - PC) / 4 if (MI.getOpcode() == V9::CALL) { int64_t CurrPC = MCE.getCurrentPCValue(); - std::cerr << "rv addr: 0x" << std::hex << rv << "\n"; - std::cerr << "curr PC: 0x" << CurrPC << "\n"; + DEBUG(std::cerr << "rv addr: 0x" << std::hex << rv << "\n" + << "curr PC: 0x" << CurrPC << "\n"); rv = (rv - CurrPC) >> 2; if (rv >= (1<<29) || rv <= -(1<<29)) { std::cerr << "addr out of bounds for the 30-bit call: " << rv << "\n"; abort(); } - std::cerr << "returning addr: 0x" << rv << "\n" << std::dec; + DEBUG(std::cerr << "returning addr: 0x" << rv << "\n"); } } else { std::cerr << "ERROR: PC relative disp unhandled:" << MO << "\n"; @@ -477,21 +476,21 @@ int64_t SparcV9CodeEmitter::getMachineOpValue(MachineInstr &MI, // Find the real register number for use in an instruction /////realReg = getRealRegNum(fakeReg, regClass, MI); realReg = getRealRegNum(fakeReg, regType, MI); - std::cerr << MO << ": Reg[" << std::dec << fakeReg << "] = " - << realReg << "\n"; + DEBUG(std::cerr << MO << ": Reg[" << std::dec << fakeReg << "] = " + << realReg << "\n"); rv = realReg; } else if (MO.isImmediate()) { rv = MO.getImmedValue(); - std::cerr << "immed: " << rv << "\n"; + DEBUG(std::cerr << "immed: " << rv << "\n"); } else if (MO.isGlobalAddress()) { - std::cerr << "GlobalAddress: not PC-relative\n"; + DEBUG(std::cerr << "GlobalAddress: not PC-relative\n"); rv = (int64_t) (intptr_t)getGlobalAddress(cast<GlobalValue>(MO.getVRegValue()), MI, MO.isPCRelative()); } else if (MO.isMachineBasicBlock()) { // Duplicate code of the above case for VirtualRegister, BasicBlock... // It should really hit this case, but Sparc backend uses VRegs instead - std::cerr << "Saving reference to MBB\n"; + DEBUG(std::cerr << "Saving reference to MBB\n"); BasicBlock *BB = MO.getMachineBasicBlock()->getBasicBlock(); unsigned* CurrPC = (unsigned*)(intptr_t)MCE.getCurrentPCValue(); BBRefs.push_back(std::make_pair(BB, std::make_pair(CurrPC, &MI))); @@ -537,9 +536,9 @@ unsigned SparcV9CodeEmitter::getValueBit(int64_t Val, unsigned bit) { bool SparcV9CodeEmitter::runOnMachineFunction(MachineFunction &MF) { MCE.startFunction(MF); - std::cerr << "Starting function " << MF.getFunction()->getName() + DEBUG(std::cerr << "Starting function " << MF.getFunction()->getName() << ", address: " << "0x" << std::hex - << (long)MCE.getCurrentPCValue() << "\n"; + << (long)MCE.getCurrentPCValue() << "\n"); // The Sparc backend does not use MachineConstantPool; // instead, it has its own constant pool implementation. @@ -551,7 +550,8 @@ bool SparcV9CodeEmitter::runOnMachineFunction(MachineFunction &MF) { { Constant *C = (Constant*)*I; unsigned idx = MCP.getConstantPoolIndex(C); - std::cerr << "Mapping constant 0x" << (intptr_t)C << " to " << idx << "\n"; + DEBUG(std::cerr << "Mapping constant 0x" << (intptr_t)C << " to " + << idx << "\n"); ConstantMap[C] = idx; } MCE.emitConstantPool(&MCP); @@ -560,14 +560,15 @@ bool SparcV9CodeEmitter::runOnMachineFunction(MachineFunction &MF) { emitBasicBlock(*I); MCE.finishFunction(MF); - std::cerr << "Finishing function " << MF.getFunction()->getName() << "\n"; + DEBUG(std::cerr << "Finishing function " << MF.getFunction()->getName() + << "\n"); ConstantMap.clear(); for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) { long Location = BBLocations[BBRefs[i].first]; unsigned *Ref = BBRefs[i].second.first; MachineInstr *MI = BBRefs[i].second.second; - std::cerr << "Fixup @" << std::hex << Ref << " to " << Location - << " in instr: " << std::dec << *MI << "\n"; + DEBUG(std::cerr << "Fixup @" << std::hex << Ref << " to " << Location + << " in instr: " << std::dec << *MI << "\n"); } // Resolve branches to BasicBlocks for the entire function @@ -575,7 +576,7 @@ bool SparcV9CodeEmitter::runOnMachineFunction(MachineFunction &MF) { long 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"; + DEBUG(std::cerr << "attempting to resolve BB: " << i << "\n"); for (unsigned ii = 0, ee = MI->getNumOperands(); ii != ee; ++ii) { MachineOperand &op = MI->getOperand(ii); if (op.isPCRelativeDisp()) { @@ -596,7 +597,7 @@ bool SparcV9CodeEmitter::runOnMachineFunction(MachineFunction &MF) { else if (hiBits32) { MI->setOperandHi32(ii); } else if (loBits64) { MI->setOperandLo64(ii); } else if (hiBits64) { MI->setOperandHi64(ii); } - std::cerr << "Rewrote BB ref: "; + DEBUG(std::cerr << "Rewrote BB ref: "); unsigned fixedInstr = SparcV9CodeEmitter::getBinaryCodeForInstr(*MI); *Ref = fixedInstr; break; |