aboutsummaryrefslogtreecommitdiff
path: root/opcodes/riscv-dis.c
diff options
context:
space:
mode:
Diffstat (limited to 'opcodes/riscv-dis.c')
-rw-r--r--opcodes/riscv-dis.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c
index 9a63499..c5e9362 100644
--- a/opcodes/riscv-dis.c
+++ b/opcodes/riscv-dis.c
@@ -52,6 +52,9 @@ struct riscv_private_data
enum riscv_spec_class default_priv_spec;
/* Used for architecture parser. */
riscv_parse_subset_t riscv_rps_dis;
+ /* Default architecture string for the object file. It will be changed once
+ elf architecture attribute exits. This is used for mapping symbol $x. */
+ const char* default_arch;
/* Used for mapping symbols. */
int last_map_symbol;
bfd_vma last_stop_offset;
@@ -1065,10 +1068,14 @@ riscv_update_map_state (int n,
return;
name = bfd_asymbol_name(info->symtab[n]);
- if (strcmp (name, "$x") == 0)
- *state = MAP_INSN;
- else if (strcmp (name, "$d") == 0)
+ if (strcmp (name, "$d") == 0)
*state = MAP_DATA;
+ else if (strcmp (name, "$x") == 0)
+ {
+ *state = MAP_INSN;
+ riscv_release_subset_list (pd->riscv_rps_dis.subset_list);
+ riscv_parse_subset (&pd->riscv_rps_dis, pd->default_arch);
+ }
else if (strncmp (name, "$xrv", 4) == 0)
{
*state = MAP_INSN;
@@ -1380,7 +1387,7 @@ riscv_init_disasm_info (struct disassemble_info *info)
pd->riscv_rps_dis.xlen = &pd->xlen;
pd->riscv_rps_dis.isa_spec = &pd->default_isa_spec;
pd->riscv_rps_dis.check_unknown_prefixed_ext = false;
- const char *default_arch = "rv64gc";
+ pd->default_arch = "rv64gc";
if (info->section != NULL)
{
bfd *abfd = info->section->owner;
@@ -1398,12 +1405,12 @@ riscv_init_disasm_info (struct disassemble_info *info)
attr[Tag_b].i,
attr[Tag_c].i,
&pd->default_priv_spec);
- default_arch = attr[Tag_RISCV_arch].s;
+ pd->default_arch = attr[Tag_RISCV_arch].s;
}
}
}
riscv_release_subset_list (pd->riscv_rps_dis.subset_list);
- riscv_parse_subset (&pd->riscv_rps_dis, default_arch);
+ riscv_parse_subset (&pd->riscv_rps_dis, pd->default_arch);
pd->last_map_symbol = -1;
pd->last_stop_offset = 0;