1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, LitStr};
4
5use crate::construct;
6
7pub(crate) fn expand(args: TokenStream) -> TokenStream {
8 let literal = parse_macro_input!(args as LitStr);
9 let sym_name = construct::mangled_symbol_name("prim", &literal.value());
10
11 let prefix = Some("prim");
12 let section = construct::linker_section(false, prefix, &sym_name);
13 let section_for_macos = construct::linker_section(true, prefix, &sym_name);
14
15 let var_addr = if cfg!(feature = "unstable-test") {
16 quote!({ defmt::export::fetch_add_string_index() as u16 })
17 } else {
18 quote!({
19 #[cfg_attr(target_os = "macos", link_section = #section_for_macos)]
20 #[cfg_attr(not(target_os = "macos"), link_section = #section)]
21 #[export_name = #sym_name]
22 static S: u8 = 0;
23 &S as *const u8 as u16
24 })
25 };
26
27 quote!({
28 defmt::export::make_istr(#var_addr)
29 })
30 .into()
31}
32