llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
28.42k stars 11.74k forks source link

llvm-objdump fails on powerpc64le binaries #24496

Closed echristo closed 9 years ago

echristo commented 9 years ago
Bugzilla Link 24122
Resolution FIXED
Resolved on Jul 15, 2015 08:03
Version trunk
OS All
CC @d0k

Extended Description

Lots of:

llvm-objdump: warning: invalid instruction encoding

dzur:~/tmp> cat baz.c int baz(); int attribute((always_inline)) foo() { return baz(); } int bar() { if (foo()) return baz(); return foo()+baz(); } dzur:~/tmp> ~/builds/build-llvm/Debug+Asserts/bin/clang -c -target powerpc64le-linux-gnu baz.c -o baz-ppc.o dzur:~/tmp> ~/builds/build-llvm/Debug+Asserts/bin/llvm-objdump -disassemble baz-ppc.o

baz-ppc.o: file format ELF64-ppc64

Disassembly of section .text: foo: /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding 8: a6 02 08 7c lhzu 16, 2172(2) /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding 14: 91 ff 21 f8 stw 15, 8696(31) /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding 28: b4 07 83 7c sthu 0, -31876(7) 2c: 70 00 21 38 andi. 0, 0, 8504 30: 10 00 01 e8 vmsumshm 0, 0, 0, 7 /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding 38: a6 03 08 7c lhzu 16, 2172(3) 3c: 20 00 80 4e subfic 0, 0, -32690 /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding

bar: /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding 58: a6 02 08 7c lhzu 16, 2172(2) /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding 64: 91 ff 21 f8 stw 15, 8696(31) /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding 8c: 64 00 9f 90 oris 0, 0, 40848 90: 2c 00 00 48 cmpwi 0, 72 /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding a0: 60 00 9f 90 ori 0, 0, 40848 /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding b0: 60 00 bf 80 ori 0, 0, 49024 /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding b8: 64 00 9f 90 oris 0, 0, 40848 bc: 66 00 7f e8 oris 0, 16, 32744 c0: 70 00 21 38 andi. 0, 0, 8504 c4: 10 00 01 e8 vmsumshm 0, 0, 0, 7 /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding cc: a6 03 08 7c lhzu 16, 2172(3) d0: 20 00 80 4e subfic 0, 0, -32690 /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding /usr/local/google/home/echristo/builds/build-llvm/Debug+Asserts/bin/llvm-objdump: warning: invalid instruction encoding

might just be endianness issues or it could be something else.

d0k commented 9 years ago

With r242288:

$ llvm-objdump -disassemble baz-ppc.o

baz-ppc.o: file format ELF64-ppc64

Disassembly of section .text: foo: 0: 00 00 4c 3c addis 2, 12, 0 4: 00 00 42 38 addi 2, 2, 0 8: a6 02 08 7c mflr 0 c: f8 ff e1 fb std 31, -8(1) 10: 10 00 01 f8 std 0, 16(1) 14: 91 ff 21 f8 stdu 1, -112(1) 18: 78 0b 3f 7c mr 31, 1 1c: 01 00 00 48 bl .+0 20: 00 00 00 60 nop 24: 78 1b 64 7c mr 4, 3 28: b4 07 83 7c extsw 3, 4 2c: 70 00 21 38 addi 1, 1, 112 30: 10 00 01 e8 ld 0, 16(1) 34: f8 ff e1 eb ld 31, -8(1) 38: a6 03 08 7c mtlr 0 3c: 20 00 80 4e blr llvm-objdump: warning: invalid instruction encoding llvm-objdump: warning: invalid instruction encoding llvm-objdump: warning: invalid instruction encoding 4c: 00 00 00 60 nop

bar: 50: 00 00 4c 3c addis 2, 12, 0 54: 00 00 42 38 addi 2, 2, 0 58: a6 02 08 7c mflr 0 5c: f8 ff e1 fb std 31, -8(1) 60: 10 00 01 f8 std 0, 16(1) 64: 91 ff 21 f8 stdu 1, -112(1) 68: 78 0b 3f 7c mr 31, 1 6c: 01 00 00 48 bl .+0 70: 00 00 00 60 nop 74: 78 1b 64 7c mr 4, 3 78: 00 00 04 2c cmpwi 4, 0 7c: 18 00 82 41 bt 2, .+24 80: 01 00 00 48 bl .+0 84: 00 00 00 60 nop 88: 78 1b 64 7c mr 4, 3 8c: 64 00 9f 90 stw 4, 100(31) 90: 2c 00 00 48 b .+44 94: 01 00 00 48 bl .+0 98: 00 00 00 60 nop 9c: 78 1b 64 7c mr 4, 3 a0: 60 00 9f 90 stw 4, 96(31) a4: 01 00 00 48 bl .+0 a8: 00 00 00 60 nop ac: 78 1b 64 7c mr 4, 3 b0: 60 00 bf 80 lwz 5, 96(31) b4: 14 22 85 7c add 4, 5, 4 b8: 64 00 9f 90 stw 4, 100(31) bc: 66 00 7f e8 lwa 3, 100(31) c0: 70 00 21 38 addi 1, 1, 112 c4: 10 00 01 e8 ld 0, 16(1) c8: f8 ff e1 eb ld 31, -8(1) cc: a6 03 08 7c mtlr 0 d0: 20 00 80 4e blr llvm-objdump: warning: invalid instruction encoding llvm-objdump: warning: invalid instruction encoding llvm-objdump: warning: invalid instruction encoding

llvmbot commented 9 years ago

Definitely an endianness problem. For example:

  3c:   20 00 80 4e     subfic 0, 0, -32690

is interpreting the bytes of the opcode as big endian, even though they are displayed as little endian. The opcode 0x4e800020 is a bclr instruction (conditional return), which is a much more sensible sort of instruction to use. Probably an easy fix.