Skip to content
Snippets Groups Projects
Commit 1c1568ed authored by Misha Brukman's avatar Misha Brukman
Browse files

Put all debug print statements under the DEBUG() guard to make output clean so

that tests can automatically diff the output.

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