From d7847053531c3352db8355e21e54b102958cbb8a Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 12 Jan 2017 03:15:06 -0500 Subject: IR: implement macro for function aliasing function pointer --- src/parseh.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'src/parseh.cpp') diff --git a/src/parseh.cpp b/src/parseh.cpp index b4ad039020..c2546765e4 100644 --- a/src/parseh.cpp +++ b/src/parseh.cpp @@ -5,14 +5,15 @@ * See http://opensource.org/licenses/MIT */ -#include "parseh.hpp" +#include "all_types.hpp" +#include "analyze.hpp" +#include "c_tokenizer.hpp" #include "config.h" -#include "os.hpp" #include "error.hpp" +#include "ir.hpp" +#include "os.hpp" +#include "parseh.hpp" #include "parser.hpp" -#include "all_types.hpp" -#include "c_tokenizer.hpp" -#include "analyze.hpp" #include #include @@ -133,6 +134,13 @@ static void parseh_init_tld(Context *c, Tld *tld, TldId id, Buf *name) { tld->resolution = TldResolutionOk; } +static Tld *create_inline_fn_tld(Context *c, Buf *fn_name, TldVar *tld_var) { + TldFn *tld_fn = allocate(1); + parseh_init_tld(c, &tld_fn->base, TldIdFn, fn_name); + tld_fn->fn_entry = ir_create_inline_fn(c->codegen, fn_name, tld_var->var, &c->import->decls_scope->base); + return &tld_fn->base; +} + static TldVar *create_global_var(Context *c, Buf *name, ConstExprValue *var_value, bool is_const) { auto entry = c->import->decls_scope->decl_table.maybe_get(name); if (entry) { @@ -143,6 +151,7 @@ static TldVar *create_global_var(Context *c, Buf *name, ConstExprValue *var_valu TldVar *tld_var = allocate(1); parseh_init_tld(c, &tld_var->base, TldIdVar, name); tld_var->var = add_variable(c->codegen, c->source_node, &c->import->decls_scope->base, name, is_const, var_value); + c->codegen->global_vars.append(tld_var->var); return tld_var; } @@ -1229,9 +1238,8 @@ static void process_symbol_macros(Context *c) { if (var_type->id == TypeTableEntryIdMaybe && !tld_var->var->src_is_const) { TypeTableEntry *child_type = var_type->data.maybe.child_type; if (child_type->id == TypeTableEntryIdFn) { - zig_panic("TODO macro alias of function pointer in .h file"); - //Tld *fn_tld = create_inline_fn_alias(c, ms.name, tld_var->var); - //c->macro_table.put(ms.name, fn_tld); + Tld *tld = create_inline_fn_tld(c, ms.name, tld_var); + c->macro_table.put(ms.name, tld); continue; } } -- cgit v1.2.3