Hi Kito,
On 7/22/2024 8:19 AM, Kito Cheng wrote:
Corresponding implementation in compiler-rt already merged in LLVM
side, so I plan to merge this into trunk tomorrow if no strong
objections.
NOTE: This has been tested with clang/llvm within our internal CI.
On Mon, Jul 22, 2024 at 10:16 PM Kito Cheng <kito.ch...@sifive.com> wrote:
This provides a common abstraction layer to probe the available extensions at
run-time. These functions can be used to implement function multi-versioning or
to detect available extensions.
The advantages of providing this abstraction layer are:
- Easy to port to other new platforms.
- Easier to maintain in GCC for function multi-versioning.
- For example, maintaining platform-dependent code in C code/libgcc is much
easier than maintaining it in GCC by creating GIMPLEs...
This API is intended to provide the capability to query minimal common
available extensions on the system.
Proposal in riscv-c-api-doc:
https://github.com/riscv-non-isa/riscv-c-api-doc/pull/74
Full function multi-versioning implementation will come later. We are posting
this first because we intend to backport it to the GCC 14 branch to unblock
LLVM 19 to use this with GCC 14.2, rather than waiting for GCC 15.
Changes since v2:
- Prevent it initialize more than once.
Changes since v1:
- Fix the format.
- Prevented race conditions by introducing a local variable to avoid load/store
operations during the computation of the feature bit.
libgcc/ChangeLog:
* config/riscv/feature_bits.c: New.
* config/riscv/t-elf (LIB2ADD): Add feature_bits.c.
---
libgcc/config/riscv/feature_bits.c | 313 +++++++++++++++++++++++++++++
libgcc/config/riscv/t-elf | 1 +
2 files changed, 314 insertions(+)
create mode 100644 libgcc/config/riscv/feature_bits.c
diff --git a/libgcc/config/riscv/feature_bits.c
b/libgcc/config/riscv/feature_bits.c
new file mode 100644
index 00000000000..cce4fbfa6be
--- /dev/null
+++ b/libgcc/config/riscv/feature_bits.c
@@ -0,0 +1,313 @@
+
+void __init_riscv_feature_bits ()
+{
+ if (__init)
+ return;
+
+#ifdef __linux
+ __init_riscv_features_bits_linux ();
+#else
+ /* Unsupported, just initlizaed that into all zeros. */
+ __riscv_feature_bits.length = 0
I don't know enough about this to be able to comment on the patch
itself. There's just a missing semicolon here which slipped its way into
the v3 patch which would cause errors when trying to build on non-linux
targets.
../../../../../../gcc/libgcc/config/riscv/feature_bits.c:307:34: error:
expected ';' before '__riscv_vendor_feature_bits'
307 | __riscv_feature_bits.length = 0
| ^
| ;
308 | __riscv_vendor_feature_bits.length = 0;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~
make[5]: *** [../../../../../../gcc/libgcc/static-object.mk:17:
feature_bits.o] Error 1
+ __riscv_vendor_feature_bits.length = 0;
+ __riscv_vendor_feature_bits.vendorID = 0;
+#endif
+
+ __init = 1;
+}
Edwin