changeset 592:04ef85a39cf4

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.
author Rob Landley <rob@landley.net>
date Sun, 06 Apr 2008 17:55:44 -0500
parents 18192dd26583
children a283eb90c0f7
files arm/gen.c i386/gen.c tcc.c
diffstat 3 files changed, 48 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- 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)) {
--- 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)) {
--- 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);