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 <grfn@gws.fyi>
This commit is contained in:
Griffin Smith 2021-03-19 20:46:19 -04:00 committed by glittershark
parent fec6595d21
commit 2c838ab845
9 changed files with 147 additions and 28 deletions

View file

@ -9,6 +9,7 @@ mod type_;
use crate::ast::{Arg, Decl, Fun, Ident};
pub use expr::expr;
use type_::function_type;
pub use type_::type_;
pub type Error = nom::Err<nom::error::Error<String>>;
@ -79,9 +80,24 @@ named!(arg(&str) -> Arg, alt!(
ascripted_arg
));
named!(extern_decl(&str) -> Decl, do_parse!(
complete!(tag!("extern"))
>> multispace1
>> name: ident
>> multispace0
>> char!(':')
>> multispace0
>> type_: function_type
>> multispace0
>> (Decl::Extern {
name,
type_
})
));
named!(fun_decl(&str) -> Decl, do_parse!(
complete!(tag!("fn"))
>> multispace0
>> multispace1
>> name: ident
>> multispace1
>> args: separated_list0!(multispace1, arg)
@ -112,7 +128,8 @@ named!(ascription_decl(&str) -> Decl, do_parse!(
named!(pub decl(&str) -> Decl, alt!(
ascription_decl |
fun_decl
fun_decl |
extern_decl
));
named!(pub toplevel(&str) -> Vec<Decl>, terminated!(many0!(decl), multispace0));

View file

@ -4,7 +4,7 @@ use nom::{alt, delimited, do_parse, map, named, opt, separated_list0, tag, termi
use super::ident;
use crate::ast::{FunctionType, Type};
named!(function_type(&str) -> Type, do_parse!(
named!(pub function_type(&str) -> FunctionType, do_parse!(
tag!("fn")
>> multispace1
>> args: map!(opt!(terminated!(separated_list0!(
@ -18,10 +18,10 @@ named!(function_type(&str) -> Type, do_parse!(
>> tag!("->")
>> multispace1
>> ret: type_
>> (Type::Function(FunctionType {
>> (FunctionType {
args,
ret: Box::new(ret)
}))
})
));
named!(pub type_(&str) -> Type, alt!(
@ -29,7 +29,7 @@ named!(pub type_(&str) -> Type, alt!(
tag!("float") => { |_| Type::Float } |
tag!("bool") => { |_| Type::Bool } |
tag!("cstring") => { |_| Type::CString } |
function_type |
function_type => { |ft| Type::Function(ft) }|
ident => { |id| Type::Var(id) } |
delimited!(
tuple!(tag!("("), multispace0),