[llvm-commits] [llvm] r101053 - in /llvm/trunk: lib/Target/ARM/ARMAddressingModes.h lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp test/MC/Disassembler/arm-tests.txt

Johnny Chen johnny.chen at apple.com
Mon Apr 12 17:26:36 PDT 2010


Thanks, Bob!
You know the codegen path better.... :-)

On Apr 12, 2010, at 5:25 PM, Bob Wilson wrote:

> 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