From 54b110a367a24de8044779da409d771cf50a48fe Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Mon, 27 Oct 2025 01:09:59 +0100 Subject: [PATCH] Dev (#2547) * Update feature handling for Wasm, RiscV, Aarch64, Arm * - The option `--riscvfloat` renamed `--riscv-abi`. - Add initial `--cpu-features` allowing fine grained control over CPU features. --- releasenotes.md | 2 + src/build/build.h | 19 +- src/build/build_internal.h | 14 +- src/build/build_options.c | 24 +- src/build/builder.c | 16 +- src/build/project.c | 39 +- src/compiler/enums.h | 80 ++++ src/compiler/target.c | 725 +++++++++++++++++++++++-------------- src/compiler/target.h | 7 +- 9 files changed, 621 insertions(+), 305 deletions(-) diff --git a/releasenotes.md b/releasenotes.md index 21bb22b5c..375165cd6 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -16,6 +16,8 @@ - Add @simd and @align attributes to typedef #2543. - Rename `@extern` to `@cname`, deprecating the old name #2493. - Allow `(Foo)0` bitstruct casts even if type sizes do not match. +- The option `--riscvfloat` renamed `--riscv-abi`. +- Add initial `--cpu-features` allowing fine grained control over CPU features. ### Fixes - Bug in `io::write_using_write_byte`. diff --git a/src/build/build.h b/src/build/build.h index 1fdd808f9..b98829583 100644 --- a/src/build/build.h +++ b/src/build/build.h @@ -297,11 +297,11 @@ typedef enum typedef enum { - RISCVFLOAT_DEFAULT = -1, - RISCVFLOAT_NONE = 0, - RISCVFLOAT_FLOAT = 1, - RISCVFLOAT_DOUBLE = 2, -} RiscvFloatCapability; + RISCV_ABI_DEFAULT = -1, + RISCV_ABI_INT_ONLY = 0, + RISCV_ABI_FLOAT = 1, + RISCV_ABI_DOUBLE = 2, +} RiscvAbi; typedef enum { @@ -581,11 +581,12 @@ typedef struct BuildOptions_ StripUnused strip_unused; OptimizationLevel optlevel; SizeOptimizationLevel optsize; - RiscvFloatCapability riscv_float_capability; + RiscvAbi riscv_abi; MemoryEnvironment memory_environment; SanitizeMode sanitize_mode; uint32_t max_vector_size; uint32_t max_stack_object_size; + const char *cpu_features; uint32_t max_macro_iterations; bool print_keywords; bool print_attributes; @@ -726,6 +727,7 @@ typedef struct ArchOsTarget arch_os_target; CompilerBackend backend; LinkerType linker_type; + const char *cpu_features; uint32_t symtab_size; uint32_t max_vector_size; uint32_t max_stack_object_size; @@ -751,7 +753,7 @@ typedef struct SoftFloat soft_float : 3; StructReturn x86_struct_return : 3; X86VectorCapability x86_vector_capability : 4; - RiscvFloatCapability riscv_float_capability : 4; + RiscvAbi riscv_abi : 4; Win64Simd pass_win64_simd_as_arrays : 3; bool trap_on_wrap : 1; bool sanitize_address : 1; @@ -832,7 +834,7 @@ static BuildTarget default_build_target = { .feature.soft_float = SOFT_FLOAT_DEFAULT, .feature.fp_math = FP_DEFAULT, .feature.trap_on_wrap = false, - .feature.riscv_float_capability = RISCVFLOAT_DEFAULT, + .feature.riscv_abi = RISCV_ABI_DEFAULT, .feature.x86_vector_capability = X86VECTOR_DEFAULT, .feature.x86_cpu_set = X86CPU_DEFAULT, .feature.win_debug = WIN_DEBUG_DEFAULT, @@ -845,6 +847,7 @@ static BuildTarget default_build_target = { .quiet = false, }; + extern const char *project_default_keys[][2]; extern const int project_default_keys_count; extern const char *project_target_keys[][2]; diff --git a/src/build/build_internal.h b/src/build/build_internal.h index 2cc042f42..a6b67576a 100644 --- a/src/build/build_internal.h +++ b/src/build/build_internal.h @@ -62,11 +62,17 @@ static const char *on_off[2] = { }; - +// DEPRECATED static const char *riscv_capability[3] = { - [RISCVFLOAT_NONE] = "none", - [RISCVFLOAT_FLOAT] = "float", - [RISCVFLOAT_DOUBLE] = "double", + [RISCV_ABI_INT_ONLY] = "none", + [RISCV_ABI_FLOAT] = "float", + [RISCV_ABI_DOUBLE] = "double", +}; + +static const char *riscv_abi[3] = { + [RISCV_ABI_INT_ONLY] = "int-only", + [RISCV_ABI_FLOAT] = "float", + [RISCV_ABI_DOUBLE] = "double", }; static const char *win64_simd_type[2] = { diff --git a/src/build/build_options.c b/src/build/build_options.c index eee051b94..2497c343d 100644 --- a/src/build/build_options.c +++ b/src/build/build_options.c @@ -174,7 +174,7 @@ static void usage(bool full) print_opt("--reloc=