Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
b934ac2
main.rs first step -> input file to output ptx
StoeckOverflow Feb 27, 2025
7bd9c00
new compile function, updated testcases to new compile function, adde…
StoeckOverflow Feb 27, 2025
4faa227
removed comments
StoeckOverflow Mar 6, 2025
c0986ca
removed print statements and added bin entry to toml
StoeckOverflow Mar 6, 2025
e983c34
added error msg for not missing clang and nvcc
StoeckOverflow Mar 20, 2025
5e08465
new cli design
StoeckOverflow Mar 21, 2025
060b505
restructured the cli
StoeckOverflow Mar 25, 2025
0f7cd44
format everything nicely
StoeckOverflow Mar 26, 2025
f345208
remove compile function output path argument
StoeckOverflow Apr 15, 2025
00b231d
refined logging and output saving logic of the cli
StoeckOverflow Apr 15, 2025
08c37f4
refined error handling
StoeckOverflow Apr 15, 2025
74763cc
missing newline
StoeckOverflow Apr 15, 2025
16032dd
removed anyhow dependency
StoeckOverflow Apr 15, 2025
8ea0882
changed test output source stderr
StoeckOverflow Apr 15, 2025
9c3e639
WIP: integrating arena in ast
StoeckOverflow May 21, 2025
bf6e6d4
add lib.rs
StoeckOverflow May 28, 2025
122677a
updates
StoeckOverflow May 28, 2025
9f56d08
updates
StoeckOverflow Jun 3, 2025
984e5d3
span_derive macro now works with lifetime generics
StoeckOverflow Jun 3, 2025
02fe1ea
fixed last ast errors
StoeckOverflow Jun 3, 2025
a804ada
fixed vist_mut.rs
StoeckOverflow Jun 10, 2025
c8d28f7
progress
StoeckOverflow Jun 10, 2025
1600e8a
refined Hash Ownership in utils
StoeckOverflow Jun 11, 2025
ac91827
correct profile file uploaded
StoeckOverflow Jun 11, 2025
5c74fd0
partial parser integration of arena
StoeckOverflow Jun 17, 2025
55f6d5d
change the complete parser stuff again
StoeckOverflow Jul 1, 2025
785bf36
allocator stuff
StoeckOverflow Jul 16, 2025
00f8541
some fixes regarding the into_arena methods in the heap allocated ast…
StoeckOverflow Jul 16, 2025
1fe53d7
fixed test errors in parser
StoeckOverflow Jul 16, 2025
15a580d
fixed some bugs in the parse function
StoeckOverflow Jul 16, 2025
dbc50bc
librs changes
StoeckOverflow Jul 23, 2025
708a250
some syntax changes to type checking
StoeckOverflow Jul 23, 2025
0484edc
codegen simple changes to integrate lifetimes
StoeckOverflow Jul 24, 2025
b22763d
some more simple lifetime integration stuff for ty check
StoeckOverflow Jul 24, 2025
271d176
adding more lifetimes in ty check
StoeckOverflow Jul 24, 2025
0fd8d5c
worked on the ctxts for ty_check
StoeckOverflow Aug 5, 2025
87e2594
Borrow Checking done
StoeckOverflow Aug 8, 2025
a4ff0f8
did some work in the type checker
StoeckOverflow Aug 8, 2025
f476c02
changes in the ast implementation
StoeckOverflow Aug 11, 2025
6ee8c18
fixed Nat into arena method
StoeckOverflow Aug 11, 2025
6f12d0c
Some work in the visitor
StoeckOverflow Aug 11, 2025
83e3c9f
last updates for today
StoeckOverflow Aug 11, 2025
5c5002b
visitor update
StoeckOverflow Aug 12, 2025
a3eb9d6
repaired visitor implementation
StoeckOverflow Aug 12, 2025
d6af866
fixed lifetime problems in the arena ast parser
StoeckOverflow Aug 12, 2025
733cf23
fixed subtyping
StoeckOverflow Aug 12, 2025
1b60d76
fixed infer_kinded_args
StoeckOverflow Aug 12, 2025
154b471
fixed pre_decls.rs
StoeckOverflow Aug 14, 2025
68023ea
some small fixes
StoeckOverflow Aug 14, 2025
653da49
some work one unify.rs
StoeckOverflow Aug 14, 2025
575e724
current state of unify implementation
StoeckOverflow Aug 14, 2025
fa537b7
unify and pl_expr arena allocation, added utility methods to arena ast
StoeckOverflow Aug 15, 2025
d7411d5
some work on unify.rs
StoeckOverflow Aug 18, 2025
4752057
updated unify tests
StoeckOverflow Aug 19, 2025
2dde471
fixed error in exec
StoeckOverflow Aug 19, 2025
48bcfbf
worked on pl_expr.rs in type checking, added some arena methods, fixe…
StoeckOverflow Aug 19, 2025
f0361df
some updates
StoeckOverflow Jan 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 32 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,46 @@ edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[profile.samply]
inherits = "release"
debug = true

[[bin]]
name = "descendc"
path = "src/main.rs"

[dependencies.peg]
version = "0.8.0"

[dependencies.bumpalo]
version="3.17.0"
features=["collections", "boxed"]

[dependencies.annotate-snippets]
version = "0.9.0"
features = ["color"]

[dependencies.descend_derive]
path = "./descend_derive"

[dependencies.clap]
version = "4.3"
features = ["derive"]

[dependencies.which]
version = "7.0.2"

[dependencies.log]
version = "0.4.27"

