link_boot/
lib.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use syn::parse_quote;
4
5#[proc_macro_attribute]
6pub fn link_boot(_args: TokenStream, input: TokenStream) -> TokenStream {
7    let mut input = syn::parse_macro_input!(input as syn::ItemMod);
8
9    if let Some((_brace, items)) = input.content.as_mut() {
10        for item in items {
11            match item {
12                syn::Item::Fn(v) => {
13                    v.attrs.push(parse_quote! {
14                        #[unsafe(link_section = ".text.boot")]
15                    });
16                }
17                syn::Item::Static(v) => {
18                    v.attrs.push(parse_quote! {
19                        #[unsafe(link_section = ".data.boot")]
20                    });
21                }
22                _ => {}
23            }
24        }
25    }
26
27    quote! {
28      #input
29    }
30    .into()
31}