Skip to content

Commit fb712aa

Browse files
Merge pull request #349 from wisp3rwind/support-relax
Fix: Don't crash when target-feature=+relax is given
2 parents 38af0ed + dd626f5 commit fb712aa

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

riscv-target-parser/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ This project adheres to [Semantic Versioning](http://semver.org/).
55

66
## [Unreleased]
77

8+
### Fixed
9+
10+
- Skip the 'relax' target feature when parsing extensions
11+
812
## [v0.1.2] - 2025-06-10
913

1014
### Fixed

riscv-target-parser/src/lib.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,12 @@ pub struct RiscvTarget {
106106
extensions: Extensions,
107107
}
108108

109+
// Returns whether a target feature _might_ be an ISA extension according to a non-exhaustive list
110+
// of known unrelated features flags.
111+
fn is_isa_extension(feature: &str) -> bool {
112+
feature != "relax"
113+
}
114+
109115
impl RiscvTarget {
110116
/// Builds a RISC-V target from a target triple and cargo flags.
111117
/// This function is expected to be called from a build script.
@@ -135,11 +141,15 @@ impl RiscvTarget {
135141
})
136142
{
137143
if let Some(feature) = target_feature.strip_prefix('+') {
138-
let extension = Extension::try_from(feature)?;
139-
target.extensions.insert(extension);
144+
if is_isa_extension(feature) {
145+
let extension = Extension::try_from(feature)?;
146+
target.extensions.insert(extension);
147+
}
140148
} else if let Some(feature) = target_feature.strip_prefix('-') {
141-
let extension = Extension::try_from(feature)?;
142-
target.extensions.remove(&extension);
149+
if is_isa_extension(feature) {
150+
let extension = Extension::try_from(feature)?;
151+
target.extensions.remove(&extension);
152+
}
143153
} else {
144154
return Err(Error::UnknownTargetFeature(target_feature));
145155
}
@@ -246,7 +256,7 @@ mod test {
246256
#[test]
247257
fn test_parse_target() {
248258
let target = "riscv32imac-unknown-none-elf";
249-
let cargo_flags = "target-feature=+m,-a,+f";
259+
let cargo_flags = "target-feature=+m,-a,+f,+relax";
250260
let target = super::RiscvTarget::build(target, cargo_flags).unwrap();
251261
let rustc_flags = target.rustc_flags();
252262
assert_eq!(rustc_flags, vec!["riscvi", "riscvm", "riscvf", "riscvc"]);

0 commit comments

Comments
 (0)