[dependencies.env_logger]
version = "0.11.7"

[dependencies.predicates]
version= "3.1.3"

[dependencies.assert_cmd]
version = "2.0.16"

[workspace]
members = ["descend_derive"]
members = ["descend_derive"]
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ codegen

cuda-examples/
---------------------
* Contains handwritte or generated CUDA programs
* Contains handwritten or generated CUDA programs
* Contains `descend.cuh`; the header file which is required in order to compile Descend programs,
that were translated to CUDA, with `nvcc` (contains for example the implementation of `exec`)

Expand Down
152 changes: 150 additions & 2 deletions descend_derive/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,161 @@
use std::collections::HashSet;

use proc_macro::TokenStream;
use quote::quote;
use std::collections::HashSet;
use syn::{
parse::{Parse, ParseStream},
parse_macro_input,
punctuated::Punctuated,
Fields, FieldsNamed, Ident, ItemStruct, Token, Type, TypeReference,
};

struct Args {
vars: HashSet<Ident>,
}

impl Parse for Args {
fn parse(input: ParseStream) -> syn::parse::Result<Self> {
let vars = Punctuated::<Ident, Token![,]>::parse_terminated(input)?;
Ok(Args {
vars: vars.into_iter().collect(),
})
}
}

const IGNORE_ATTR_NAME: &str = "span_derive_ignore";

#[proc_macro_attribute]
pub fn span_derive(attr: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as ItemStruct);
let args = parse_macro_input!(attr as Args);
if args.vars.is_empty() {
panic!("Need at least one attribute in span_derive!");
}

let original_name = &input.ident;
let original_generics = input.generics.clone();
let (impl_generics, ty_generics, where_clause) = original_generics.split_for_impl();

let original_fields = match &input.fields {
syn::Fields::Named(fields) => fields,
_ => unreachable!(),
};

let mut new_fields = original_fields.clone();
for field in new_fields.named.iter_mut() {
field
.attrs
.retain(|attr| !attr.path.is_ident(IGNORE_ATTR_NAME));
}

let mut original = input.clone();
original.fields = Fields::Named(new_fields);

let mut helper = input.clone();

let mut helper_generics = original_generics.clone();
let mut new_params = Punctuated::new();
new_params.push(syn::parse_quote!('helper));
for param in original_generics.params.iter() {
new_params.push(param.clone());
}
helper_generics.params = new_params;
helper.generics = helper_generics.clone();

let mut helper_fields = FieldsNamed {
brace_token: original_fields.brace_token.clone(),
named: Punctuated::new(),
};
for mut field in original_fields.named.clone().into_iter() {
if field
.attrs
.iter()
.any(|attr| attr.path.is_ident(IGNORE_ATTR_NAME))
{
continue;
}
let mut typ: TypeReference = syn::parse_str("&'helper i64").unwrap();
typ.elem = Box::new(field.ty);
field.ty = Type::Reference(typ);
helper_fields.named.push(field);
}
helper.fields = Fields::Named(helper_fields);

let helper_name = Ident::new(
&format!("__{}SpanHelper", original_name.to_string()),
input.ident.span(),
);
helper.ident = helper_name.clone();
helper.attrs.clear();

let into_fields = helper
.fields
.iter()
.map(|field| field.ident.as_ref().unwrap().clone())
.collect::<Vec<_>>();

let mut derive_args: Vec<_> = args.vars.iter().collect();
derive_args.sort_by(|a, b| a.to_string().cmp(&b.to_string()));

let (helper_impl_generics, helper_ty_generics, helper_where_clause) =
helper_generics.split_for_impl();

let mut output = quote! {
#original

#[derive(#(#derive_args),*)]
#helper

impl #helper_impl_generics From<&'helper #original_name #ty_generics>
for #helper_name #helper_ty_generics #helper_where_clause {
fn from(orig: &'helper #original_name #ty_generics) -> Self {
#helper_name {
#(#into_fields: &orig.#into_fields),*
}
}
}
};

for derive_arg in args.vars.iter() {
match &derive_arg.to_string() as &str {
"PartialEq" => {
output.extend(quote! {
impl #impl_generics ::core::cmp::PartialEq for #original_name #ty_generics #where_clause {
fn eq(&self, other: &Self) -> bool {
let helper = #helper_name::from(self);
let helper_other = #helper_name::from(other);
helper == helper_other
}
}
});
}
"Eq" => {
output.extend(quote! {
impl #impl_generics ::core::cmp::Eq for #original_name #ty_generics #where_clause {}
});
}
"Hash" => {
output.extend(quote! {
impl #impl_generics ::core::hash::Hash for #original_name #ty_generics #where_clause {
fn hash<H: ::core::hash::Hasher>(&self, state: &mut H) {
let helper = #helper_name::from(self);
helper.hash(state);
}
}
});
}
other => panic!("span_derive not implemented for {}", other),
}
}

eprintln!(
"--- Generated code ---\n{}\n------------------------",
output
);

TokenStream::from(output)
}

/*** OLD WAY
// Copy paste from syn example
struct Args {
vars: HashSet<Ident>,
Expand Down Expand Up @@ -148,3 +295,4 @@ pub fn span_derive(attr: TokenStream, input: TokenStream) -> TokenStream {

TokenStream::from(output)
}
*/
Binary file added profile.json.gz
Binary file not shown.
6 changes: 6 additions & 0 deletions profile_memory.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/bin/bash
INPUT="examples/infer/matmul.desc"

cargo build --profile samply

samply record -- ./target/samply/descendc emit "$INPUT"
Loading