[llvm-commits] CVS: llvm/tools/lli/JIT/SparcEmitter.cpp
Misha Brukman
brukman at cs.uiuc.edu
Sat May 31 01:27:01 PDT 2003
Changes in directory llvm/tools/lli/JIT:
SparcEmitter.cpp updated: 1.4 -> 1.5
---
Log message:
Fixed rewriting of branches -- they now work forward and backward.
---
Diffs of the changes:
Index: llvm/tools/lli/JIT/SparcEmitter.cpp
diff -u llvm/tools/lli/JIT/SparcEmitter.cpp:1.4 llvm/tools/lli/JIT/SparcEmitter.cpp:1.5
--- llvm/tools/lli/JIT/SparcEmitter.cpp:1.4 Fri May 30 15:39:37 2003
+++ llvm/tools/lli/JIT/SparcEmitter.cpp Sat May 31 01:26:48 2003
@@ -30,7 +30,7 @@
std::vector<std::pair<BasicBlock*,
std::pair<unsigned*,MachineInstr*> > > BBRefs;
- std::map<BasicBlock*, unsigned> BBLocations;
+ std::map<BasicBlock*, long> BBLocations;
std::vector<void*> ConstantPoolAddresses;
public:
SparcEmitter(VM &vm) : TheVM(vm) {}
@@ -94,15 +94,20 @@
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];
+ 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";
for (unsigned i=0, e = MI->getNumOperands(); i != e; ++i) {
MachineOperand &op = MI->getOperand(i);
if (op.isPCRelativeDisp()) {
+ // the instruction's branch target is made such that it branches to
+ // PC + (br target * 4), so undo that arithmetic here:
+ // Location is the target of the branch
+ // Ref is the location of the instruction, and hence the PC
+ unsigned branchTarget = (Location - (long)Ref) >> 2;
MI->SetMachineOperandConst(i, MachineOperand::MO_SignExtendedImmed,
- Location);
+ branchTarget);
std::cerr << "Rewrote BB ref: ";
unsigned fixedInstr = SparcV9CodeEmitter::getBinaryCodeForInstr(*MI);
*Ref = fixedInstr;
@@ -135,7 +140,7 @@
void SparcEmitter::startBasicBlock(MachineBasicBlock &BB) {
- BBLocations[BB.getBasicBlock()] = (unsigned)(intptr_t)CurByte;
+ BBLocations[BB.getBasicBlock()] = (long)(intptr_t)CurByte;
}
More information about the llvm-commits
mailing list