Skip to content

Commit 884b49e

Browse files
committed
opcodes/riscv: Hide '.L0 ' fake symbols
The RISC-V assembler generates fake labels with the name '.L0 ' as part of the debug information (see gas/config/tc-riscv.h:FAKE_LABEL_NAME). The problem is that currently, when disassembling an object file, the output looks like this (this is an example from the GDB testsuite, but is pretty representative of anything with debug information): 000000000000001e <main>: 1e: 7179 addi sp,sp,-48 20: f406 sd ra,40(sp) 22: f022 sd s0,32(sp) 24: 1800 addi s0,sp,48 0000000000000026 <.L0 >: 26: 87aa mv a5,a0 28: feb43023 sd a1,-32(s0) 2c: fcc43c23 sd a2,-40(s0) 30: fef42623 sw a5,-20(s0) 0000000000000034 <.L0 >: 34: fec42783 lw a5,-20(s0) 38: 0007871b sext.w a4,a5 3c: 678d lui a5,0x3 3e: 03978793 addi a5,a5,57 # 3039 <.LASF30+0x2a9d> 42: 02f71463 bne a4,a5,6a <.L0 > 0000000000000046 <.L0 >: 46: 000007b7 lui a5,0x0 4a: 0007b783 ld a5,0(a5) # 0 <need_malloc> 4e: 6f9c ld a5,24(a5) 0000000000000050 <.L0 >: 50: 86be mv a3,a5 52: 466d li a2,27 54: 4585 li a1,1 56: 000007b7 lui a5,0x0 5a: 00078513 mv a0,a5 5e: 00000097 auipc ra,0x0 62: 000080e7 jalr ra # 5e <.L0 +0xe> 0000000000000066 <.L0 >: 66: 4785 li a5,1 68: a869 j 102 <.L0 > 000000000000006a <.L0 >: 6a: 000007b7 lui a5,0x0 6e: 00078513 mv a0,a5 72: 00000097 auipc ra,0x0 76: 000080e7 jalr ra # 72 <.L0 +0x8> The frequent repeated '.L0 ' labels are pointless, as they are non-unique there's no way to match a use of '.L0 ' to its appearence in the output, so we'd be better off just not printing it at all. That's what this patch does by defining a 'symbol_is_valid' method for RISC-V. With this commit, the same disassembly now looks like this: 000000000000001e <main>: 1e: 7179 addi sp,sp,-48 20: f406 sd ra,40(sp) 22: f022 sd s0,32(sp) 24: 1800 addi s0,sp,48 26: 87aa mv a5,a0 28: feb43023 sd a1,-32(s0) 2c: fcc43c23 sd a2,-40(s0) 30: fef42623 sw a5,-20(s0) 34: fec42783 lw a5,-20(s0) 38: 0007871b sext.w a4,a5 3c: 678d lui a5,0x3 3e: 03978793 addi a5,a5,57 # 3039 <.LASF30+0x2a9d> 42: 02f71463 bne a4,a5,6a <.L4> 46: 000007b7 lui a5,0x0 4a: 0007b783 ld a5,0(a5) # 0 <need_malloc> 4e: 6f9c ld a5,24(a5) 50: 86be mv a3,a5 52: 466d li a2,27 54: 4585 li a1,1 56: 000007b7 lui a5,0x0 5a: 00078513 mv a0,a5 5e: 00000097 auipc ra,0x0 62: 000080e7 jalr ra # 5e <main+0x40> 66: 4785 li a5,1 68: a869 j 102 <.L5> 000000000000006a <.L4>: 6a: 000007b7 lui a5,0x0 6e: 00078513 mv a0,a5 72: 00000097 auipc ra,0x0 76: 000080e7 jalr ra # 72 <.L4+0x8> In order to share the fake label between the assembler and the libopcodes library, I've added some new defines RISCV_FAKE_LABEL_NAME and RISCV_FAKE_LABEL_CHAR in include/opcode/riscv.h. I could have just moved FAKE_LABEL_NAME to the include file, however, I thnk this would be confusing, someone working on the assembler would likely not expect to find FAKE_LABEL_NAME defined outside of the assembler source tree. By introducing the RISCV_FAKE_LABEL_* defines I can leave the assembler standard FAKE_LABEL_ defines in the assembler source, but still share the RISCV_FAKE_LABEL_* with libopcodes. gas/ChangeLog: * config/tc-riscv.h (FAKE_LABEL_NAME): Define as RISCV_FAKE_LABEL_NAME. (FAKE_LABEL_CHAR): Define as RISCV_FAKE_LABEL_CHAR. include/ChangeLog: * dis-asm.h (riscv_symbol_is_valid): Declare. * opcode/riscv.h (RISCV_FAKE_LABEL_NAME): Define. (RISCV_FAKE_LABEL_CHAR): Define. opcodes/ChangeLog: * disassembler.c (disassemble_init_for_target): Add RISC-V initialisation. * riscv-dis.c (riscv_symbol_is_valid): New function.
1 parent eb7be1a commit 884b49e

File tree

8 files changed

+49
-2
lines changed

