[v4,2/8] RISC-V: Implement Priority syntax parser for Function Multi-Versioning
Checks
Context |
Check |
Description |
rivoscibot/toolchain-ci-rivos-lint |
success
|
Lint passed
|
rivoscibot/toolchain-ci-rivos-apply-patch |
success
|
Patch applied
|
rivoscibot/toolchain-ci-rivos-build--newlib-rv64gc-lp64d-non-multilib |
success
|
Build passed
|
rivoscibot/toolchain-ci-rivos-build--linux-rv64gc-lp64d-non-multilib |
success
|
Build passed
|
rivoscibot/toolchain-ci-rivos-build--linux-rv64gcv-lp64d-multilib |
success
|
Build passed
|
rivoscibot/toolchain-ci-rivos-build--newlib-rv64gcv-lp64d-multilib |
success
|
Build passed
|
rivoscibot/toolchain-ci-rivos-build--linux-rv64gc_zba_zbb_zbc_zbs-lp64d-multilib |
success
|
Build passed
|
rivoscibot/toolchain-ci-rivos-test |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_gcc_build--master-arm |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_gcc_check--master-aarch64 |
success
|
Test passed
|
linaro-tcwg-bot/tcwg_gcc_check--master-arm |
success
|
Test passed
|
Commit Message
This patch adds the priority syntax parser to support the Function
Multi-Versioning (FMV) feature in RISC-V. This feature allows users to
specify the priority of the function version in the attribute syntax.
Chnages based on RISC-V C-API PR:
https://github.com/riscv-non-isa/riscv-c-api-doc/pull/85
Signed-off-by: Yangyu Chen <cyy@cyyself.name>
gcc/ChangeLog:
* config/riscv/riscv-target-attr.cc
(riscv_target_attr_parser::handle_priority): New function.
(riscv_target_attr_parser::update_settings): Update priority
attribute.
* config/riscv/riscv.opt: Add TargetVariable riscv_fmv_priority.
---
gcc/config/riscv/riscv-target-attr.cc | 24 ++++++++++++++++++++++++
gcc/config/riscv/riscv.opt | 3 +++
2 files changed, 27 insertions(+)
@@ -39,16 +39,19 @@ public:
: m_found_arch_p (false)
, m_found_tune_p (false)
, m_found_cpu_p (false)
+ , m_found_priority_p (false)
, m_subset_list (nullptr)
, m_loc (loc)
, m_cpu_info (nullptr)
, m_tune (nullptr)
+ , m_priority (0)
{
}
bool handle_arch (const char *);
bool handle_cpu (const char *);
bool handle_tune (const char *);
+ bool handle_priority (const char *);
void update_settings (struct gcc_options *opts) const;
private:
@@ -58,10 +61,12 @@ private:
bool m_found_arch_p;
bool m_found_tune_p;
bool m_found_cpu_p;
+ bool m_found_priority_p;
riscv_subset_list *m_subset_list;
location_t m_loc;
const riscv_cpu_info *m_cpu_info;
const char *m_tune;
+ int m_priority;
};
}
@@ -210,6 +215,22 @@ riscv_target_attr_parser::handle_tune (const char *str)
return true;
}
+bool
+riscv_target_attr_parser::handle_priority (const char *str)
+{
+ if (m_found_priority_p)
+ error_at (m_loc, "%<target()%> attribute: priority appears more than once");
+ m_found_priority_p = true;
+
+ if (sscanf (str, "%d", &m_priority) != 1)
+ {
+ error_at (m_loc, "%<target()%> attribute: invalid priority %qs", str);
+ return false;
+ }
+
+ return true;
+}
+
void
riscv_target_attr_parser::update_settings (struct gcc_options *opts) const
{
@@ -236,6 +257,9 @@ riscv_target_attr_parser::update_settings (struct gcc_options *opts) const
if (m_cpu_info)
opts->x_riscv_tune_string = m_cpu_info->tune;
}
+
+ if (m_priority)
+ opts->x_riscv_fmv_priority = m_priority;
}
/* Parse ARG_STR which contains the definition of one target attribute.
@@ -523,6 +523,9 @@ Mask(XSFVCP) Var(riscv_sifive_subext)
Mask(XSFCEASE) Var(riscv_sifive_subext)
+TargetVariable
+int riscv_fmv_priority = 0
+
Enum
Name(isa_spec_class) Type(enum riscv_isa_spec_class)
Supported ISA specs (for use with the -misa-spec= option):