# HG changeset patch # User William Astle # Date 1362852711 25200 # Node ID 35c051bffbff10b1e54440dde4ba7a9400391f8d # Parent 6f4c4d59666ffcbc12b6eae3fb6256d993e2fa24 Make fill and align do something useful in the object target Now, instead of being ignored, both directives will work on the offset from the start of the section instance in the current file. In a bss or constant section, no code will be emitted regardless of the padding byte specified. Otherwise, code will be emitted as usual. diff -r 6f4c4d59666f -r 35c051bffbff lwasm/pseudo.c --- a/lwasm/pseudo.c Sun Feb 10 19:22:24 2013 -0700 +++ b/lwasm/pseudo.c Sat Mar 09 11:11:51 2013 -0700 @@ -1476,7 +1476,9 @@ { lw_expr_t e; int align = 1; - + lw_expr_t te; + int a; + e = lwasm_fetch_expr(l, 0); if (lw_expr_istype(e, lw_expr_type_int)) @@ -1488,11 +1490,29 @@ return; } } - - if (lw_expr_istype(l -> addr, lw_expr_type_int)) + else { - int a; - a = lw_expr_intval(l -> addr); + return; + } + + + te = lw_expr_copy(l -> addr); + as -> exportcheck = 1; + lwasm_reduce_expr(as, te); + as -> exportcheck = 0; + + if (lw_expr_istype(te, lw_expr_type_int)) + { + a = lw_expr_intval(te); + } + else + { + a = -1; + } + lw_expr_destroy(te); + + if (a >= 0) + { if (a % align == 0) { l -> len = 0; @@ -1508,6 +1528,8 @@ lw_expr_t e; int i; + if (l -> csect && (l -> csect -> flags & (section_flag_bss | section_flag_constant))) + return; e = lwasm_fetch_expr(l, 1); for (i = 0; i < l -> len; i++) { @@ -1551,26 +1573,34 @@ RESOLVEFUNC(pseudo_resolve_fill) { - lw_expr_t e; + lw_expr_t e, te; int align = 1; e = lwasm_fetch_expr(l, 0); - if (lw_expr_istype(e, lw_expr_type_int)) + te = lw_expr_copy(e); + as -> exportcheck = 1; + lwasm_reduce_expr(as, te); + as -> exportcheck = 0; + + if (lw_expr_istype(te, lw_expr_type_int)) { - align = lw_expr_intval(e); - if (align < 1) + align = lw_expr_intval(te); + if (align < 0) { + lw_expr_destroy(te); lwasm_register_error(as, l, "Invalid fill length"); return; } } - - if (lw_expr_istype(l -> addr, lw_expr_type_int)) + else { - l -> len = align; + lw_expr_destroy(te); return; } + lw_expr_destroy(te); + + l -> len = align; } EMITFUNC(pseudo_emit_fill) @@ -1578,6 +1608,10 @@ lw_expr_t e; int i; + /* don't emit anything in bss */ + if (l -> csect && (l -> csect -> flags & (section_flag_bss | section_flag_constant))) + return; + e = lwasm_fetch_expr(l, 1); for (i = 0; i < l -> len; i++) {