2016-11-01 17:45:57 +01:00
|
|
|
/* tc-riscv.h -- header file for tc-riscv.c.
|
2019-01-01 11:31:27 +01:00
|
|
|
Copyright (C) 2011-2019 Free Software Foundation, Inc.
|
2016-11-01 17:45:57 +01:00
|
|
|
|
|
|
|
Contributed by Andrew Waterman (andrew@sifive.com).
|
|
|
|
Based on MIPS target.
|
|
|
|
|
|
|
|
This file is part of GAS.
|
|
|
|
|
|
|
|
GAS is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 3, or (at your option)
|
|
|
|
any later version.
|
|
|
|
|
|
|
|
GAS is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; see the file COPYING3. If not,
|
|
|
|
see <http://www.gnu.org/licenses/>. */
|
|
|
|
|
|
|
|
#ifndef TC_RISCV
|
|
|
|
#define TC_RISCV
|
|
|
|
|
|
|
|
#include "opcode/riscv.h"
|
|
|
|
|
|
|
|
struct frag;
|
|
|
|
struct expressionS;
|
|
|
|
|
|
|
|
#define TARGET_BYTES_BIG_ENDIAN 0
|
|
|
|
|
|
|
|
#define TARGET_ARCH bfd_arch_riscv
|
|
|
|
|
|
|
|
#define WORKING_DOT_WORD 1
|
|
|
|
#define LOCAL_LABELS_FB 1
|
|
|
|
|
|
|
|
/* Symbols named FAKE_LABEL_NAME are emitted when generating DWARF, so make
|
|
|
|
sure FAKE_LABEL_NAME is printable. It still must be distinct from any
|
|
|
|
real label name. So, append a space, which other labels can't contain. */
|
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.
2018-12-03 15:46:18 +01:00
|
|
|
#define FAKE_LABEL_NAME RISCV_FAKE_LABEL_NAME
|
2017-11-22 20:20:48 +01:00
|
|
|
/* Changing the special character in FAKE_LABEL_NAME requires changing
|
|
|
|
FAKE_LABEL_CHAR too. */
|
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.
2018-12-03 15:46:18 +01:00
|
|
|
#define FAKE_LABEL_CHAR RISCV_FAKE_LABEL_CHAR
|
2016-11-01 17:45:57 +01:00
|
|
|
|
|
|
|
#define md_relax_frag(segment, fragp, stretch) \
|
|
|
|
riscv_relax_frag (segment, fragp, stretch)
|
|
|
|
extern int riscv_relax_frag (asection *, struct frag *, long);
|
|
|
|
|
|
|
|
#define md_section_align(seg,size) (size)
|
|
|
|
#define md_undefined_symbol(name) (0)
|
|
|
|
#define md_operand(x)
|
|
|
|
|
2016-12-19 07:53:51 +01:00
|
|
|
extern bfd_boolean riscv_frag_align_code (int);
|
|
|
|
#define md_do_align(N, FILL, LEN, MAX, LABEL) \
|
|
|
|
if ((N) != 0 && !(FILL) && !need_pass_2 && subseg_text_p (now_seg)) \
|
|
|
|
{ \
|
|
|
|
if (riscv_frag_align_code (N)) \
|
|
|
|
goto LABEL; \
|
|
|
|
}
|
|
|
|
|
|
|
|
extern void riscv_handle_align (fragS *);
|
|
|
|
#define HANDLE_ALIGN riscv_handle_align
|
|
|
|
|
2018-05-24 19:35:59 +02:00
|
|
|
#define MAX_MEM_FOR_RS_ALIGN_CODE (3 + 4)
|
2016-11-01 17:45:57 +01:00
|
|
|
|
|
|
|
/* The ISA of the target may change based on command-line arguments. */
|
|
|
|
#define TARGET_FORMAT riscv_target_format()
|
|
|
|
extern const char * riscv_target_format (void);
|
|
|
|
|
|
|
|
#define md_after_parse_args() riscv_after_parse_args()
|
|
|
|
extern void riscv_after_parse_args (void);
|
|
|
|
|
|
|
|
#define md_parse_long_option(arg) riscv_parse_long_option (arg)
|
|
|
|
extern int riscv_parse_long_option (const char *);
|
|
|
|
|
2016-12-19 07:53:48 +01:00
|
|
|
#define md_pre_output_hook riscv_pre_output_hook()
|
|
|
|
extern void riscv_pre_output_hook (void);
|
|
|
|
|
2016-11-01 17:45:57 +01:00
|
|
|
/* Let the linker resolve all the relocs due to relaxation. */
|
|
|
|
#define tc_fix_adjustable(fixp) 0
|
|
|
|
#define md_allow_local_subtract(l,r,s) 0
|
|
|
|
|
|
|
|
/* Values passed to md_apply_fix don't include symbol values. */
|
|
|
|
#define MD_APPLY_SYM_VALUE(FIX) 0
|
|
|
|
|
|
|
|
/* Global syms must not be resolved, to support ELF shared libraries. */
|
|
|
|
#define EXTERN_FORCE_RELOC \
|
|
|
|
(OUTPUT_FLAVOR == bfd_target_elf_flavour)
|
|
|
|
|
|
|
|
/* Postpone text-section label subtraction calculation until linking, since
|
|
|
|
linker relaxations might change the deltas. */
|
2017-05-16 01:13:24 +02:00
|
|
|
#define TC_FORCE_RELOCATION_SUB_SAME(FIX, SEG) \
|
|
|
|
(GENERIC_FORCE_RELOCATION_SUB_SAME (FIX, SEG) \
|
|
|
|
|| ((SEG)->flags & SEC_CODE) != 0)
|
2016-11-01 17:45:57 +01:00
|
|
|
#define TC_FORCE_RELOCATION_SUB_LOCAL(FIX, SEG) 1
|
|
|
|
#define TC_VALIDATE_FIX_SUB(FIX, SEG) 1
|
|
|
|
#define TC_FORCE_RELOCATION_LOCAL(FIX) 1
|
|
|
|
#define DIFF_EXPR_OK 1
|
|
|
|
|
|
|
|
extern void riscv_pop_insert (void);
|
|
|
|
#define md_pop_insert() riscv_pop_insert ()
|
|
|
|
|
|
|
|
#define TARGET_USE_CFIPOP 1
|
|
|
|
|
|
|
|
#define tc_cfi_frame_initial_instructions riscv_cfi_frame_initial_instructions
|
|
|
|
extern void riscv_cfi_frame_initial_instructions (void);
|
|
|
|
|
|
|
|
#define tc_regname_to_dw2regnum tc_riscv_regname_to_dw2regnum
|
|
|
|
extern int tc_riscv_regname_to_dw2regnum (char *);
|
|
|
|
|
|
|
|
#define DWARF2_DEFAULT_RETURN_COLUMN X_RA
|
2016-12-19 07:53:48 +01:00
|
|
|
|
|
|
|
/* Even on RV64, use 4-byte alignment, as F registers may be only 32 bits. */
|
|
|
|
#define DWARF2_CIE_DATA_ALIGNMENT -4
|
2016-11-01 17:45:57 +01:00
|
|
|
|
|
|
|
#define elf_tc_final_processing riscv_elf_final_processing
|
|
|
|
extern void riscv_elf_final_processing (void);
|
|
|
|
|
2017-03-02 07:54:32 +01:00
|
|
|
/* Adjust debug_line after relaxation. */
|
|
|
|
#define DWARF2_USE_FIXED_ADVANCE_PC 1
|
|
|
|
|
2019-01-16 22:14:59 +01:00
|
|
|
#define md_end riscv_md_end
|
|
|
|
#define CONVERT_SYMBOLIC_ATTRIBUTE riscv_convert_symbolic_attribute
|
|
|
|
|
|
|
|
extern void riscv_md_end (void);
|
|
|
|
extern int riscv_convert_symbolic_attribute (const char *);
|
|
|
|
|
2016-11-01 17:45:57 +01:00
|
|
|
#endif /* TC_RISCV */
|