Skip to content

Commit 2e0f5ee

Browse files
committed
RISC-V: Base for complex extension implications
Thanks to the commit 48558a5 ("RISC-V: Allow nested implications for extensions"), we can write complex extension implications in theory. However, to actually do that, we need to pass more information to check_func. For example, we want to imply 'Zcf' from 'F' if and only if the 'Zce' extension is also enabled and XLEN is 32. Passing rps is a way to enable this. This commit prepares for such complex extension implications. bfd/ChangeLog: * elfxx-riscv.c (struct riscv_implicit_subset) Move around and change check_func function prototype. (check_implicit_always): New arguments. (check_implicit_for_i): Likewise. (riscv_implicit_subsets): Add comment for this variable. (riscv_parse_add_implicit_subsets): Call check_func with new arguments.
1 parent 9f9073e commit 2e0f5ee

File tree

1 file changed

+24
-15
lines changed

1 file changed

+24
-15
lines changed

bfd/elfxx-riscv.c

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,35 +1064,44 @@ riscv_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED,
10641064
return bfd_reloc_ok;
10651065
}
10661066

1067+
/* Record all implicit information for the subsets. */
1068+
1069+
typedef struct riscv_implicit_subset
1070+
{
1071+
const char *subset_name;
1072+
const char *implicit_name;
1073+
/* A function to determine if we need to add the implicit subset. */
1074+
bool (*check_func) (riscv_parse_subset_t *,
1075+
const struct riscv_implicit_subset *,
1076+
const riscv_subset_t *);
1077+
} riscv_implicit_subset_t;
1078+
10671079
/* Always add the IMPLICIT for the SUBSET. */
10681080

10691081
static bool
1070-
check_implicit_always (const char *implicit ATTRIBUTE_UNUSED,
1071-
riscv_subset_t *subset ATTRIBUTE_UNUSED)
1082+
check_implicit_always (riscv_parse_subset_t *rps ATTRIBUTE_UNUSED,
1083+
const riscv_implicit_subset_t *implicit
1084+
ATTRIBUTE_UNUSED,
1085+
const riscv_subset_t *subset ATTRIBUTE_UNUSED)
10721086
{
10731087
return true;
10741088
}
10751089

10761090
/* Add the IMPLICIT only when the version of SUBSET less than 2.1. */
10771091

10781092
static bool
1079-
check_implicit_for_i (const char *implicit ATTRIBUTE_UNUSED,
1080-
riscv_subset_t *subset)
1093+
check_implicit_for_i (riscv_parse_subset_t *rps ATTRIBUTE_UNUSED,
1094+
const riscv_implicit_subset_t *implicit ATTRIBUTE_UNUSED,
1095+
const riscv_subset_t *subset)
10811096
{
10821097
return (subset->major_version < 2
10831098
|| (subset->major_version == 2
10841099
&& subset->minor_version < 1));
10851100
}
10861101

1087-
/* Record all implicit information for the subsets. */
1088-
struct riscv_implicit_subset
1089-
{
1090-
const char *subset_name;
1091-
const char *implicit_name;
1092-
/* A function to determine if we need to add the implicit subset. */
1093-
bool (*check_func) (const char *, riscv_subset_t *);
1094-
};
1095-
static struct riscv_implicit_subset riscv_implicit_subsets[] =
1102+
/* All extension implications. */
1103+
1104+
static riscv_implicit_subset_t riscv_implicit_subsets[] =
10961105
{
10971106
{"e", "i", check_implicit_always},
10981107
{"i", "zicsr", check_implicit_for_i},
@@ -1909,7 +1918,7 @@ riscv_parse_extensions (riscv_parse_subset_t *rps,
19091918
static void
19101919
riscv_parse_add_implicit_subsets (riscv_parse_subset_t *rps)
19111920
{
1912-
struct riscv_implicit_subset *t = riscv_implicit_subsets;
1921+
riscv_implicit_subset_t *t = riscv_implicit_subsets;
19131922
bool finished = false;
19141923
while (!finished)
19151924
{
@@ -1921,7 +1930,7 @@ riscv_parse_add_implicit_subsets (riscv_parse_subset_t *rps)
19211930
if (riscv_lookup_subset (rps->subset_list, t->subset_name, &subset)
19221931
&& !riscv_lookup_subset (rps->subset_list, t->implicit_name,
19231932
&implicit_subset)
1924-
&& t->check_func (t->implicit_name, subset))
1933+
&& t->check_func (rps, t, subset))
19251934
{
19261935
riscv_parse_add_subset (rps, t->implicit_name,
19271936
RISCV_UNKNOWN_VERSION,

0 commit comments

Comments
 (0)