use proc_macro::TokenStream;
use quote::quote;
use syn::{ItemStatic, parse_macro_input};
#[proc_macro_attribute]
pub fn percore(_attr: TokenStream, item: TokenStream) -> TokenStream {
let static_item = parse_macro_input!(item as ItemStatic);
let attrs = &static_item.attrs;
let vis = &static_item.vis;
let name = &static_item.ident;
let ty = &static_item.ty;
let expr = &static_item.expr;
quote! {
#[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"))]
#[cfg_attr(any(target_os = "macos", target_os = "ios", target_os = "tvos"), unsafe(link_section = "__DATA,__percore"))]
#(#attrs)*
#vis static #name: percore::derive::LinkedPerCore<#ty> = const {
let value = #expr;
unsafe { percore::derive::LinkedPerCore::new(value) }
};
}
.into()
}