1use proc_macro::TokenStream;
6use quote::quote;
7use syn::{ItemStatic, parse_macro_input};
8
9#[proc_macro_attribute]
25pub fn percore(_attr: TokenStream, item: TokenStream) -> TokenStream {
26 let static_item = parse_macro_input!(item as ItemStatic);
27
28 let attrs = &static_item.attrs;
29 let vis = &static_item.vis;
30 let name = &static_item.ident;
31 let ty = &static_item.ty;
32 let expr = &static_item.expr;
33
34 quote! {
35 #[cfg_attr(any(target_os = "none", target_os = "linux", target_os = "android", target_os = "fuchsia", target_os = "psp", target_os = "freebsd", target_os = "openbsd"), unsafe(link_section = "percore"))]
36 #[cfg_attr(any(target_os = "macos", target_os = "ios", target_os = "tvos"), unsafe(link_section = "__DATA,__percore"))]
37 #(#attrs)*
38 #vis static #name: percore::derive::LinkedPerCore<#ty> = const {
39 let value = #expr;
40 unsafe { percore::derive::LinkedPerCore::new(value) }
41 };
42 }
43 .into()
44}