@@ -898,6 +898,28 @@ static M68K_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
898898 // tidy-alphabetical-end
899899] ;
900900
901+ static AVR_FEATURES : & [ ( & str , Stability , ImpliedFeatures ) ] = & [
902+ // tidy-alphabetical-start
903+ ( "addsubiw" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
904+ ( "break" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
905+ ( "eijmpcall" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
906+ ( "elpm" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
907+ ( "elpmx" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
908+ ( "ijmpcall" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
909+ ( "jmpcall" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
910+ ( "lowbytefirst" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
911+ ( "lpm" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
912+ ( "lpmx" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
913+ ( "movw" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
914+ ( "mul" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
915+ ( "rmw" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
916+ ( "spm" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
917+ ( "spmx" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
918+ ( "sram" , Forbidden { reason : "devices that have no SRAM are unsupported" } , & [ ] ) ,
919+ ( "tinyencoding" , Unstable ( sym:: avr_target_feature) , & [ ] ) ,
920+ // tidy-alphabetical-end
921+ ] ;
922+
901923/// When rustdoc is running, provide a list of all known features so that all their respective
902924/// primitives may be documented.
903925///
@@ -919,6 +941,7 @@ pub fn all_rust_features() -> impl Iterator<Item = (&'static str, Stability)> {
919941 . chain ( IBMZ_FEATURES )
920942 . chain ( SPARC_FEATURES )
921943 . chain ( M68K_FEATURES )
944+ . chain ( AVR_FEATURES )
922945 . cloned ( )
923946 . map ( |( f, s, _) | ( f, s) )
924947}
@@ -996,12 +1019,8 @@ impl Target {
9961019 Arch :: S390x => IBMZ_FEATURES ,
9971020 Arch :: Sparc | Arch :: Sparc64 => SPARC_FEATURES ,
9981021 Arch :: M68k => M68K_FEATURES ,
999- Arch :: AmdGpu
1000- | Arch :: Avr
1001- | Arch :: Msp430
1002- | Arch :: SpirV
1003- | Arch :: Xtensa
1004- | Arch :: Other ( _) => & [ ] ,
1022+ Arch :: Avr => AVR_FEATURES ,
1023+ Arch :: AmdGpu | Arch :: Msp430 | Arch :: SpirV | Arch :: Xtensa | Arch :: Other ( _) => & [ ] ,
10051024 }
10061025 }
10071026
@@ -1023,11 +1042,11 @@ impl Target {
10231042 MIPS_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI
10241043 }
10251044 Arch :: AmdGpu => AMDGPU_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
1026- Arch :: Nvptx64 | Arch :: Bpf | Arch :: M68k => & [ ] , // no vector ABI
1045+ Arch :: Nvptx64 | Arch :: Bpf | Arch :: M68k | Arch :: Avr => & [ ] , // no vector ABI
10271046 Arch :: CSky => CSKY_FEATURES_FOR_CORRECT_FIXED_LENGTH_VECTOR_ABI ,
10281047 // FIXME: for some tier3 targets, we are overly cautious and always give warnings
10291048 // when passing args in vector registers.
1030- Arch :: Avr | Arch :: Msp430 | Arch :: SpirV | Arch :: Xtensa | Arch :: Other ( _) => & [ ] ,
1049+ Arch :: Msp430 | Arch :: SpirV | Arch :: Xtensa | Arch :: Other ( _) => & [ ] ,
10311050 }
10321051 }
10331052
@@ -1224,6 +1243,12 @@ impl Target {
12241243 // because the vector and float registers overlap.
12251244 FeatureConstraints { required : & [ ] , incompatible : & [ "soft-float" ] }
12261245 }
1246+ Arch :: Avr => {
1247+ // SRAM is minimum requirement for C/C++ in both avr-gcc and Clang,
1248+ // and backends of them only support assembly for devices have no SRAM.
1249+ // See the discussion in https://github.com/rust-lang/rust/pull/146900 for more.
1250+ FeatureConstraints { required : & [ "sram" ] , incompatible : & [ ] }
1251+ }
12271252 _ => NOTHING ,
12281253 }
12291254 }
0 commit comments