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=