From ad1b9a503cea6f8ab850a4b9caedbfeb6fce0bb7 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Tue, 30 Jan 2007 08:22:33 +0000 Subject: [PATCH] Copy and paste bug. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33658 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/ARMInstrInfo.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/Target/ARM/ARMInstrInfo.cpp b/lib/Target/ARM/ARMInstrInfo.cpp index 86b55a6c546..6adf645e493 100644 --- a/lib/Target/ARM/ARMInstrInfo.cpp +++ b/lib/Target/ARM/ARMInstrInfo.cpp @@ -444,6 +444,8 @@ unsigned ARM::GetInstSize(MachineInstr *MI) { // If this machine instr is an inline asm, measure it. if (MI->getOpcode() == ARM::INLINEASM) return TAI->getInlineAsmLength(MI->getOperand(0).getSymbolName()); + if (MI->getOpcode() == ARM::LABEL) + return 0; assert(0 && "Unknown or unset size field for instr!"); break; case ARMII::Size8Bytes: return 8; // Arm instruction x 2. @@ -457,13 +459,21 @@ unsigned ARM::GetInstSize(MachineInstr *MI) { return MI->getOperand(2).getImm(); case ARM::BR_JTr: case ARM::BR_JTm: - case ARM::BR_JTadd: { + case ARM::BR_JTadd: + case ARM::tBR_JTr: { // These are jumptable branches, i.e. a branch followed by an inlined // jumptable. The size is 4 + 4 * number of entries. unsigned JTI = MI->getOperand(MI->getNumOperands()-2).getJumpTableIndex(); MachineJumpTableInfo *MJTI = MF->getJumpTableInfo(); const std::vector &JT = MJTI->getJumpTables(); assert(JTI < JT.size()); + // Thumb instructions are 2 byte aligned, but JT entries are 4 byte + // 4 aligned. The assembler / linker may add 2 byte padding just before + // the JT entries. Use + 4 even for tBR_JTr to purposely over-estimate + // the size the jumptable. + // FIXME: If we know the size of the function is less than (1 << 16) *2 + // bytes, we can use 16-bit entries instead. Then there won't be an + // alignment issue. return getNumJTEntries(JT, JTI) * 4 + 4; } default: