From 58cdad2fba9763ac590bb0460ecd7193014a1e12 Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Fri, 26 Oct 2018 20:39:39 +0200 Subject: entry/exception/interrupt: reduce namespace pollution when using static mut this changes code generation of code like this: ``` rust #[entry] fn main() -> ! { static mut FOO: u32 = 0; // .. } ``` from this: ``` rust fn main() -> ! { static mut FOO_: u32 = 0; let FOO: &'static mut u32 = unsafe { &mut FOO_ }; // .. } ``` to this: ``` rust fn main() -> ! { let FOO: &'static mut u32 = unsafe { static mut FOO: u32 = 0; &mut FOO; }; // .. } ``` this completely hides the `static mut` variable. Before it was possible to (unsafely) access it via `${ident}_` (e.g. `FOO_`). --- cortex-m-rt/macros/src/lib.rs | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-) (limited to 'cortex-m-rt/macros/src') diff --git a/cortex-m-rt/macros/src/lib.rs b/cortex-m-rt/macros/src/lib.rs index 56ec88c..560a05f 100644 --- a/cortex-m-rt/macros/src/lib.rs +++ b/cortex-m-rt/macros/src/lib.rs @@ -114,19 +114,16 @@ pub fn entry(args: TokenStream, input: TokenStream) -> TokenStream { .into_iter() .map(|var| { let ident = var.ident; - // `let` can't shadow a `static mut` so we must give the `static` a different - // name. We'll create a new name by appending an underscore to the original name - // of the `static`. - let mut ident_ = ident.to_string(); - ident_.push('_'); - let ident_ = Ident::new(&ident_, Span::call_site()); let ty = var.ty; let expr = var.expr; quote!( - static mut #ident_: #ty = #expr; #[allow(non_snake_case)] - let #ident: &'static mut #ty = unsafe { &mut #ident_ }; + let #ident: &'static mut #ty = unsafe { + static mut #ident: #ty = #expr; + + &mut #ident + }; ) }).collect::>(); @@ -402,19 +399,16 @@ pub fn exception(args: TokenStream, input: TokenStream) -> TokenStream { .into_iter() .map(|var| { let ident = var.ident; - // `let` can't shadow a `static mut` so we must give the `static` a different - // name. We'll create a new name by appending an underscore to the original name - // of the `static`. - let mut ident_ = ident.to_string(); - ident_.push('_'); - let ident_ = Ident::new(&ident_, Span::call_site()); let ty = var.ty; let expr = var.expr; quote!( - static mut #ident_: #ty = #expr; #[allow(non_snake_case)] - let #ident: &mut #ty = unsafe { &mut #ident_ }; + let #ident: &mut #ty = unsafe { + static mut #ident: #ty = #expr; + + &mut #ident + }; ) }).collect::>(); @@ -546,19 +540,16 @@ pub fn interrupt(args: TokenStream, input: TokenStream) -> TokenStream { .into_iter() .map(|var| { let ident = var.ident; - // `let` can't shadow a `static mut` so we must give the `static` a different - // name. We'll create a new name by appending an underscore to the original name - // of the `static`. - let mut ident_ = ident.to_string(); - ident_.push('_'); - let ident_ = Ident::new(&ident_, Span::call_site()); let ty = var.ty; let expr = var.expr; quote!( - static mut #ident_: #ty = #expr; #[allow(non_snake_case)] - let #ident: &mut #ty = unsafe { &mut #ident_ }; + let #ident: &mut #ty = unsafe { + static mut #ident: #ty = #expr; + + &mut #ident + }; ) }).collect::>(); -- cgit v1.2.3 From 01802586446225d43790e160768dd6bfb07590a4 Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Fri, 26 Oct 2018 20:45:59 +0200 Subject: entry/exception/interrupt: forward `static mut` attributes this is required to implement safe interfaces to things like writable Flash (e.g. EEPROM emulation) which require the `#[link_section]` attribute. --- cortex-m-rt/macros/src/lib.rs | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'cortex-m-rt/macros/src') diff --git a/cortex-m-rt/macros/src/lib.rs b/cortex-m-rt/macros/src/lib.rs index 560a05f..dd89f06 100644 --- a/cortex-m-rt/macros/src/lib.rs +++ b/cortex-m-rt/macros/src/lib.rs @@ -113,6 +113,7 @@ pub fn entry(args: TokenStream, input: TokenStream) -> TokenStream { let vars = statics .into_iter() .map(|var| { + let attrs = var.attrs; let ident = var.ident; let ty = var.ty; let expr = var.expr; @@ -120,6 +121,7 @@ pub fn entry(args: TokenStream, input: TokenStream) -> TokenStream { quote!( #[allow(non_snake_case)] let #ident: &'static mut #ty = unsafe { + #(#attrs)* static mut #ident: #ty = #expr; &mut #ident @@ -398,6 +400,7 @@ pub fn exception(args: TokenStream, input: TokenStream) -> TokenStream { let vars = statics .into_iter() .map(|var| { + let attrs = var.attrs; let ident = var.ident; let ty = var.ty; let expr = var.expr; @@ -405,6 +408,7 @@ pub fn exception(args: TokenStream, input: TokenStream) -> TokenStream { quote!( #[allow(non_snake_case)] let #ident: &mut #ty = unsafe { + #(#attrs)* static mut #ident: #ty = #expr; &mut #ident @@ -539,6 +543,7 @@ pub fn interrupt(args: TokenStream, input: TokenStream) -> TokenStream { let vars = statics .into_iter() .map(|var| { + let attrs = var.attrs; let ident = var.ident; let ty = var.ty; let expr = var.expr; @@ -546,6 +551,7 @@ pub fn interrupt(args: TokenStream, input: TokenStream) -> TokenStream { quote!( #[allow(non_snake_case)] let #ident: &mut #ty = unsafe { + #(#attrs)* static mut #ident: #ty = #expr; &mut #ident -- cgit v1.2.3