[RISCV][FMV] Support target_clones (#85786)
commit9cd93774098c861c260090a690f428b7ae031c65
authorPiyou Chen <piyou.chen@sifive.com>
Fri, 13 Sep 2024 10:04:53 +0000 (13 18:04 +0800)
committerGitHub <noreply@github.com>
Fri, 13 Sep 2024 10:04:53 +0000 (13 18:04 +0800)
tree4d85118ee70cab7ef772e1dc45fe27ad7f2ad109
parent4ca8fb18129e6465c3594a8681f1cca0e2aff724
[RISCV][FMV] Support target_clones (#85786)

This patch enable the function multiversion(FMV) and `target_clones`
attribute for RISC-V target.

The proposal of `target_clones` syntax can be found at the
https://github.com/riscv-non-isa/riscv-c-api-doc/pull/48 (which has
landed), as modified by the proposed
https://github.com/riscv-non-isa/riscv-c-api-doc/pull/85 (which adds the
priority syntax).

It supports the `target_clones` function attribute and function
multiversioning feature for RISC-V target. It will generate the ifunc
resolver function for the function that declared with target_clones
attribute.

The resolver function will check the version support by runtime object
`__riscv_feature_bits`.

For example:

```
__attribute__((target_clones("default", "arch=+ver1", "arch=+ver2"))) int bar() {
    return 1;
}
```

the corresponding resolver will be like:

```
bar.resolver() {
    __init_riscv_feature_bits();
    // Check arch=+ver1
    if ((__riscv_feature_bits.features[0] & BITMASK_OF_VERSION1) == BITMASK_OF_VERSION1) {
        return bar.arch=+ver1;
    } else {
        // Check arch=+ver2
        if ((__riscv_feature_bits.features[0] & BITMASK_OF_VERSION2) == BITMASK_OF_VERSION2) {
            return bar.arch=+ver2;
        } else {
            // Default
            return bar.default;
        }
    }
}
```
15 files changed:
clang/include/clang/Basic/DiagnosticFrontendKinds.td
clang/include/clang/Basic/TargetInfo.h
clang/include/clang/Sema/SemaRISCV.h
clang/lib/AST/ASTContext.cpp
clang/lib/Basic/Targets/RISCV.cpp
clang/lib/CodeGen/CodeGenFunction.cpp
clang/lib/CodeGen/CodeGenFunction.h
clang/lib/CodeGen/CodeGenModule.cpp
clang/lib/CodeGen/Targets/RISCV.cpp
clang/lib/Sema/SemaDeclAttr.cpp
clang/lib/Sema/SemaRISCV.cpp
clang/test/CodeGen/attr-target-clones-riscv-invalid.c [new file with mode: 0644]
clang/test/CodeGen/attr-target-clones-riscv.c [new file with mode: 0644]
clang/test/CodeGenCXX/attr-target-clones-riscv.cpp [new file with mode: 0644]
clang/test/SemaCXX/attr-target-clones-riscv.cpp [new file with mode: 0644]