open Names open C open Obc open Async_backend module AvrBackend : AsyncBackend = struct let qn_append q suffix = { qual = q.qual; name = q.name ^ suffix } (* FIXME(Arduino): don't do a shallow copy *) (* FIXME(Arduino): add a mutex… *) let gen_copy_func cd suffix = let func_name = (cname_of_qn cd.cd_name) ^ "_copy" ^ suffix in (* TODO(Arduino): add const qualifier *) let arg_ty = Cty_ptr (Cty_id (qn_append cd.cd_name suffix)) in let sizeof = Cfun_call ("sizeof", [Cderef (Cvar "src")]) in let memcpy = Cfun_call ("atomic_memcpy", [Cvar "dest"; Cvar "src"; sizeof]) in Cfundef { C.f_name = func_name; f_retty = Cty_void; f_args = [("dest", arg_ty); ("src", arg_ty)]; f_body = { var_decls = []; block_body = [Csexpr memcpy] } } let gen_copy_func_in cd = gen_copy_func cd "_in" let gen_copy_func_out cd = gen_copy_func cd "_out" end