binutils-gdb/include
Andrew Burgess 76a4c1e063 libopcodes/aarch64: add support for disassembler styling
This commit enables disassembler styling for AArch64.  After this
commit it is possible to have objdump style AArch64 disassembler
output (using --disassembler-color option).  Once the required GDB
patches are merged, GDB will also style the disassembler output.

The changes to support styling are mostly split between two files
opcodes/aarch64-dis.c and opcodes/aarch64-opc.c.

The entry point for the AArch64 disassembler can be found in
aarch64-dis.c, this file handles printing the instruction mnemonics,
and assembler directives (e.g. '.byte', '.word', etc).  Some operands,
mostly relating to assembler directives are also printed from this
file.  This commit changes all of this to pass through suitable
styling information.

However, for most "normal" instructions, the instruction operands are
printed using a two step process.  From aarch64-dis.c, in the
print_operands function, the function aarch64_print_operand is called,
this function is in aarch64-opc.c, and converts an instruction operand
into a string.  Then, back in print_operands (aarch64-dis.c), the
operand string is printed.

Unfortunately, the string returned by aarch64_print_operand can be
quite complex, it will include syntax elements, like '[' and ']', in
addition to register names and immediate values.  In some cases, a
single operand will expand into what will appear (to the user) as
multiple operands separated with a ','.

This makes the task of styling more complex, all these different
components need to by styled differently, so we need to get the
styling information out of aarch64_print_operand in some way.

The solution that I propose here is similar to the solution that I
used for the i386 disassembler.

Currently, aarch64_print_operand uses snprintf to write the operand
text into a buffer provided by the caller.

What I propose is that we pass an extra argument to the
aarch64_print_operand function, this argument will be a structure, the
structure contains a callback function and some state.

When aarch64_print_operand needs to format part of its output this can
be done by using the callback function within the new structure, this
callback returns a string with special embedded markers that indicate
which mode should be used for each piece of text.  Back in
aarch64-dis.c we can spot these special style markers and use this to
split the disassembler output up and apply the correct style to each
piece.

To make aarch64-opc.c clearer a series of new static functions have
been added, e.g. 'style_reg', 'style_imm', etc.  Each of these
functions formats a piece of text in a different style, 'register' and
'immediate' in this case.

Here's an example taken from aarch64-opc.c of the new functions in
use:

    snprintf (buf, size, "[%s, %s]!",
              style_reg (styler, base),
              style_imm (styler, "#%d", opnd->addr.offset.imm));

The aarch64_print_operand function is also called from the assembler
to aid in printing diagnostic messages.  Right now I have no plans to
add styling to the assembler output, and so, the callback function
used in the assembler ignores the styling information and just returns
an plain string.

I've used the source files in gas/testsuite/gas/aarch64/ for testing,
and have manually gone through and checked that the styling looks
reasonable, however, I'm not an AArch64 expert, so it is possible that
the odd piece is styled incorrectly.  Please point out any mistakes
I've made.

With objdump disassembler color turned off, there should be no change
in the output after this commit.
2022-07-29 13:58:32 +01:00
..
aout
cgen
coff Replace bfd_hostptr_t with uintptr_t 2022-05-27 22:08:59 +09:30
elf bfd: Delete R_LARCH_NONE from dyn info of LoongArch. 2022-07-25 09:59:08 +08:00
gdb
mach-o
opcode libopcodes/aarch64: add support for disassembler styling 2022-07-29 13:58:32 +01:00
sim
som
vms
alloca-conf.h
ansidecl.h Import libiberty from gcc 2022-05-31 21:14:00 +09:30
bfdlink.h Tidy warn-execstack handling 2022-05-20 16:11:25 +09:30
binary-io.h
bout.h
ChangeLog Add markers for 2.39 branch 2022-07-08 10:41:07 +01:00
ChangeLog-0415
ChangeLog-2016
ChangeLog-2017
ChangeLog-2018
ChangeLog-2019
ChangeLog-2020
ChangeLog-9103
collectorAPI.h gprofng: a new GNU profiler 2022-03-11 08:58:31 +00:00
COPYING
COPYING3
ctf-api.h libctf: add a comment explaining how to use ctf_*open 2022-04-28 11:47:11 +01:00
ctf.h include, libctf, ld: extend variable section to contain functions too 2022-03-23 13:48:32 +00:00
demangle.h Import libiberty from gcc 2022-05-31 21:14:00 +09:30
diagnostics.h [gdb/build] Fix build for gcc < 11 2022-06-15 09:03:03 +02:00
dis-asm.h opcodes: add new sub-mnemonic disassembler style 2022-07-25 14:02:30 +01:00
dwarf2.def gdb/fortran: support ptype and print commands for namelist variables 2022-02-11 15:26:25 +00:00
dwarf2.h
dyn-string.h
environ.h
fibheap.h
filenames.h
floatformat.h Import libiberty from gcc 2022-05-13 16:43:15 +09:30
fnmatch.h
fopen-bin.h
fopen-same.h
fopen-vms.h
gcc-c-fe.def
gcc-c-interface.h
gcc-cp-fe.def
gcc-cp-interface.h
gcc-interface.h
getopt.h
hashtab.h include: remove use of PTR 2022-05-10 11:21:37 +09:30
hp-symtab.h
leb128.h
libcollector.h gprofng: a new GNU profiler 2022-03-11 08:58:31 +00:00
libfcollector.h gprofng: a new GNU profiler 2022-03-11 08:58:31 +00:00
libiberty.h
longlong.h
lto-symtab.h
MAINTAINERS
md5.h Import libiberty from gcc 2022-05-13 16:43:15 +09:30
oasys.h
objalloc.h
obstack.h
os9k.h
partition.h
plugin-api.h LTO plugin: sync header file with GCC 2022-07-12 15:35:00 +02:00
progress.h
safe-ctype.h
sha1.h
simple-object.h
sort.h
splay-tree.h
symcat.h
timeval-utils.h
vtv-change-permission.h
xregex2.h
xregex.h
xtensa-config.h
xtensa-isa-internal.h
xtensa-isa.h