diff options
author | Misha Brukman <brukman+llvm@gmail.com> | 2004-10-23 23:47:34 +0000 |
---|---|---|
committer | Misha Brukman <brukman+llvm@gmail.com> | 2004-10-23 23:47:34 +0000 |
commit | d4b4a99587a0856473b9334455f6cebcb4fe2583 (patch) | |
tree | 6bdffee0be79ade74e7f31d71f8576597273ecfd /lib/Target/PowerPC/PPCCodeEmitter.cpp | |
parent | 40a55e1e291f1e28eadae19e5ce6f9087d99e085 (diff) | |
download | external_llvm-d4b4a99587a0856473b9334455f6cebcb4fe2583.zip external_llvm-d4b4a99587a0856473b9334455f6cebcb4fe2583.tar.gz external_llvm-d4b4a99587a0856473b9334455f6cebcb4fe2583.tar.bz2 |
* Correctly handle the MovePCtoLR pseudo-instr with a bl to next instr
* Stop the confusion of using rv and Addr for global addresses: just use rv
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17195 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/PowerPC/PPCCodeEmitter.cpp')
-rw-r--r-- | lib/Target/PowerPC/PPCCodeEmitter.cpp | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/lib/Target/PowerPC/PPCCodeEmitter.cpp b/lib/Target/PowerPC/PPCCodeEmitter.cpp index 51ed6d4..cdcb5ef 100644 --- a/lib/Target/PowerPC/PPCCodeEmitter.cpp +++ b/lib/Target/PowerPC/PPCCodeEmitter.cpp @@ -18,6 +18,7 @@ #include "llvm/Module.h" #include "llvm/CodeGen/MachineCodeEmitter.h" #include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/Passes.h" #include "llvm/Support/Debug.h" @@ -204,9 +205,15 @@ void PPC32CodeEmitter::emitBasicBlock(MachineBasicBlock &MBB) { for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ++I){ MachineInstr &MI = *I; unsigned Opcode = MI.getOpcode(); - if (Opcode == PPC::IMPLICIT_DEF) continue; - - emitWord(getBinaryCodeForInstr(*I)); + if (Opcode == PPC::IMPLICIT_DEF) + continue; // pseudo opcode, no side effects + else if (Opcode == PPC::MovePCtoLR) { + // This can be simplified: the resulting 32-bit code is 0x48000005 + MachineInstr *MI = BuildMI(PPC::BL, 1).addImm(1); + emitWord(getBinaryCodeForInstr(*MI)); + delete MI; + } else + emitWord(getBinaryCodeForInstr(*I)); } } @@ -269,16 +276,15 @@ int64_t PPC32CodeEmitter::getMachineOpValue(MachineInstr &MI, rv = MO.getImmedValue(); } else if (MO.isGlobalAddress()) { GlobalValue *GV = MO.getGlobal(); - intptr_t Addr = (intptr_t)MCE.getGlobalValueAddress(GV); - if (Addr == 0) { + rv = MCE.getGlobalValueAddress(GV); + if (rv == 0) { if (Function *F = dyn_cast<Function>(GV)) { if (F->isExternal()) rv = getAddressOfExternalFunction(F); else { - // Function has not yet been code generated! + // Function has not yet been code generated! Use lazy resolution. getResolver(MCE).addFunctionReference(MCE.getCurrentPCValue(), F); - // Delayed resolution... - return (intptr_t)getResolver(MCE).getLazyResolver(F); + rv = getResolver(MCE).getLazyResolver(F); } } else if (GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV)) { if (GVar->isExternal()) { @@ -295,7 +301,7 @@ int64_t PPC32CodeEmitter::getMachineOpValue(MachineInstr &MI, } } if (MO.isPCRelative()) { // Global variable reference - rv = (Addr - MCE.getCurrentPCValue()) >> 2; + rv = (rv - MCE.getCurrentPCValue()) >> 2; } } else if (MO.isMachineBasicBlock()) { const BasicBlock *BB = MO.getMachineBasicBlock()->getBasicBlock(); |