# HG changeset patch # User Rob Landley # Date 1207522544 18000 # Node ID 04ef85a39cf4f9a4a1bf5733a51f7714917ae56a # Parent 18192dd2658396fe7621d4915a1e74bbf2c4e601 Rename gsym() and gsym_addr() to gen_resolve_sym() and gen_resolve_sym_addr(), plus fluff out their argument names and add better comments about what they do. diff -r 18192dd26583 -r 04ef85a39cf4 arm/gen.c --- a/arm/gen.c Sun Apr 06 17:30:40 2008 -0500 +++ b/arm/gen.c Sun Apr 06 17:55:44 2008 -0500 @@ -301,25 +301,25 @@ } /* output a symbol and patch all calls to it */ -void gsym_addr(int t, int a) +void gen_resolve_sym_addr(int call_addr, int sym_addr) { unsigned long *x; int lt; - while(t) { - x=(unsigned long *)(cur_text_section->data + t); - t=decbranch(lt=t); - if(a==lt+4) + while(call_addr) { + x=(unsigned long *)(cur_text_section->data + call_addr); + call_addr=decbranch(lt=call_addr); + if(sym_addr==lt+4) *x=0xE1A00000; // nop else { *x &= 0xff000000; - *x |= encbranch(lt,a,1); + *x |= encbranch(lt,sym_addr,1); } } } -void gsym(int t) +void gen_resolve_sym(int call_addr) { - gsym_addr(t, gen_ind); + gen_resolve_sym_addr(call_addr, gen_ind); } #ifdef TCC_ARM_VFP @@ -561,7 +561,7 @@ t = v & 1; gen_multibyte(0xE3A00000|(intr(r)<<12)|t); gen_multibyte(0xEA000000); - gsym(sv->c.ul); + gen_resolve_sym(sv->c.ul); gen_multibyte(0xE3A00000|(intr(r)<<12)|(t^1)); return; } else if (v < VT_CONST) { @@ -1035,7 +1035,7 @@ } } else { t = gjmp(t); - gsym(vtop->c.i); + gen_resolve_sym(vtop->c.i); } } else { if (is_float(vtop->type.t)) { diff -r 18192dd26583 -r 04ef85a39cf4 i386/gen.c --- a/i386/gen.c Sun Apr 06 17:30:40 2008 -0500 +++ b/i386/gen.c Sun Apr 06 17:55:44 2008 -0500 @@ -108,22 +108,25 @@ gen_byte(c >> 24); } -/* output a symbol and patch all calls to it */ -void gsym_addr(int t, int a) +// Resolve all calls to a symbol, patching each to point to a known address. +void gen_resolve_sym_addr(int call_addr, int symbol_addr) { - int n, *ptr; if (!cur_text_section) return; - while (t) { - ptr = (int *)(cur_text_section->data + t); + // Traverse the linked list of calls and patch each one. + while (call_addr) { + int n, *ptr; + + ptr = (int *)(cur_text_section->data + call_addr); n = *ptr; /* next value */ - *ptr = a - t - 4; - t = n; + *ptr = symbol_addr - call_addr - 4; + call_addr = n; } } -void gsym(int t) +// Resolve a symbol at the current location, patching all calls to it. +void gen_resolve_sym(int call_addr) { - gsym_addr(t, gen_ind); + gen_resolve_sym_addr(call_addr, gen_ind); } /* psym is used to put an instruction with a data field which is a @@ -234,7 +237,7 @@ t = v & 1; oad(0xb8 + r, t); /* mov $1, r */ gen_multibyte(0x05eb); /* jmp after */ - gsym(fc); + gen_resolve_sym(fc); oad(0xb8 + r, t ^ 1); /* mov $0, r */ } else if (v != r) { gen_byte(0x89); @@ -559,7 +562,8 @@ v = vtop->r & VT_VALMASK; if (v == VT_CMP) { - /* fast case : can jump directly since flags are set */ + /* fast case : the top of the value stack is still in a register, + and the comparison flag is set, so we can jump directly */ gen_byte(0x0f); t = psym((vtop->c.i - 16) ^ inv, t); } else if (v == VT_JMP || v == VT_JMPI) { @@ -573,7 +577,7 @@ t = vtop->c.i; } else { t = gjmp(t); - gsym(vtop->c.i); + gen_resolve_sym(vtop->c.i); } } else { if (is_float(vtop->type.t) || is_llong(vtop->type.t)) { diff -r 18192dd26583 -r 04ef85a39cf4 tcc.c --- a/tcc.c Sun Apr 06 17:30:40 2008 -0500 +++ b/tcc.c Sun Apr 06 17:55:44 2008 -0500 @@ -4142,7 +4142,7 @@ #endif if (v == VT_JMP || v == VT_JMPI) { /* need to put correct jump if && or || without test */ - gsym(vtop->c.ul); + gen_resolve_sym(vtop->c.ul); } vtop--; } @@ -4410,7 +4410,7 @@ op1 = TOK_UGE; gen_op(op1); a = gtst(1, a); - gsym(b); + gen_resolve_sym(b); vseti(VT_JMPI, a); break; } @@ -6932,7 +6932,7 @@ vtop--; /* no vpop so that FP stack is not flushed */ skip(':'); u = gjmp(0); - gsym(tt); + gen_resolve_sym(tt); expr_eq(); type2 = vtop->type; @@ -6994,7 +6994,7 @@ /* this is horrible, but we must also convert first operand */ tt = gjmp(0); - gsym(u); + gen_resolve_sym(u); /* put again first value and cast it */ *vtop = sv; gen_cast(&type); @@ -7003,7 +7003,7 @@ r1 = gv(rc); move_reg(r2, r1); vtop->r = r2; - gsym(tt); + gen_resolve_sym(tt); } } } @@ -7118,11 +7118,11 @@ if (tok == TOK_ELSE) { next(); d = gjmp(0); - gsym(a); + gen_resolve_sym(a); block(bsym, csym, case_sym, def_sym, case_reg, 0); - gsym(d); /* patch else jmp */ + gen_resolve_sym(d); /* patch else jmp */ } else - gsym(a); + gen_resolve_sym(a); } else if (tok == TOK_WHILE) { next(); d = gen_ind; @@ -7133,8 +7133,8 @@ b = 0; block(&a, &b, case_sym, def_sym, case_reg, 0); gjmp_addr(d); - gsym(a); - gsym_addr(b, d); + gen_resolve_sym(a); + gen_resolve_sym_addr(b, d); } else if (tok == '{') { Sym *llabel; @@ -7255,13 +7255,13 @@ gexpr(); vpop(); gjmp_addr(d); - gsym(e); + gen_resolve_sym(e); } skip(')'); block(&a, &b, case_sym, def_sym, case_reg, 0); gjmp_addr(c); - gsym(a); - gsym_addr(b, c); + gen_resolve_sym(a); + gen_resolve_sym_addr(b, c); } else if (tok == TOK_DO) { next(); @@ -7270,12 +7270,12 @@ block(&a, &b, case_sym, def_sym, case_reg, 0); skip(TOK_WHILE); skip('('); - gsym(b); + gen_resolve_sym(b); gexpr(); c = gtst(0, 0); - gsym_addr(c, d); + gen_resolve_sym_addr(c, d); skip(')'); - gsym(a); + gen_resolve_sym(a); skip(';'); } else if (tok == TOK_SWITCH) { @@ -7294,9 +7294,9 @@ if (c == 0) c = gen_ind; /* default label */ - gsym_addr(b, c); + gen_resolve_sym_addr(b, c); /* break label */ - gsym(a); + gen_resolve_sym(a); } else if (tok == TOK_CASE) { int v1, v2; @@ -7314,7 +7314,7 @@ if (v2 < v1) warning("empty case range"); } - gsym(*case_sym); + gen_resolve_sym(*case_sym); vseti(case_reg, 0); vpushi(v1); if (v1 == v2) { @@ -7333,7 +7333,7 @@ goto next_case; } *case_sym = gtst(1, *case_sym); - gsym(b); + gen_resolve_sym(b); is_expr = 0; goto block_after_label; } else @@ -7386,7 +7386,7 @@ if (s) { if (s->r == LABEL_DEFINED) error("duplicate label '%s'", get_tok_str(s->token, NULL)); - gsym((long)s->next); + gen_resolve_sym((long)s->next); s->r = LABEL_DEFINED; } else { s = label_push(&global_label_stack, b, LABEL_DEFINED); @@ -8142,7 +8142,7 @@ gfunc_prolog(&sym->type); rsym = 0; block(NULL, NULL, NULL, NULL, 0, 0); - gsym(rsym); + gen_resolve_sym(rsym); gfunc_epilog(); cur_text_section->data_offset = gen_ind; label_pop(&global_label_stack, NULL);