Merge tag 'for-5.13/dm-changes' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / arch / x86 / tools / objdump_reformat.awk
1 #!/bin/awk -f
2 # SPDX-License-Identifier: GPL-2.0
3 # Usage: objdump -d a.out | awk -f objdump_reformat.awk | ./insn_decoder_test
4 # Reformats the disassembly as follows:
5 # - Removes all lines except the disassembled instructions.
6 # - For instructions that exceed 1 line (7 bytes), crams all the hex bytes
7 # into a single line.
8 # - Remove bad(or prefix only) instructions
9
10 BEGIN {
11         prev_addr = ""
12         prev_hex = ""
13         prev_mnemonic = ""
14         bad_expr = "(\\(bad\\)|^rex|^.byte|^rep(z|nz)$|^lock$|^es$|^cs$|^ss$|^ds$|^fs$|^gs$|^data(16|32)$|^addr(16|32|64))"
15         fwait_expr = "^9b "
16         fwait_str="9b\tfwait"
17 }
18
19 /^ *[0-9a-f]+ <[^>]*>:/ {
20         # Symbol entry
21         printf("%s%s\n", $2, $1)
22 }
23
24 /^ *[0-9a-f]+:/ {
25         if (split($0, field, "\t") < 3) {
26                 # This is a continuation of the same insn.
27                 prev_hex = prev_hex field[2]
28         } else {
29                 # Skip bad instructions
30                 if (match(prev_mnemonic, bad_expr))
31                         prev_addr = ""
32                 # Split fwait from other f* instructions
33                 if (match(prev_hex, fwait_expr) && prev_mnemonic != "fwait") {
34                         printf "%s\t%s\n", prev_addr, fwait_str
35                         sub(fwait_expr, "", prev_hex)
36                 }
37                 if (prev_addr != "")
38                         printf "%s\t%s\t%s\n", prev_addr, prev_hex, prev_mnemonic
39                 prev_addr = field[1]
40                 prev_hex = field[2]
41                 prev_mnemonic = field[3]
42         }
43 }
44
45 END {
46         if (prev_addr != "")
47                 printf "%s\t%s\t%s\n", prev_addr, prev_hex, prev_mnemonic
48 }