# HG changeset patch # User lost # Date 1237746419 0 # Node ID 6ddc861a07d4b652cf35180a576ff6fa1dd6b345 # Parent 12fb4e8d52364fb810e88925e97782ca65997c53 Allow export to import undefined symbols diff -r 12fb4e8d5236 -r 6ddc861a07d4 lwasm/lwasm.h --- a/lwasm/lwasm.h Sun Mar 22 18:01:30 2009 +0000 +++ b/lwasm/lwasm.h Sun Mar 22 18:26:59 2009 +0000 @@ -187,6 +187,9 @@ // allow C-style escapes in fcc, fcs, and fcn directives #define PRAGMA_CESCAPES 4 +// allow "export " to import the symbol +#define PRAGMA_IMPORTUNDEFEXPORT 8 + #ifndef __lwasm_c_seen__ #define __lwasm_E__ extern #else diff -r 12fb4e8d5236 -r 6ddc861a07d4 lwasm/pragma.c --- a/lwasm/pragma.c Sun Mar 22 18:01:30 2009 +0000 +++ b/lwasm/pragma.c Sun Mar 22 18:26:59 2009 +0000 @@ -109,6 +109,14 @@ { as -> pragmas &= ~PRAGMA_CESCAPES; } + else if (!strcasecmp(pragma, "importundefexport")) + { + as -> pragmas |= PRAGMA_IMPORTUNDEFEXPORT; + } + else if (!strcasecmp(pragma, "noimportundefexport")) + { + as -> pragmas &= ~PRAGMA_IMPORTUNDEFEXPORT; + } else { if (error) diff -r 12fb4e8d5236 -r 6ddc861a07d4 lwasm/pseudo.c --- a/lwasm/pseudo.c Sun Mar 22 18:01:30 2009 +0000 +++ b/lwasm/pseudo.c Sun Mar 22 18:26:59 2009 +0000 @@ -1082,6 +1082,17 @@ // the symbol better be defined at this point (pass 2) // local symbols cannot be exported nor can "global" symbols se = lwasm_find_symbol(as, l -> sym, -1); + if (!se && (as -> pragmas & PRAGMA_IMPORTUNDEFEXPORT)) + { + // import the symbol + if (as -> csect) + { + register_error(as, l, 1, "Cannot declare external symbols within a section"); + return; + } + + lwasm_register_symbol(as, l, l -> sym, 0, SYMBOL_EXTERN); + } if (!se) { register_error(as, l, 2, "Exported symbols must be fully defined within a section");