[llvm-commits] [llvm] r101053 - in /llvm/trunk: lib/Target/ARM/ARMAddressingModes.h lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp test/MC/Disassembler/arm-tests.txt
Bob Wilson
bob.wilson at apple.com
Mon Apr 12 17:25:41 PDT 2010
This is working around a problem in getSOImmValRotate(). I'm going to try to fix that problem and then this change won't be needed.
On Apr 12, 2010, at 11:46 AM, Johnny Chen wrote:
> Author: johnny
> Date: Mon Apr 12 13:46:53 2010
> New Revision: 101053
>
> URL: http://llvm.org/viewvc/llvm-project?rev=101053&view=rev
> Log:
> Fixed a crasher in arm disassembler within ARMInstPrinter.cpp after calling
> ARM_AM::getSoImmVal(V) with a legitimate so_imm value: #245 rotate right by 2.
> Introduce ARM_AM::getSOImmValOneOrNoRotate(unsigned Arg) which is called from
> ARMInstPrinter.cpp's printSOImm() function, replacing ARM_AM::getSOImmVal(V).
>
> [12:44:43] johnny:/Volumes/data/llvm/git/trunk (local-trunk) $ gdb Debug/bin/llvm-mc
> GNU gdb 6.3.50-20050815 (Apple version gdb-1346) (Fri Sep 18 20:40:51 UTC 2009)
> Copyright 2004 Free Software Foundation, Inc.
> GDB is free software, covered by the GNU General Public License, and you are
> welcome to change it and/or distribute copies of it under certain conditions.
> Type "show copying" to see the conditions.
> There is absolutely no warranty for GDB. Type "show warranty" for details.
> This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries ... done
>
> (gdb) set args -triple=arm-apple-darwin9 -debug-only=arm-disassembler --disassemble
> (gdb) r
> Starting program: /Volumes/data/llvm/git/trunk/Debug/bin/llvm-mc -triple=arm-apple-darwin9 -debug-only=arm-disassembler --disassemble
> Reading symbols for shared libraries ++. done
> 0xf5 0x71 0xf0 0x53
> Opcode=201 Name=MVNi Format=ARM_FORMAT_DPFRM(4)
> 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
> -------------------------------------------------------------------------------------------------
> | 0: 1: 0: 1| 0: 0: 1: 1| 1: 1: 1: 1| 0: 0: 0: 0| 0: 1: 1: 1| 0: 0: 0: 1| 1: 1: 1: 1| 0: 1: 0: 1|
> -------------------------------------------------------------------------------------------------
>
> mvnpls r7, Assertion failed: (V != -1 && "Not a valid so_imm value!"), function printSOImm, file ARMInstPrinter.cpp, line 229.
>
> Program received signal SIGABRT, Aborted.
> 0x00007fff88c65886 in __kill ()
> (gdb) bt
> #0 0x00007fff88c65886 in __kill ()
> #1 0x00007fff88d05eae in abort ()
> #2 0x00007fff88cf2ef0 in __assert_rtn ()
> #3 0x000000010020e422 in printSOImm (O=@0x1010bdf80, V=-1, VerboseAsm=false, MAI=0x1020106d0) at ARMInstPrinter.cpp:229
> #4 0x000000010020e5fe in llvm::ARMInstPrinter::printSOImmOperand (this=0x1020107e0, MI=0x7fff5fbfee70, OpNum=1, O=@0x1010bdf80) at ARMInstPrinter.cpp:254
> #5 0x00000001001ffbc0 in llvm::ARMInstPrinter::printInstruction (this=0x1020107e0, MI=0x7fff5fbfee70, O=@0x1010bdf80) at ARMGenAsmWriter.inc:3236
> #6 0x000000010020c27c in llvm::ARMInstPrinter::printInst (this=0x1020107e0, MI=0x7fff5fbfee70, O=@0x1010bdf80) at ARMInstPrinter.cpp:182
> #7 0x000000010003cbff in PrintInsts (DisAsm=@0x10200f4e0, Printer=@0x1020107e0, Bytes=@0x7fff5fbff060, SM=@0x7fff5fbff078) at Disassembler.cpp:65
> #8 0x000000010003c8b4 in llvm::Disassembler::disassemble (T=@0x1010c13c0, Triple=@0x1010b6798, Buffer=@0x102010690) at Disassembler.cpp:153
> #9 0x000000010004095c in DisassembleInput (ProgName=0x7fff5fbff3f0 "/Volumes/data/llvm/git/trunk/Debug/bin/llvm-mc") at llvm-mc.cpp:347
> #10 0x000000010003eefb in main (argc=4, argv=0x7fff5fbff298) at llvm-mc.cpp:374
> (gdb) q
> The program is running. Exit anyway? (y or n) y
> [13:36:26] johnny:/Volumes/data/llvm/git/trunk (local-trunk) $
>
> Modified:
> llvm/trunk/lib/Target/ARM/ARMAddressingModes.h
> llvm/trunk/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp
> llvm/trunk/test/MC/Disassembler/arm-tests.txt
>
> Modified: llvm/trunk/lib/Target/ARM/ARMAddressingModes.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAddressingModes.h?rev=101053&r1=101052&r2=101053&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMAddressingModes.h (original)
> +++ llvm/trunk/lib/Target/ARM/ARMAddressingModes.h Mon Apr 12 13:46:53 2010
> @@ -193,6 +193,43 @@
> return rotl32(Arg, RotAmt) | ((RotAmt>>1) << 8);
> }
>
> + /// getSOImmValOneRotate - Try to handle Imm with an immediate shifter
> + /// operand, computing the rotate amount to use. If this immediate value
> + /// cannot be handled with a single shifter-op, return 0.
> + static unsigned getSOImmValOneRotate(unsigned Imm) {
> + // A5.2.4 Constants with multiple encodings
> + // The lowest unsigned value of rotation wins!
> + for (unsigned R = 1; R <= 15; ++R)
> + if ((Imm & rotr32(~255U, 2*R)) == 0)
> + return 2*R;
> +
> + // Failed to find a suitable rotate amount.
> + return 0;
> + }
> +
> + /// getSOImmValOneOrNoRotate - Given a 32-bit immediate, if it is something
> + /// that can fit into a shifter_operand immediate operand, return the 12-bit
> + /// encoding for it. If not, return -1. This is different from getSOImmVal()
> + /// in that getSOImmVal() is used during codegen, for example,
> + /// rewriteARMFrameIndex() where return value of -1 is not considered fatal.
> + ///
> + /// The current consumer of this API is printSOImm() within ARMInstPrinter.cpp
> + /// where return value of -1 indicates that the Arg is not a valid so_imm val!
> + static inline int getSOImmValOneOrNoRotate(unsigned Arg) {
> + // 8-bit (or less) immediates are trivially shifter_operands with a rotate
> + // of zero.
> + if ((Arg & ~255U) == 0) return Arg;
> +
> + unsigned RotAmt = getSOImmValOneRotate(Arg);
> +
> + // If this cannot be handled with a single shifter_op, bail out.
> + if (rotr32(~255U, RotAmt) & Arg)
> + return -1;
> +
> + // Encode this correctly.
> + return rotl32(Arg, RotAmt) | ((RotAmt>>1) << 8);
> + }
> +
> /// isSOImmTwoPartVal - Return true if the specified value can be obtained by
> /// or'ing together two SOImmVal's.
> static inline bool isSOImmTwoPartVal(unsigned V) {
>
> Modified: llvm/trunk/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp?rev=101053&r1=101052&r2=101053&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp Mon Apr 12 13:46:53 2010
> @@ -225,7 +225,7 @@
> static void printSOImm(raw_ostream &O, int64_t V, bool VerboseAsm,
> const MCAsmInfo *MAI) {
> // Break it up into two parts that make up a shifter immediate.
> - V = ARM_AM::getSOImmVal(V);
> + V = ARM_AM::getSOImmValOneOrNoRotate(V);
> assert(V != -1 && "Not a valid so_imm value!");
>
> unsigned Imm = ARM_AM::getSOImmValImm(V);
>
> Modified: llvm/trunk/test/MC/Disassembler/arm-tests.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Disassembler/arm-tests.txt?rev=101053&r1=101052&r2=101053&view=diff
> ==============================================================================
> --- llvm/trunk/test/MC/Disassembler/arm-tests.txt (original)
> +++ llvm/trunk/test/MC/Disassembler/arm-tests.txt Mon Apr 12 13:46:53 2010
> @@ -27,6 +27,9 @@
> # CHECK: movt r8, #65535
> 0xff 0x8f 0x4f 0xe3
>
> +# CHECK: mvnpls r7, #245, 2
> +0xf5 0x71 0xf0 0x53
> +
> # CHECK: pkhbt r8, r9, r10, lsl #4
> 0x1a 0x82 0x89 0xe6
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list