mirror of
https://github.com/rtic-rs/rtic.git
synced 2024-11-25 21:19:35 +01:00
compiler plugin -> proc macro
This commit is contained in:
parent
8485a24d36
commit
59afbf02aa
5 changed files with 12 additions and 46 deletions
|
@ -14,4 +14,5 @@ version = "0.2.0"
|
|||
|
||||
[dependencies]
|
||||
cortex-m = "0.3.0"
|
||||
cortex-m-rtfm-macros = { path = "macros" }
|
||||
static-ref = "0.2.0"
|
|
@ -8,4 +8,4 @@ quote = "0.3.15"
|
|||
syn = "0.11.11"
|
||||
|
||||
[lib]
|
||||
plugin = true
|
||||
proc-macro = true
|
||||
|
|
|
@ -1,64 +1,26 @@
|
|||
#![deny(warnings)]
|
||||
#![feature(plugin_registrar)]
|
||||
#![feature(proc_macro_internals)]
|
||||
#![feature(rustc_private)]
|
||||
#![feature(proc_macro)]
|
||||
#![recursion_limit = "128"]
|
||||
|
||||
extern crate proc_macro;
|
||||
#[macro_use]
|
||||
extern crate quote;
|
||||
extern crate rustc_errors;
|
||||
extern crate rustc_plugin;
|
||||
extern crate syn;
|
||||
extern crate syntax as rustc_syntax;
|
||||
|
||||
use proc_macro::TokenStream;
|
||||
use rustc_errors::Handler;
|
||||
use rustc_errors::emitter::ColorConfig;
|
||||
use rustc_plugin::Registry;
|
||||
use rustc_syntax::codemap::{CodeMap, FilePathMapping};
|
||||
use rustc_syntax::ext::base::SyntaxExtension;
|
||||
use rustc_syntax::parse::ParseSess;
|
||||
use rustc_syntax::symbol::Symbol;
|
||||
use rustc_syntax::tokenstream::TokenStream as TokenStream_;
|
||||
use std::rc::Rc;
|
||||
use std::str::FromStr;
|
||||
|
||||
mod check;
|
||||
mod syntax;
|
||||
mod trans;
|
||||
mod util;
|
||||
|
||||
fn expand_rtfm(ts: TokenStream_) -> TokenStream_ {
|
||||
use proc_macro::TokenStream;
|
||||
|
||||
#[proc_macro]
|
||||
pub fn rtfm(ts: TokenStream) -> TokenStream {
|
||||
let input = format!("{}", ts);
|
||||
|
||||
let app = syntax::parse::app(&input);
|
||||
let ceilings = util::compute_ceilings(&app);
|
||||
check::resources(&app.resources, &ceilings);
|
||||
|
||||
let output = format!("{}", trans::app(&app, &ceilings));
|
||||
|
||||
let mapping = FilePathMapping::empty();
|
||||
let codemap = Rc::new(CodeMap::new(mapping));
|
||||
|
||||
let tty_handler = Handler::with_tty_emitter(
|
||||
ColorConfig::Auto,
|
||||
true,
|
||||
false,
|
||||
Some(codemap.clone()),
|
||||
);
|
||||
|
||||
let sess = ParseSess::with_span_handler(tty_handler, codemap.clone());
|
||||
proc_macro::__internal::set_parse_sess(&sess, || {
|
||||
let ts = TokenStream::from_str(&output).unwrap();
|
||||
proc_macro::__internal::token_stream_inner(ts)
|
||||
})
|
||||
}
|
||||
|
||||
#[plugin_registrar]
|
||||
pub fn plugin_registrar(reg: &mut Registry) {
|
||||
reg.register_syntax_extension(
|
||||
Symbol::intern("rtfm"),
|
||||
SyntaxExtension::ProcMacro(Box::new(expand_rtfm)),
|
||||
);
|
||||
format!("{}", trans::app(&app, &ceilings)).parse().unwrap()
|
||||
}
|
||||
|
|
|
@ -100,7 +100,7 @@ fn init(app: &App, main: &mut Vec<Tokens>, root: &mut Vec<Tokens>) {
|
|||
exceptions.push(quote! {
|
||||
let prio_bits = #device::NVIC_PRIO_BITS;
|
||||
let hw = ((1 << prio_bits) - #priority) << (8 - prio_bits);
|
||||
scb.shpr[rtfm::Exception::#name.nr() - 4].write(hw);
|
||||
scb.shpr[#krate::Exception::#name.nr() - 4].write(hw);
|
||||
});
|
||||
}
|
||||
Kind::Interrupt { enabled } => {
|
||||
|
|
|
@ -1,13 +1,16 @@
|
|||
#![feature(asm)]
|
||||
#![feature(const_fn)]
|
||||
#![feature(optin_builtin_traits)]
|
||||
#![feature(proc_macro)]
|
||||
#![no_std]
|
||||
|
||||
extern crate cortex_m;
|
||||
extern crate cortex_m_rtfm_macros;
|
||||
extern crate static_ref;
|
||||
|
||||
use core::cell::UnsafeCell;
|
||||
|
||||
pub use cortex_m_rtfm_macros::rtfm;
|
||||
pub use cortex_m::asm::{bkpt, wfi};
|
||||
pub use cortex_m::interrupt::CriticalSection;
|
||||
pub use cortex_m::interrupt::free as atomic;
|
||||
|
|
Loading…
Reference in a new issue