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:
parent
fec6595d21
commit
2c838ab845
9 changed files with 147 additions and 28 deletions
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue