1#![feature(proc_macro_hygiene)]
11
12extern crate proc_macro;
13
14use target_cpu_fetch as fetch_cpu;
15mod macro_impl;
16
17use proc_macro::*;
18
19#[proc_macro]
21pub fn cpu_name(input: proc_macro::TokenStream) -> TokenStream {
22 ensure_empty_stream(input);
23
24 match fetch_cpu::target_cpu().expect("failed to fetch target CPU name") {
25 Some(cpu_name) => format!("\"{}\"", cpu_name).parse().unwrap(),
26 None => {
27 panic!("target CPU is not available");
28 },
29 }
30}
31
32#[proc_macro]
34pub fn maybe_cpu_name(input: proc_macro::TokenStream) -> TokenStream {
35 ensure_empty_stream(input);
36
37 match fetch_cpu::target_cpu() {
38 Ok(Some(cpu_name)) => format!("Some(\"{}\")", cpu_name).parse().unwrap(),
39 _ => "None".parse().unwrap(),
40 }
41}
42
43#[proc_macro_attribute]
45pub fn cfg_target_cpu_eq(args: TokenStream, input: TokenStream) -> TokenStream {
46 macro_impl::cfg_target_cpu(args, input, macro_impl::Condition::Equal)
47}
48
49#[proc_macro_attribute]
51pub fn cfg_target_cpu_neq(args: TokenStream, input: TokenStream) -> TokenStream {
52 macro_impl::cfg_target_cpu(args, input, macro_impl::Condition::NotEqual)
53}
54
55fn ensure_empty_stream(input: proc_macro::TokenStream) {
56 if !input.is_empty() {
57 panic!("no arguments expected to target CPU name macro");
58 }
59
60}