]> git.ipfire.org Git - thirdparty/gcc.git/commit - gcc/config/riscv/riscv.h
RISC-V: Implement target attribute
authorKito Cheng <kito.cheng@sifive.com>
Tue, 10 Oct 2023 04:13:05 +0000 (21:13 -0700)
committerKito Cheng <kito.cheng@sifive.com>
Thu, 16 Nov 2023 11:39:58 +0000 (19:39 +0800)
commit5f1105612b592650566a54846dd5f9ccdfed01a9
tree5eb65012b0e8ef3e067dc86ff2727e229c09dcc0
parentdefa8681d951c6d6c43c71e3636ce4db9de04a28
RISC-V: Implement target attribute

The target attribute which proposed in [1], target attribute allow user
to specify a local setting per-function basis.

The syntax of target attribute is `__attribute__((target("<ATTR-STRING>")))`.

and the syntax of `<ATTR-STRING>` describes below:
```
ATTR-STRING := ATTR-STRING ';' ATTR
             | ATTR

ATTR        := ARCH-ATTR
             | CPU-ATTR
             | TUNE-ATTR

ARCH-ATTR   := 'arch=' EXTENSIONS-OR-FULLARCH

EXTENSIONS-OR-FULLARCH := <EXTENSIONS>
                        | <FULLARCHSTR>

EXTENSIONS             := <EXTENSION> ',' <EXTENSIONS>
                        | <EXTENSION>

FULLARCHSTR            := <full-arch-string>

EXTENSION              := <OP> <EXTENSION-NAME> <VERSION>

OP                     := '+'

VERSION                := [0-9]+ 'p' [0-9]+
                        | [1-9][0-9]*
                        |

EXTENSION-NAME         := Naming rule is defined in RISC-V ISA manual

CPU-ATTR    := 'cpu=' <valid-cpu-name>
TUNE-ATTR   := 'tune=' <valid-tune-name>
```

Changes since v1:
- Use std::unique_ptr rather than alloca to prevent memory issue.
- Error rather than warning when attribute duplicated.

[1] https://github.com/riscv-non-isa/riscv-c-api-doc/pull/35

gcc/ChangeLog:

* config.gcc (riscv): Add riscv-target-attr.o.
* config/riscv/riscv-protos.h (riscv_declare_function_size) New.
(riscv_option_valid_attribute_p): New.
(riscv_override_options_internal): New.
(struct riscv_tune_info): New.
(riscv_parse_tune): New.
* config/riscv/riscv-target-attr.cc
(class riscv_target_attr_parser): New.
(struct riscv_attribute_info): New.
(riscv_attributes): New.
(riscv_target_attr_parser::parse_arch): New.
(riscv_target_attr_parser::handle_arch): New.
(riscv_target_attr_parser::handle_cpu): New.
(riscv_target_attr_parser::handle_tune): New.
(riscv_target_attr_parser::update_settings): New.
(riscv_process_one_target_attr): New.
(num_occurences_in_str): New.
(riscv_process_target_attr): New.
(riscv_option_valid_attribute_p): New.
* config/riscv/riscv.cc: Include target-globals.h and
riscv-subset.h.
(struct riscv_tune_info): Move to riscv-protos.h.
(get_tune_str): New.
(riscv_parse_tune): New parameter null_p.
(riscv_declare_function_size): New.
(riscv_option_override): Build target_option_default_node and
target_option_current_node.
(riscv_save_restore_target_globals): New.
(riscv_option_restore): New.
(riscv_previous_fndecl): New.
(riscv_set_current_function): Apply the target attribute.
(TARGET_OPTION_RESTORE): Define.
(TARGET_OPTION_VALID_ATTRIBUTE_P): Ditto.
* config/riscv/riscv.h (SWITCHABLE_TARGET): Define to 1.
(ASM_DECLARE_FUNCTION_SIZE) Define.
* config/riscv/riscv.opt (mtune=): Add Save attribute.
(mcpu=): Ditto.
(mcmodel=): Ditto.
* config/riscv/t-riscv: Add build rule for riscv-target-attr.o
* doc/extend.texi: Add doc for target attribute.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/target-attr-01.c: New.
* gcc.target/riscv/target-attr-02.c: Ditto.
* gcc.target/riscv/target-attr-03.c: Ditto.
* gcc.target/riscv/target-attr-04.c: Ditto.
* gcc.target/riscv/target-attr-05.c: Ditto.
* gcc.target/riscv/target-attr-06.c: Ditto.
* gcc.target/riscv/target-attr-07.c: Ditto.
* gcc.target/riscv/target-attr-bad-01.c: Ditto.
* gcc.target/riscv/target-attr-bad-02.c: Ditto.
* gcc.target/riscv/target-attr-bad-03.c: Ditto.
* gcc.target/riscv/target-attr-bad-04.c: Ditto.
* gcc.target/riscv/target-attr-bad-05.c: Ditto.
* gcc.target/riscv/target-attr-bad-06.c: Ditto.
* gcc.target/riscv/target-attr-bad-07.c: Ditto.
* gcc.target/riscv/target-attr-bad-08.c: Ditto.
* gcc.target/riscv/target-attr-bad-09.c: Ditto.
* gcc.target/riscv/target-attr-bad-10.c: Ditto.

Reviewed-by: Christoph Müllner <christoph.muellner@vrull.eu>
25 files changed:
gcc/config.gcc
gcc/config/riscv/riscv-protos.h
gcc/config/riscv/riscv-target-attr.cc [new file with mode: 0644]
gcc/config/riscv/riscv.cc
gcc/config/riscv/riscv.h
gcc/config/riscv/riscv.opt
gcc/config/riscv/t-riscv
gcc/doc/extend.texi
gcc/testsuite/gcc.target/riscv/target-attr-01.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-02.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-03.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-04.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-05.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-06.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-07.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-bad-01.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-bad-02.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-bad-03.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-bad-04.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-bad-05.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-bad-06.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-bad-07.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-bad-08.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-bad-09.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/target-attr-bad-10.c [new file with mode: 0644]