rtic_macros/codegen/
local_resources.rs
1use crate::syntax::ast::App;
2use crate::{analyze::Analysis, codegen::util};
3use proc_macro2::TokenStream as TokenStream2;
4use quote::quote;
5
6pub fn codegen(app: &App, _analysis: &Analysis) -> TokenStream2 {
10 let mut mod_app = vec![];
11
12 for (name, res) in &app.local_resources {
14 let cfgs = &res.cfgs;
15 let ty = &res.ty;
16 let mangled_name = util::static_local_resource_ident(name);
17
18 let attrs = &res.attrs;
19
20 let section = if attrs
23 .iter()
24 .any(|attr| attr.path().is_ident("link_section"))
25 {
26 None
27 } else {
28 Some(util::link_section_uninit())
29 };
30
31 mod_app.push(quote!(
34 #[allow(non_camel_case_types)]
35 #[allow(non_upper_case_globals)]
36 #[doc(hidden)]
38 #(#attrs)*
39 #(#cfgs)*
40 #section
41 static #mangled_name: rtic::RacyCell<core::mem::MaybeUninit<#ty>> = rtic::RacyCell::new(core::mem::MaybeUninit::uninit());
42 ));
43 }
44
45 for (task_name, resource_name, task_local) in app.declared_local_resources() {
47 let cfgs = &task_local.cfgs;
48 let ty = &task_local.ty;
49 let expr = &task_local.expr;
50 let attrs = &task_local.attrs;
51
52 let mangled_name = util::declared_static_local_resource_ident(resource_name, task_name);
53
54 mod_app.push(quote!(
57 #[allow(non_camel_case_types)]
58 #[allow(non_upper_case_globals)]
59 #[doc(hidden)]
61 #(#attrs)*
62 #(#cfgs)*
63 static #mangled_name: rtic::RacyCell<#ty> = rtic::RacyCell::new(#expr);
64 ));
65 }
66
67 quote!(#(#mod_app)*)
68}