cortex_m_rtic_macros/codegen/
local_resources.rs
1use proc_macro2::TokenStream as TokenStream2;
2use quote::quote;
3use rtic_syntax::ast::App;
4
5use crate::{analyze::Analysis, check::Extra, codegen::util};
6
7pub fn codegen(
11 app: &App,
12 _analysis: &Analysis,
13 _extra: &Extra,
14) -> (
15 Vec<TokenStream2>,
17 TokenStream2,
19) {
20 let mut mod_app = vec![];
21 for (name, res) in &app.local_resources {
25 let cfgs = &res.cfgs;
26 let ty = &res.ty;
27 let mangled_name = util::static_local_resource_ident(name);
28
29 let attrs = &res.attrs;
30
31 let section = if attrs.iter().any(|attr| attr.path.is_ident("link_section")) {
34 None
35 } else {
36 Some(util::link_section_uninit())
37 };
38
39 mod_app.push(quote!(
42 #[allow(non_camel_case_types)]
43 #[allow(non_upper_case_globals)]
44 #[doc(hidden)]
46 #(#attrs)*
47 #(#cfgs)*
48 #section
49 static #mangled_name: rtic::RacyCell<core::mem::MaybeUninit<#ty>> = rtic::RacyCell::new(core::mem::MaybeUninit::uninit());
50 ));
51 }
52
53 for (task_name, resource_name, task_local) in app.declared_local_resources() {
55 let cfgs = &task_local.cfgs;
56 let ty = &task_local.ty;
57 let expr = &task_local.expr;
58 let attrs = &task_local.attrs;
59
60 let mangled_name = util::declared_static_local_resource_ident(resource_name, task_name);
61
62 mod_app.push(quote!(
65 #[allow(non_camel_case_types)]
66 #[allow(non_upper_case_globals)]
67 #[doc(hidden)]
69 #(#attrs)*
70 #(#cfgs)*
71 static #mangled_name: rtic::RacyCell<#ty> = rtic::RacyCell::new(#expr);
72 ));
73 }
74
75 (mod_app, TokenStream2::new())
76}