]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_codegen_ssa/src/target_features.rs
Auto merge of #100968 - cjgillot:mir-upvar-vec, r=wesleywiser
[rust.git] / compiler / rustc_codegen_ssa / src / target_features.rs
1 use rustc_hir::def_id::LOCAL_CRATE;
2 use rustc_middle::ty::query::Providers;
3 use rustc_session::Session;
4 use rustc_span::symbol::sym;
5 use rustc_span::symbol::Symbol;
6
7 /// Features that control behaviour of rustc, rather than the codegen.
8 pub const RUSTC_SPECIFIC_FEATURES: &[&str] = &["crt-static"];
9
10 // When adding features to the below lists
11 // check whether they're named already elsewhere in rust
12 // e.g. in stdarch and whether the given name matches LLVM's
13 // if it doesn't, to_llvm_feature in llvm_util in rustc_codegen_llvm needs to be adapted
14
15 const ARM_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
16     ("aclass", Some(sym::arm_target_feature)),
17     ("mclass", Some(sym::arm_target_feature)),
18     ("rclass", Some(sym::arm_target_feature)),
19     ("dsp", Some(sym::arm_target_feature)),
20     ("neon", Some(sym::arm_target_feature)),
21     ("crc", Some(sym::arm_target_feature)),
22     ("crypto", Some(sym::arm_target_feature)),
23     ("aes", Some(sym::arm_target_feature)),
24     ("sha2", Some(sym::arm_target_feature)),
25     ("i8mm", Some(sym::arm_target_feature)),
26     ("dotprod", Some(sym::arm_target_feature)),
27     ("v5te", Some(sym::arm_target_feature)),
28     ("v6", Some(sym::arm_target_feature)),
29     ("v6k", Some(sym::arm_target_feature)),
30     ("v6t2", Some(sym::arm_target_feature)),
31     ("v7", Some(sym::arm_target_feature)),
32     ("v8", Some(sym::arm_target_feature)),
33     ("vfp2", Some(sym::arm_target_feature)),
34     ("vfp3", Some(sym::arm_target_feature)),
35     ("vfp4", Some(sym::arm_target_feature)),
36     ("fp-armv8", Some(sym::arm_target_feature)),
37     // This is needed for inline assembly, but shouldn't be stabilized as-is
38     // since it should be enabled per-function using #[instruction_set], not
39     // #[target_feature].
40     ("thumb-mode", Some(sym::arm_target_feature)),
41     ("thumb2", Some(sym::arm_target_feature)),
42     ("d32", Some(sym::arm_target_feature)),
43 ];
44
45 const AARCH64_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
46     // FEAT_AdvSimd & FEAT_FP
47     ("neon", None),
48     // FEAT_FP16
49     ("fp16", None),
50     // FEAT_SVE
51     ("sve", None),
52     // FEAT_CRC
53     ("crc", None),
54     // FEAT_RAS
55     ("ras", None),
56     // FEAT_LSE
57     ("lse", None),
58     // FEAT_RDM
59     ("rdm", None),
60     // FEAT_RCPC
61     ("rcpc", None),
62     // FEAT_RCPC2
63     ("rcpc2", None),
64     // FEAT_DotProd
65     ("dotprod", None),
66     // FEAT_TME
67     ("tme", None),
68     // FEAT_FHM
69     ("fhm", None),
70     // FEAT_DIT
71     ("dit", None),
72     // FEAT_FLAGM
73     ("flagm", None),
74     // FEAT_SSBS
75     ("ssbs", None),
76     // FEAT_SB
77     ("sb", None),
78     // FEAT_PAUTH (address authentication)
79     ("paca", None),
80     // FEAT_PAUTH (generic authentication)
81     ("pacg", None),
82     // FEAT_DPB
83     ("dpb", None),
84     // FEAT_DPB2
85     ("dpb2", None),
86     // FEAT_SVE2
87     ("sve2", None),
88     // FEAT_SVE2_AES
89     ("sve2-aes", None),
90     // FEAT_SVE2_SM4
91     ("sve2-sm4", None),
92     // FEAT_SVE2_SHA3
93     ("sve2-sha3", None),
94     // FEAT_SVE2_BitPerm
95     ("sve2-bitperm", None),
96     // FEAT_FRINTTS
97     ("frintts", None),
98     // FEAT_I8MM
99     ("i8mm", None),
100     // FEAT_F32MM
101     ("f32mm", None),
102     // FEAT_F64MM
103     ("f64mm", None),
104     // FEAT_BF16
105     ("bf16", None),
106     // FEAT_RAND
107     ("rand", None),
108     // FEAT_BTI
109     ("bti", None),
110     // FEAT_MTE
111     ("mte", None),
112     // FEAT_JSCVT
113     ("jsconv", None),
114     // FEAT_FCMA
115     ("fcma", None),
116     // FEAT_AES
117     ("aes", None),
118     // FEAT_SHA1 & FEAT_SHA256
119     ("sha2", None),
120     // FEAT_SHA512 & FEAT_SHA3
121     ("sha3", None),
122     // FEAT_SM3 & FEAT_SM4
123     ("sm4", None),
124     // FEAT_PAN
125     ("pan", None),
126     // FEAT_LOR
127     ("lor", None),
128     // FEAT_VHE
129     ("vh", None),
130     // FEAT_PMUv3
131     ("pmuv3", None),
132     // FEAT_SPE
133     ("spe", None),
134     ("v8.1a", Some(sym::aarch64_ver_target_feature)),
135     ("v8.2a", Some(sym::aarch64_ver_target_feature)),
136     ("v8.3a", Some(sym::aarch64_ver_target_feature)),
137     ("v8.4a", Some(sym::aarch64_ver_target_feature)),
138     ("v8.5a", Some(sym::aarch64_ver_target_feature)),
139     ("v8.6a", Some(sym::aarch64_ver_target_feature)),
140     ("v8.7a", Some(sym::aarch64_ver_target_feature)),
141 ];
142
143 const AARCH64_TIED_FEATURES: &[&[&str]] = &[
144     &["paca", "pacg"], // Together these represent `pauth` in LLVM
145 ];
146
147 const X86_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
148     ("adx", None),
149     ("aes", None),
150     ("avx", None),
151     ("avx2", None),
152     ("avx512bf16", Some(sym::avx512_target_feature)),
153     ("avx512bitalg", Some(sym::avx512_target_feature)),
154     ("avx512bw", Some(sym::avx512_target_feature)),
155     ("avx512cd", Some(sym::avx512_target_feature)),
156     ("avx512dq", Some(sym::avx512_target_feature)),
157     ("avx512er", Some(sym::avx512_target_feature)),
158     ("avx512f", Some(sym::avx512_target_feature)),
159     ("avx512gfni", Some(sym::avx512_target_feature)),
160     ("avx512ifma", Some(sym::avx512_target_feature)),
161     ("avx512pf", Some(sym::avx512_target_feature)),
162     ("avx512vaes", Some(sym::avx512_target_feature)),
163     ("avx512vbmi", Some(sym::avx512_target_feature)),
164     ("avx512vbmi2", Some(sym::avx512_target_feature)),
165     ("avx512vl", Some(sym::avx512_target_feature)),
166     ("avx512vnni", Some(sym::avx512_target_feature)),
167     ("avx512vp2intersect", Some(sym::avx512_target_feature)),
168     ("avx512vpclmulqdq", Some(sym::avx512_target_feature)),
169     ("avx512vpopcntdq", Some(sym::avx512_target_feature)),
170     ("bmi1", None),
171     ("bmi2", None),
172     ("cmpxchg16b", Some(sym::cmpxchg16b_target_feature)),
173     ("ermsb", Some(sym::ermsb_target_feature)),
174     ("f16c", Some(sym::f16c_target_feature)),
175     ("fma", None),
176     ("fxsr", None),
177     ("lzcnt", None),
178     ("movbe", Some(sym::movbe_target_feature)),
179     ("pclmulqdq", None),
180     ("popcnt", None),
181     ("rdrand", None),
182     ("rdseed", None),
183     ("rtm", Some(sym::rtm_target_feature)),
184     ("sha", None),
185     ("sse", None),
186     ("sse2", None),
187     ("sse3", None),
188     ("sse4.1", None),
189     ("sse4.2", None),
190     ("sse4a", Some(sym::sse4a_target_feature)),
191     ("ssse3", None),
192     ("tbm", Some(sym::tbm_target_feature)),
193     ("xsave", None),
194     ("xsavec", None),
195     ("xsaveopt", None),
196     ("xsaves", None),
197 ];
198
199 const HEXAGON_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
200     ("hvx", Some(sym::hexagon_target_feature)),
201     ("hvx-length128b", Some(sym::hexagon_target_feature)),
202 ];
203
204 const POWERPC_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
205     ("altivec", Some(sym::powerpc_target_feature)),
206     ("power8-altivec", Some(sym::powerpc_target_feature)),
207     ("power9-altivec", Some(sym::powerpc_target_feature)),
208     ("power8-vector", Some(sym::powerpc_target_feature)),
209     ("power9-vector", Some(sym::powerpc_target_feature)),
210     ("vsx", Some(sym::powerpc_target_feature)),
211 ];
212
213 const MIPS_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] =
214     &[("fp64", Some(sym::mips_target_feature)), ("msa", Some(sym::mips_target_feature))];
215
216 const RISCV_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
217     ("m", Some(sym::riscv_target_feature)),
218     ("a", Some(sym::riscv_target_feature)),
219     ("c", Some(sym::riscv_target_feature)),
220     ("f", Some(sym::riscv_target_feature)),
221     ("d", Some(sym::riscv_target_feature)),
222     ("e", Some(sym::riscv_target_feature)),
223     ("v", Some(sym::riscv_target_feature)),
224     ("zfinx", Some(sym::riscv_target_feature)),
225     ("zdinx", Some(sym::riscv_target_feature)),
226     ("zhinx", Some(sym::riscv_target_feature)),
227     ("zhinxmin", Some(sym::riscv_target_feature)),
228     ("zfh", Some(sym::riscv_target_feature)),
229     ("zfhmin", Some(sym::riscv_target_feature)),
230     ("zba", Some(sym::riscv_target_feature)),
231     ("zbb", Some(sym::riscv_target_feature)),
232     ("zbc", Some(sym::riscv_target_feature)),
233     ("zbs", Some(sym::riscv_target_feature)),
234     ("zbkb", Some(sym::riscv_target_feature)),
235     ("zbkc", Some(sym::riscv_target_feature)),
236     ("zbkx", Some(sym::riscv_target_feature)),
237     ("zknd", Some(sym::riscv_target_feature)),
238     ("zkne", Some(sym::riscv_target_feature)),
239     ("zknh", Some(sym::riscv_target_feature)),
240     ("zksed", Some(sym::riscv_target_feature)),
241     ("zksh", Some(sym::riscv_target_feature)),
242     ("zkr", Some(sym::riscv_target_feature)),
243     ("zkn", Some(sym::riscv_target_feature)),
244     ("zks", Some(sym::riscv_target_feature)),
245     ("zk", Some(sym::riscv_target_feature)),
246     ("zkt", Some(sym::riscv_target_feature)),
247 ];
248
249 const WASM_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
250     ("simd128", None),
251     ("atomics", Some(sym::wasm_target_feature)),
252     ("nontrapping-fptoint", Some(sym::wasm_target_feature)),
253     ("bulk-memory", Some(sym::wasm_target_feature)),
254     ("mutable-globals", Some(sym::wasm_target_feature)),
255     ("reference-types", Some(sym::wasm_target_feature)),
256     ("sign-ext", Some(sym::wasm_target_feature)),
257 ];
258
259 const BPF_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[("alu32", Some(sym::bpf_target_feature))];
260
261 /// When rustdoc is running, provide a list of all known features so that all their respective
262 /// primitives may be documented.
263 ///
264 /// IMPORTANT: If you're adding another feature list above, make sure to add it to this iterator!
265 pub fn all_known_features() -> impl Iterator<Item = (&'static str, Option<Symbol>)> {
266     std::iter::empty()
267         .chain(ARM_ALLOWED_FEATURES.iter())
268         .chain(AARCH64_ALLOWED_FEATURES.iter())
269         .chain(X86_ALLOWED_FEATURES.iter())
270         .chain(HEXAGON_ALLOWED_FEATURES.iter())
271         .chain(POWERPC_ALLOWED_FEATURES.iter())
272         .chain(MIPS_ALLOWED_FEATURES.iter())
273         .chain(RISCV_ALLOWED_FEATURES.iter())
274         .chain(WASM_ALLOWED_FEATURES.iter())
275         .chain(BPF_ALLOWED_FEATURES.iter())
276         .cloned()
277 }
278
279 pub fn supported_target_features(sess: &Session) -> &'static [(&'static str, Option<Symbol>)] {
280     match &*sess.target.arch {
281         "arm" => ARM_ALLOWED_FEATURES,
282         "aarch64" => AARCH64_ALLOWED_FEATURES,
283         "x86" | "x86_64" => X86_ALLOWED_FEATURES,
284         "hexagon" => HEXAGON_ALLOWED_FEATURES,
285         "mips" | "mips64" => MIPS_ALLOWED_FEATURES,
286         "powerpc" | "powerpc64" => POWERPC_ALLOWED_FEATURES,
287         "riscv32" | "riscv64" => RISCV_ALLOWED_FEATURES,
288         "wasm32" | "wasm64" => WASM_ALLOWED_FEATURES,
289         "bpf" => BPF_ALLOWED_FEATURES,
290         _ => &[],
291     }
292 }
293
294 pub fn tied_target_features(sess: &Session) -> &'static [&'static [&'static str]] {
295     match &*sess.target.arch {
296         "aarch64" => AARCH64_TIED_FEATURES,
297         _ => &[],
298     }
299 }
300
301 pub(crate) fn provide(providers: &mut Providers) {
302     providers.supported_target_features = |tcx, cnum| {
303         assert_eq!(cnum, LOCAL_CRATE);
304         if tcx.sess.opts.actually_rustdoc {
305             // rustdoc needs to be able to document functions that use all the features, so
306             // whitelist them all
307             all_known_features().map(|(a, b)| (a.to_string(), b)).collect()
308         } else {
309             supported_target_features(tcx.sess).iter().map(|&(a, b)| (a.to_string(), b)).collect()
310         }
311     };
312 }