aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen
diff options
context:
space:
mode:
authorGravatar Emil Fresk <emil.fresk@gmail.com> 2023-01-07 14:26:55 +0100
committerGravatar Henrik Tjäder <henrik@tjaders.com> 2023-03-01 00:31:08 +0100
commit76595b7aedd2a14aea8569b75fabe62120f93230 (patch)
tree5b94ff5b348a57347066e97f1bac8dda1d716b80 /macros/src/codegen
parentb054e871d486e8eb35e3c98a73652640238c5e7d (diff)
downloadrtic-76595b7aedd2a14aea8569b75fabe62120f93230.tar.gz
rtic-76595b7aedd2a14aea8569b75fabe62120f93230.tar.zst
rtic-76595b7aedd2a14aea8569b75fabe62120f93230.zip
All codegen is now explicit
Diffstat (limited to 'macros/src/codegen')
-rw-r--r--macros/src/codegen/async_dispatchers.rs4
-rw-r--r--macros/src/codegen/hardware_tasks.rs23
-rw-r--r--macros/src/codegen/idle.rs27
-rw-r--r--macros/src/codegen/init.rs23
-rw-r--r--macros/src/codegen/local_resources.rs13
-rw-r--r--macros/src/codegen/shared_resources.rs16
-rw-r--r--macros/src/codegen/software_tasks.rs23
7 files changed, 43 insertions, 86 deletions
diff --git a/macros/src/codegen/async_dispatchers.rs b/macros/src/codegen/async_dispatchers.rs
index d53d7b5e..62b17fee 100644
--- a/macros/src/codegen/async_dispatchers.rs
+++ b/macros/src/codegen/async_dispatchers.rs
@@ -4,7 +4,7 @@ use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
/// Generates task dispatchers
-pub fn codegen(app: &App, analysis: &Analysis) -> Vec<TokenStream2> {
+pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
let mut items = vec![];
let interrupts = &analysis.interrupts;
@@ -96,5 +96,5 @@ pub fn codegen(app: &App, analysis: &Analysis) -> Vec<TokenStream2> {
));
}
- items
+ quote!(#(#items)*)
}
diff --git a/macros/src/codegen/hardware_tasks.rs b/macros/src/codegen/hardware_tasks.rs
index 9ea5825b..8a5a8f6c 100644
--- a/macros/src/codegen/hardware_tasks.rs
+++ b/macros/src/codegen/hardware_tasks.rs
@@ -7,20 +7,7 @@ use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
/// Generate support code for hardware tasks (`#[exception]`s and `#[interrupt]`s)
-pub fn codegen(
- app: &App,
- analysis: &Analysis,
-) -> (
- // mod_app_hardware_tasks -- interrupt handlers and `${task}Resources` constructors
- Vec<TokenStream2>,
- // root_hardware_tasks -- items that must be placed in the root of the crate:
- // - `${task}Locals` structs
- // - `${task}Resources` structs
- // - `${task}` modules
- Vec<TokenStream2>,
- // user_hardware_tasks -- the `#[task]` functions written by the user
- Vec<TokenStream2>,
-) {
+pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
let mut mod_app = vec![];
let mut root = vec![];
let mut user_tasks = vec![];
@@ -90,5 +77,11 @@ pub fn codegen(
}
}
- (mod_app, root, user_tasks)
+ quote!(
+ #(#mod_app)*
+
+ #(#root)*
+
+ #(#user_tasks)*
+ )
}
diff --git a/macros/src/codegen/idle.rs b/macros/src/codegen/idle.rs
index 1f05d129..0c833ef3 100644
--- a/macros/src/codegen/idle.rs
+++ b/macros/src/codegen/idle.rs
@@ -7,20 +7,7 @@ use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
/// Generates support code for `#[idle]` functions
-pub fn codegen(
- app: &App,
- analysis: &Analysis,
-) -> (
- // mod_app_idle -- the `${idle}Resources` constructor
- Vec<TokenStream2>,
- // root_idle -- items that must be placed in the root of the crate:
- // - the `${idle}Locals` struct
- // - the `${idle}Resources` struct
- // - the `${idle}` module, which contains types like `${idle}::Context`
- Vec<TokenStream2>,
- // user_idle
- Option<TokenStream2>,
-) {
+pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
if let Some(idle) = &app.idle {
let mut mod_app = vec![];
let mut root_idle = vec![];
@@ -58,10 +45,14 @@ pub fn codegen(
}
));
- (mod_app, root_idle, user_idle)
- } else {
- // TODO: No idle defined, check for 0-priority tasks and generate an executor if needed
+ quote!(
+ #(#mod_app)*
+
+ #(#root_idle)*
- (vec![], vec![], None)
+ #user_idle
+ )
+ } else {
+ quote!()
}
}
diff --git a/macros/src/codegen/init.rs b/macros/src/codegen/init.rs
index 3b2bcd47..6e1059f7 100644
--- a/macros/src/codegen/init.rs
+++ b/macros/src/codegen/init.rs
@@ -7,21 +7,8 @@ use crate::{
syntax::{ast::App, Context},
};
-type CodegenResult = (
- // mod_app_idle -- the `${init}Resources` constructor
- Option<TokenStream2>,
- // root_init -- items that must be placed in the root of the crate:
- // - the `${init}Locals` struct
- // - the `${init}Resources` struct
- // - the `${init}LateResources` struct
- // - the `${init}` module, which contains types like `${init}::Context`
- Vec<TokenStream2>,
- // user_init -- the `#[init]` function written by the user
- TokenStream2,
-);
-
/// Generates support code for `#[init]` functions
-pub fn codegen(app: &App, analysis: &Analysis) -> CodegenResult {
+pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
let init = &app.init;
let name = &init.name;
@@ -98,5 +85,11 @@ pub fn codegen(app: &App, analysis: &Analysis) -> CodegenResult {
root_init.push(module::codegen(Context::Init, app, analysis));
- (mod_app, root_init, user_init)
+ quote!(
+ #mod_app
+
+ #(#root_init)*
+
+ #user_init
+ )
}
diff --git a/macros/src/codegen/local_resources.rs b/macros/src/codegen/local_resources.rs
index 6fc63cd9..e6d15533 100644
--- a/macros/src/codegen/local_resources.rs
+++ b/macros/src/codegen/local_resources.rs
@@ -6,17 +6,8 @@ use quote::quote;
/// Generates `local` variables and local resource proxies
///
/// I.e. the `static` variables and theirs proxies.
-pub fn codegen(
- app: &App,
- _analysis: &Analysis,
-) -> (
- // mod_app -- the `static` variables behind the proxies
- Vec<TokenStream2>,
- // mod_resources -- the `resources` module
- TokenStream2,
-) {
+pub fn codegen(app: &App, _analysis: &Analysis) -> TokenStream2 {
let mut mod_app = vec![];
- // let mut mod_resources: _ = vec![];
// All local resources declared in the `#[local]' struct
for (name, res) in &app.local_resources {
@@ -70,5 +61,5 @@ pub fn codegen(
));
}
- (mod_app, TokenStream2::new())
+ quote!(#(#mod_app)*)
}
diff --git a/macros/src/codegen/shared_resources.rs b/macros/src/codegen/shared_resources.rs
index 5c54fb99..19fd13fe 100644
--- a/macros/src/codegen/shared_resources.rs
+++ b/macros/src/codegen/shared_resources.rs
@@ -5,15 +5,7 @@ use quote::quote;
use std::collections::HashMap;
/// Generates `static` variables and shared resource proxies
-pub fn codegen(
- app: &App,
- analysis: &Analysis,
-) -> (
- // mod_app -- the `static` variables behind the proxies
- Vec<TokenStream2>,
- // mod_resources -- the `resources` module
- TokenStream2,
-) {
+pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
let mut mod_app = vec![];
let mut mod_resources = vec![];
@@ -183,5 +175,9 @@ pub fn codegen(
));
}
- (mod_app, mod_resources)
+ quote!(
+ #(#mod_app)*
+
+ #mod_resources
+ )
}
diff --git a/macros/src/codegen/software_tasks.rs b/macros/src/codegen/software_tasks.rs
index 350c1e60..4cb1fa95 100644
--- a/macros/src/codegen/software_tasks.rs
+++ b/macros/src/codegen/software_tasks.rs
@@ -6,20 +6,7 @@ use crate::{
use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
-pub fn codegen(
- app: &App,
- analysis: &Analysis,
-) -> (
- // mod_app_software_tasks -- free queues, buffers and `${task}Resources` constructors
- Vec<TokenStream2>,
- // root_software_tasks -- items that must be placed in the root of the crate:
- // - `${task}Locals` structs
- // - `${task}Resources` structs
- // - `${task}` modules
- Vec<TokenStream2>,
- // user_software_tasks -- the `#[task]` functions written by the user
- Vec<TokenStream2>,
-) {
+pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
let mut mod_app = vec![];
let mut root = vec![];
let mut user_tasks = vec![];
@@ -78,5 +65,11 @@ pub fn codegen(
root.push(module::codegen(Context::SoftwareTask(name), app, analysis));
}
- (mod_app, root, user_tasks)
+ quote!(
+ #(#mod_app)*
+
+ #(#root)*
+
+ #(#user_tasks)*
+ )
}