From 2c838ab845bc54c5ef6cb0561332c84f34249368 Mon Sep 17 00:00:00 2001 From: Griffin Smith Date: Fri, 19 Mar 2021 20:46:19 -0400 Subject: feat(gs/achilles): Implement extern decls, for glibc functions Implement extern decls, which codegen to LLVM as forward-declared functions, and use these as a hook into calling glibc functions. We can print to the terminal now! The integration tests can test this now. Change-Id: I70af4546b417b888ad9fbb18798db240f77f4e71 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2614 Tested-by: BuildkiteCI Reviewed-by: glittershark --- users/glittershark/achilles/src/ast/hir.rs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'users/glittershark/achilles/src/ast/hir.rs') diff --git a/users/glittershark/achilles/src/ast/hir.rs b/users/glittershark/achilles/src/ast/hir.rs index 6859174a2dd0..0212b3dbcdbb 100644 --- a/users/glittershark/achilles/src/ast/hir.rs +++ b/users/glittershark/achilles/src/ast/hir.rs @@ -219,12 +219,19 @@ pub enum Decl<'a, T> { body: Box>, type_: T, }, + + Extern { + name: Ident<'a>, + arg_types: Vec, + ret_type: T, + }, } impl<'a, T> Decl<'a, T> { - pub fn type_(&self) -> &T { + pub fn type_(&self) -> Option<&T> { match self { - Decl::Fun { type_, .. } => type_, + Decl::Fun { type_, .. } => Some(type_), + Decl::Extern { .. } => None, } } @@ -247,6 +254,15 @@ impl<'a, T> Decl<'a, T> { body: Box::new(body.traverse_type(f.clone())?), type_: f(type_)?, }), + Decl::Extern { + name, + arg_types, + ret_type, + } => Ok(Decl::Extern { + name, + arg_types: arg_types.into_iter().map(f.clone()).try_collect()?, + ret_type: f(ret_type)?, + }), } } } -- cgit 1.4.1