# HG changeset patch # User lost@starbug # Date 1272332684 21600 # Node ID cc154dc614fe698084f3b232639c9c9aef5655a8 # Parent 85b592c8b8f6c74301ecc462270b8ef3a6258a68 Added extdep pseudo back in diff -r 85b592c8b8f6 -r cc154dc614fe lwasm/instab.c --- a/lwasm/instab.c Mon Apr 26 19:31:35 2010 -0600 +++ b/lwasm/instab.c Mon Apr 26 19:44:44 2010 -0600 @@ -261,6 +261,10 @@ #define pseudo_resolve_emod NULL extern EMITFUNC(pseudo_emit_emod); +extern PARSEFUNC(pseudo_parse_extdep); +#define pseudo_resolve_extdep NULL +#define pseudo_emit_extdep NULL + extern PARSEFUNC(pseudo_parse_extern); #define pseudo_resolve_extern NULL #define pseudo_emit_extern NULL @@ -549,6 +553,7 @@ { "external", { -1, -1, -1, -1 }, pseudo_parse_extern, pseudo_resolve_extern, pseudo_emit_extern, lwasm_insn_setsym}, { "import", { -1, -1, -1, -1 }, pseudo_parse_extern, pseudo_resolve_extern, pseudo_emit_extern, lwasm_insn_setsym}, { "export", { -1, -1, -1, -1 }, pseudo_parse_export, pseudo_resolve_export, pseudo_emit_export, lwasm_insn_setsym}, + { "extdep", { -1, -1, -1, -1 }, pseudo_parse_extdep, pseudo_resolve_extdep, pseudo_emit_extdep, lwasm_insn_setsym}, { "rmb", { -1, -1, -1, -1 }, pseudo_parse_rmb, pseudo_resolve_rmb, pseudo_emit_rmb, lwasm_insn_normal}, { "rmd", { -1, -1, -1, -1 }, pseudo_parse_rmd, pseudo_resolve_rmd, pseudo_emit_rmd, lwasm_insn_normal}, diff -r 85b592c8b8f6 -r cc154dc614fe lwasm/section.c --- a/lwasm/section.c Mon Apr 26 19:31:35 2010 -0600 +++ b/lwasm/section.c Mon Apr 26 19:44:44 2010 -0600 @@ -269,3 +269,63 @@ goto again; } } + +PARSEFUNC(pseudo_parse_extdep) +{ + int after = 0; + char *sym = NULL; + importlist_t *e; + + if (as -> output_format != OUTPUT_OBJ) + { + lwasm_register_error(as, l, "EXTDEP only supported for object target"); + return; + } + + if (!as -> csect) + { + lwasm_register_error(as, l, "EXTDEP must be within a section"); + return; + } + + if (l -> sym) + sym = lw_strdup(l -> sym); + + if (l -> sym) + { + skip_operand(p); + } + +again: + if (after || !sym) + { + char *p2; + + after = 1; + for (p2 = *p; *p2 && *p2 != ',' && !isspace(*p2); p2++) + /* do nothing */ ; + + sym = lw_strndup(*p, p2 - *p); + } + if (!sym) + { + lwasm_register_error(as, l, "No symbol for EXTDEP"); + return; + } + + // create a zero-width dependency + { + lw_expr_t e; + e = lw_expr_build(lw_expr_type_int, 0); + lwasm_emitexpr(l, e, 0); + lw_expr_destroy(e); + } + + if (after && **p == ',') + { + (*p)++; + for (; **p && isspace(**p); (*p)++) + /* do nothing */ ; + goto again; + } +}