8 files changed

+49
-2
lines changed

gas/ChangeLog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
2018-12-06 Andrew Burgess <[email protected]>
2+
3+
* config/tc-riscv.h (FAKE_LABEL_NAME): Define as
4+
RISCV_FAKE_LABEL_NAME.
5+
(FAKE_LABEL_CHAR): Define as RISCV_FAKE_LABEL_CHAR.
6+
17
2018-12-05 Sam Tebbs <[email protected]>
28

39
* dw2gencfi.c (struct cie_entry): Add tc_cie_entry_extras invocation.

gas/config/tc-riscv.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ struct expressionS;
3838
/* Symbols named FAKE_LABEL_NAME are emitted when generating DWARF, so make
3939
sure FAKE_LABEL_NAME is printable. It still must be distinct from any
4040
real label name. So, append a space, which other labels can't contain. */
41-
#define FAKE_LABEL_NAME ".L0 "
41+
#define FAKE_LABEL_NAME RISCV_FAKE_LABEL_NAME
4242
/* Changing the special character in FAKE_LABEL_NAME requires changing
4343
FAKE_LABEL_CHAR too. */
44-
#define FAKE_LABEL_CHAR ' '
44+
#define FAKE_LABEL_CHAR RISCV_FAKE_LABEL_CHAR
4545

4646
#define md_relax_frag(segment, fragp, stretch) \
4747
riscv_relax_frag (segment, fragp, stretch)

include/ChangeLog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
2018-12-06 Andrew Burgess <[email protected]>
2+
3+
* dis-asm.h (riscv_symbol_is_valid): Declare.
4+
* opcode/riscv.h (RISCV_FAKE_LABEL_NAME): Define.
5+
(RISCV_FAKE_LABEL_CHAR): Define.
6+
17
2018-12-03 Kito Cheng <[email protected]>
28

39
* opcode/riscv.h (riscv_opcode): Change type of xlen_requirement to

include/dis-asm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ extern void print_wasm32_disassembler_options (FILE *);
302302
extern bfd_boolean aarch64_symbol_is_valid (asymbol *, struct disassemble_info *);
303303
extern bfd_boolean arm_symbol_is_valid (asymbol *, struct disassemble_info *);
304304
extern bfd_boolean csky_symbol_is_valid (asymbol *, struct disassemble_info *);
305+
extern bfd_boolean riscv_symbol_is_valid (asymbol *, struct disassemble_info *);
305306
extern void disassemble_init_powerpc (struct disassemble_info *);
306307
extern void disassemble_init_s390 (struct disassemble_info *);
307308
extern void disassemble_init_wasm32 (struct disassemble_info *);

include/opcode/riscv.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,12 @@ static const char * const riscv_pred_succ[16] =
270270
#define NGPR 32
271271
#define NFPR 32
272272

273+
/* These fake label defines are use by both the assembler, and
274+
libopcodes. The assembler uses this when it needs to generate a fake
275+
label, and libopcodes uses it to hide the fake labels in its output. */
276+
#define RISCV_FAKE_LABEL_NAME ".L0 "
277+
#define RISCV_FAKE_LABEL_CHAR ' '
278+
273279
/* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
274280
VALUE << SHIFT. VALUE is evaluated exactly once. */
275281
#define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \

opcodes/ChangeLog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
2018-12-06 Andrew Burgess <[email protected]>
2+
3+
* disassembler.c (disassemble_init_for_target): Add RISC-V
4+
initialisation.
5+
* riscv-dis.c (riscv_symbol_is_valid): New function.
6+
17
2018-12-03 Kito Cheng <[email protected]>
28

39
* riscv-opc.c: Change the type of xlen, because type of

opcodes/disassemble.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,11 @@ disassemble_init_for_target (struct disassemble_info * info)
656656
disassemble_init_powerpc (info);
657657
break;
658658
#endif
659+
#ifdef ARCH_riscv
660+
case bfd_arch_riscv:
661+
info->symbol_is_valid = riscv_symbol_is_valid;
662+
break;
663+
#endif
659664
#ifdef ARCH_wasm32
660665
case bfd_arch_wasm32:
661666
disassemble_init_wasm32 (info);

opcodes/riscv-dis.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,23 @@ print_insn_riscv (bfd_vma memaddr, struct disassemble_info *info)
518518
return riscv_disassemble_insn (memaddr, insn, info);
519519
}
520520

521+
/* Prevent use of the fake labels that are generated as part of the DWARF
522+
and for relaxable relocations in the assembler. */
523+
524+
bfd_boolean
525+
riscv_symbol_is_valid (asymbol * sym,
526+
struct disassemble_info * info ATTRIBUTE_UNUSED)
527+
{
528+
const char * name;
529+
530+
if (sym == NULL)
531+
return FALSE;
532+
533+
name = bfd_asymbol_name (sym);
534+
535+
return (strcmp (name, RISCV_FAKE_LABEL_NAME) != 0);
536+
}
537+
521538
void
522539
print_riscv_disassembler_options (FILE *stream)
523540
{

0 commit comments

Comments
 (0)