@@ -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+
109115impl 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