use link_section::{in_section, section};
#[section]
pub static LINK_SECTION: link_section::Section;
#[in_section(LINK_SECTION)]
pub fn link_section_function() {
println!("link_section_function");
}
#[section]
pub static TYPED_LINK_SECTION: link_section::TypedSection<u32>;
#[in_section(TYPED_LINK_SECTION)]
pub static LINKED_U32: u32 = 1;
#[in_section(TYPED_LINK_SECTION)]
pub static LINKED_U32_2: u32 = 2;
#[section(aux = TYPED_LINK_SECTION)]
pub static AUX_LINK_SECTION: link_section::TypedSection<u32>;
#[in_section(AUX_LINK_SECTION)]
pub static AUX_LINKED_U32: u32 = 3;
#[section]
pub static FN_ARRAY: link_section::TypedSection<fn()>;
#[in_section(FN_ARRAY)]
pub fn linked_function() {
eprintln!("linked_function");
}
#[in_section(FN_ARRAY)]
pub fn linked_function_2() {
eprintln!("linked_function_2");
}
#[in_section(FN_ARRAY)]
pub static OTHER_FN: fn() = link_section_function;
#[section]
pub static DEBUGGABLES: link_section::TypedSection<&'static (dyn ::core::fmt::Debug + Sync)>;
#[in_section(DEBUGGABLES)]
pub static DEBUGGABLE: &'static (dyn ::core::fmt::Debug + Sync) = &1;
#[in_section(DEBUGGABLES)]
pub static DEBUGGABLE_2: &'static (dyn ::core::fmt::Debug + Sync) = &2;
#[in_section(DEBUGGABLES)]
pub static DEBUGGABLE_FUNCTION: fn() = {
fn debuggable_function() {
eprintln!("debuggable_function");
}
&(debuggable_function as fn())
};
pub fn main() {
eprintln!("LINK_SECTION: {:?}", LINK_SECTION);
link_section_function();
eprintln!("TYPED_LINK_SECTION: {:?}", TYPED_LINK_SECTION);
assert!(TYPED_LINK_SECTION.offset_of(&LINKED_U32).is_some());
assert!(TYPED_LINK_SECTION.offset_of(&LINKED_U32_2).is_some());
eprintln!("AUX_LINK_SECTION: {:?}", AUX_LINK_SECTION);
assert!(AUX_LINK_SECTION.len() == 1);
let random_u32 = 1234567890;
assert!(TYPED_LINK_SECTION.offset_of(&random_u32).is_none());
eprintln!("CODE_SECTION: {:?}", FN_ARRAY);
eprintln!("{:?}", FN_ARRAY.as_slice());
for f in FN_ARRAY {
eprintln!("f: {:?}", f);
f();
assert!(FN_ARRAY.offset_of(f).is_some());
}
eprintln!("DEBUGGABLES: {:?}", DEBUGGABLES.as_slice());
}