[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