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}