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
7/// Generates `local` variables and local resource proxies
8///
9/// I.e. the `static` variables and theirs proxies.
10pub fn codegen(
11    app: &App,
12    _analysis: &Analysis,
13    _extra: &Extra,
14) -> (
15    // mod_app -- the `static` variables behind the proxies
16    Vec<TokenStream2>,
17    // mod_resources -- the `resources` module
18    TokenStream2,
19) {
20    let mut mod_app = vec![];
21    // let mut mod_resources: _ = vec![];
22
23    // All local resources declared in the `#[local]' struct
24    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        // late resources in `util::link_section_uninit`
32        // unless user specifies custom link section
33        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        // For future use
40        // let doc = format!(" RTIC internal: {}:{}", file!(), line!());
41        mod_app.push(quote!(
42            #[allow(non_camel_case_types)]
43            #[allow(non_upper_case_globals)]
44            // #[doc = #doc]
45            #[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    // All declared `local = [NAME: TY = EXPR]` local resources
54    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        // For future use
63        // let doc = format!(" RTIC internal: {}:{}", file!(), line!());
64        mod_app.push(quote!(
65            #[allow(non_camel_case_types)]
66            #[allow(non_upper_case_globals)]
67            // #[doc = #doc]
68            #[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}