diff options
author | Evan Cheng <evan.cheng@apple.com> | 2009-07-24 18:54:23 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2009-07-24 18:54:23 +0000 |
commit | 370b544e924604d0e85f3620ae9917d45bceb1e1 (patch) | |
tree | 4e14d7da10b0d6ad125e6ebab2f7bd6a3e1720f4 | |
parent | bb0c9bfa4f1c440e7b32cb8d38ef918deb14389e (diff) | |
download | external_llvm-370b544e924604d0e85f3620ae9917d45bceb1e1.zip external_llvm-370b544e924604d0e85f3620ae9917d45bceb1e1.tar.gz external_llvm-370b544e924604d0e85f3620ae9917d45bceb1e1.tar.bz2 |
Add a workaround for Darwin assembler bug where it's not setting the thumb bit in Thumb2 jumptable entries. We now pass Olden.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76991 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp index 43f3360..4d21d5c 100644 --- a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp @@ -922,11 +922,23 @@ void ARMAsmPrinter::printJTBlockOperand(const MachineInstr *MI, int OpNum) { const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables(); const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs; bool UseSet= TAI->getSetDirective() && TM.getRelocationModel() == Reloc::PIC_; + bool NeedBit0 = Subtarget->isTargetDarwin() && Subtarget->isThumb2(); SmallPtrSet<MachineBasicBlock*, 8> JTSets; for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) { MachineBasicBlock *MBB = JTBBs[i]; - if (UseSet && JTSets.insert(MBB)) - printPICJumpTableSetLabel(JTI, MO2.getImm(), MBB); + if (UseSet && JTSets.insert(MBB)) { + // FIXME: Temporary workaround for an assembler bug. The assembler isn't + // setting the bit zero to 1 even though it is a thumb address. + if (NeedBit0) { + O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix() + << getFunctionNumber() << '_' << JTI << '_' << MO2.getImm() + << "_set_" << MBB->getNumber() << ",("; + printBasicBlockLabel(MBB, false, false, false); + O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() + << '_' << JTI << '_' << MO2.getImm() << "+1)\n"; + } else + printPICJumpTableSetLabel(JTI, MO2.getImm(), MBB); + } O << JTEntryDirective << ' '; if (UseSet) @@ -940,7 +952,13 @@ void ARMAsmPrinter::printJTBlockOperand(const MachineInstr *MI, int OpNum) { O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() << '_' << JTI << '_' << MO2.getImm(); } else { + // FIXME: Temporary workaround for an assembler bug. The assembler isn't + // setting the bit zero to 1 even though it is a thumb address. + if (NeedBit0) + O << '('; printBasicBlockLabel(MBB, false, false, false); + if (NeedBit0) + O << "+1)"; } if (i != e-1) O << '\n'; |