]> granicus.if.org Git - yasm/commitdiff
Make resolve_label() take a symrec * instead of a section * and bytecode *.
authorPeter Johnson <peter@tortall.net>
Wed, 9 Jan 2002 07:23:00 +0000 (07:23 -0000)
committerPeter Johnson <peter@tortall.net>
Wed, 9 Jan 2002 07:23:00 +0000 (07:23 -0000)
Extend expr_expand_equ() into expr_expand_labelequ() and call resolve_label()
here.

svn path=/trunk/yasm/; revision=440

16 files changed:
libyasm/arch.h
libyasm/bytecode.c
libyasm/bytecode.h
libyasm/expr.c
libyasm/expr.h
modules/arch/x86/x86-int.h
modules/arch/x86/x86bc.c
modules/optimizers/basic/basic-optimizer.c
src/arch.h
src/arch/x86/x86-int.h
src/arch/x86/x86bc.c
src/bytecode.c
src/bytecode.h
src/expr.c
src/expr.h
src/optimizers/basic/basic-optimizer.c

index 48f04aadb1b2bfd1688975b4e049f5c4e423e9db..408f44ea8accc8d65d7f09f7d3825cabf44b7e6e 100644 (file)
@@ -41,8 +41,7 @@ struct arch {
 
        /* See bytecode.h comments on bc_calc_len() */
        unsigned long (*bc_calc_len) (bytecode *bc, /*@only@*/ /*@null@*/
-                                     intnum *(*resolve_label) (section *sect,
-                                         /*@null@*/ bytecode *bc));
+                                     intnum *(*resolve_label) (symrec *sym));
     } bc;
 };
 
index 225966caf2703e0ab2fde1ae93f0104e14f61dd6..bed8f7d9668d3d7bf27cc730cb270583d6c9b0f0 100644 (file)
@@ -308,8 +308,7 @@ bc_print(FILE *f, const bytecode *bc)
 }
 
 unsigned long
-bc_calc_len(bytecode *bc,
-           intnum *(*resolve_label) (section *sect, /*@null@*/ bytecode *bc))
+bc_calc_len(bytecode *bc, intnum *(*resolve_label) (symrec *sym))
 {
     switch (bc->type) {
        case BC_EMPTY:
index 3cb06718db4b43e68413f97b4f6c1df6be578230..1242114249284482434116a292e3283645eac030 100644 (file)
@@ -64,8 +64,7 @@ void bc_print(FILE *f, const bytecode *bc);
  *  in-file label (eg, not an EXTERN variable, which is indeterminate).
  */
 unsigned long bc_calc_len(bytecode *bc, /*@only@*/ /*@null@*/
-                         intnum *(*resolve_label) (section *sect,
-                                                   /*@null@*/ bytecode *bc));
+                         intnum *(*resolve_label) (symrec *sym));
 
 /* void bcs_initialize(bytecodehead *headp); */
 #define        bcs_initialize(headp)   STAILQ_INIT(headp)
index be0ab2e4df2083ed71e0426490a95aa9c8ec23f2..ea206ad119e1cc5ceaa08e135949972ca8b1f91f 100644 (file)
@@ -716,24 +716,37 @@ expr_contains(expr *e, ExprType t)
     return expr_traverse_leaves_in(e, &t, expr_contains_callback);
 }
 
+/* NOTE: This can't be passed through *d because of data/function pointer
+ * portability issues.
+ */
+static intnum *(*labelequ_resolve_label) (symrec *sym);
+
 static int
-expr_expand_equ_callback(ExprItem *ei, /*@unused@*/ void *d)
+expr_expand_labelequ_callback(ExprItem *ei, /*@unused@*/ void *d)
 {
     const expr *equ_expr;
+    intnum *intn;
     if (ei->type == EXPR_SYM) {
        equ_expr = symrec_get_equ(ei->data.sym);
        if (equ_expr) {
            ei->type = EXPR_EXPR;
            ei->data.expn = expr_copy(equ_expr);
+       } else {
+           intn = labelequ_resolve_label(ei->data.sym);
+           if (intn) {
+               ei->type = EXPR_INT;
+               ei->data.intn = intn;
+           }
        }
     }
     return 0;
 }
 
 void
-expr_expand_equ(expr *e)
+expr_expand_labelequ(expr *e, intnum *(*resolve_label) (symrec *sym))
 {
-    expr_traverse_leaves_in(e, NULL, expr_expand_equ_callback);
+    labelequ_resolve_label = resolve_label;
+    expr_traverse_leaves_in(e, NULL, expr_expand_labelequ_callback);
 }
 
 /* Traverse over expression tree, calling func for each operation AFTER the
index 4f7ee9bfd151272fe20c8d9153b8655a09eb0f6a..b8a696aef5074d98511e1a7c6ba77b7622ed0f02 100644 (file)
@@ -46,9 +46,9 @@ typedef struct ExprItem ExprItem;
 void expr_delete(/*@only@*/ /*@null@*/ expr *e);
 
 /* Expands all (symrec) equ's in the expression into full expression
- * instances.
+ * instances.  Also resolves labels, if possible.
  */
-void expr_expand_equ(expr *e);
+void expr_expand_labelequ(expr *e, intnum *(*resolve_label) (symrec *sym));
 
 /* Simplifies the expression e as much as possible, eliminating extraneous
  * branches and simplifying integer-only subexpressions.
index f8d79ed50afdfe23ddc523ce9e51c87d6a204ebe..262e7673e772c1f87a3049b758ebe34206026a04 100644 (file)
@@ -97,8 +97,7 @@ typedef struct x86_jmprel {
 void x86_bc_delete(bytecode *bc);
 void x86_bc_print(FILE *f, const bytecode *bc);
 unsigned long x86_bc_calc_len(bytecode *bc, /*@only@*/ /*@null@*/
-                             intnum *(*resolve_label) (section *sect,
-                                 /*@null@*/ bytecode *bc));
+                             intnum *(*resolve_label) (symrec *sym));
 
 int x86_expr_checkea(expr **ep, unsigned char *addrsize, unsigned char bits,
                     unsigned char nosplit, unsigned char *displen,
index 2f1602da6683b4f828463fdaafd2576a6607632f..76b661191a1cebe97d6bd1580d031f66240ab94b 100644 (file)
@@ -462,8 +462,7 @@ x86_bc_print(FILE *f, const bytecode *bc)
 
 static unsigned long
 x86_bc_calc_len_insn(x86_insn *insn, /*@only@*/ /*@null@*/
-                    intnum *(*resolve_label) (section *sect,
-                                              /*@null@*/ bytecode *bc))
+                    intnum *(*resolve_label) (symrec *sym))
 {
     effaddr *ea = insn->ea;
     x86_effaddr_data *ead = ea_get_data(ea);
@@ -473,7 +472,7 @@ x86_bc_calc_len_insn(x86_insn *insn, /*@only@*/ /*@null@*/
        if ((ea->disp) && ((!ead->valid_sib && ead->need_sib) ||
                           (!ead->valid_modrm && ead->need_modrm))) {
            /* First expand equ's */
-           expr_expand_equ(ea->disp);
+           expr_expand_labelequ(ea->disp, resolve_label);
 
            /* Check validity of effective address and calc R/M bits of
             * Mod/RM byte and SIB byte.  We won't know the Mod field
@@ -492,7 +491,7 @@ x86_bc_calc_len_insn(x86_insn *insn, /*@only@*/ /*@null@*/
        const intnum *num;
 
        if (imm->val) {
-           expr_expand_equ(imm->val);
+           expr_expand_labelequ(imm->val, resolve_label);
            imm->val = expr_simplify(imm->val);
        }
        /* TODO: check imm f_len vs. len? */
@@ -520,8 +519,7 @@ x86_bc_calc_len_insn(x86_insn *insn, /*@only@*/ /*@null@*/
 
 unsigned long
 x86_bc_calc_len(bytecode *bc,
-               intnum *(*resolve_label) (section *sect,
-                                         /*@null@*/ bytecode *bc))
+               intnum *(*resolve_label) (symrec *sym))
 {
     x86_insn *insn;
 
index 8a14b1f43963c8cc8e5899dbeb1e43532cb0f812..65ec69124fb9fa48a497a9ed748c00a48941dd37 100644 (file)
@@ -22,6 +22,8 @@
 #include "util.h"
 RCSID("$IdPath$");
 
+#include "symrec.h"
+
 #include "bytecode.h"
 #include "section.h"
 
@@ -39,11 +41,11 @@ RCSID("$IdPath$");
 #define BCFLAG_DONE            (1<<1)
 
 static /*@only@*/ /*@null@*/ intnum *
-basic_optimize_resolve_label(section *sect, bytecode *bc)
+basic_optimize_resolve_label(symrec *sym)
 {
     unsigned long flags;
 
-    flags = section_get_opt_flags(sect);
+    flags = symrec_get_opt_flags(sym);
 
     return NULL;
 }
index 48f04aadb1b2bfd1688975b4e049f5c4e423e9db..408f44ea8accc8d65d7f09f7d3825cabf44b7e6e 100644 (file)
@@ -41,8 +41,7 @@ struct arch {
 
        /* See bytecode.h comments on bc_calc_len() */
        unsigned long (*bc_calc_len) (bytecode *bc, /*@only@*/ /*@null@*/
-                                     intnum *(*resolve_label) (section *sect,
-                                         /*@null@*/ bytecode *bc));
+                                     intnum *(*resolve_label) (symrec *sym));
     } bc;
 };
 
index f8d79ed50afdfe23ddc523ce9e51c87d6a204ebe..262e7673e772c1f87a3049b758ebe34206026a04 100644 (file)
@@ -97,8 +97,7 @@ typedef struct x86_jmprel {
 void x86_bc_delete(bytecode *bc);
 void x86_bc_print(FILE *f, const bytecode *bc);
 unsigned long x86_bc_calc_len(bytecode *bc, /*@only@*/ /*@null@*/
-                             intnum *(*resolve_label) (section *sect,
-                                 /*@null@*/ bytecode *bc));
+                             intnum *(*resolve_label) (symrec *sym));
 
 int x86_expr_checkea(expr **ep, unsigned char *addrsize, unsigned char bits,
                     unsigned char nosplit, unsigned char *displen,
index 2f1602da6683b4f828463fdaafd2576a6607632f..76b661191a1cebe97d6bd1580d031f66240ab94b 100644 (file)
@@ -462,8 +462,7 @@ x86_bc_print(FILE *f, const bytecode *bc)
 
 static unsigned long
 x86_bc_calc_len_insn(x86_insn *insn, /*@only@*/ /*@null@*/
-                    intnum *(*resolve_label) (section *sect,
-                                              /*@null@*/ bytecode *bc))
+                    intnum *(*resolve_label) (symrec *sym))
 {
     effaddr *ea = insn->ea;
     x86_effaddr_data *ead = ea_get_data(ea);
@@ -473,7 +472,7 @@ x86_bc_calc_len_insn(x86_insn *insn, /*@only@*/ /*@null@*/
        if ((ea->disp) && ((!ead->valid_sib && ead->need_sib) ||
                           (!ead->valid_modrm && ead->need_modrm))) {
            /* First expand equ's */
-           expr_expand_equ(ea->disp);
+           expr_expand_labelequ(ea->disp, resolve_label);
 
            /* Check validity of effective address and calc R/M bits of
             * Mod/RM byte and SIB byte.  We won't know the Mod field
@@ -492,7 +491,7 @@ x86_bc_calc_len_insn(x86_insn *insn, /*@only@*/ /*@null@*/
        const intnum *num;
 
        if (imm->val) {
-           expr_expand_equ(imm->val);
+           expr_expand_labelequ(imm->val, resolve_label);
            imm->val = expr_simplify(imm->val);
        }
        /* TODO: check imm f_len vs. len? */
@@ -520,8 +519,7 @@ x86_bc_calc_len_insn(x86_insn *insn, /*@only@*/ /*@null@*/
 
 unsigned long
 x86_bc_calc_len(bytecode *bc,
-               intnum *(*resolve_label) (section *sect,
-                                         /*@null@*/ bytecode *bc))
+               intnum *(*resolve_label) (symrec *sym))
 {
     x86_insn *insn;
 
index 225966caf2703e0ab2fde1ae93f0104e14f61dd6..bed8f7d9668d3d7bf27cc730cb270583d6c9b0f0 100644 (file)
@@ -308,8 +308,7 @@ bc_print(FILE *f, const bytecode *bc)
 }
 
 unsigned long
-bc_calc_len(bytecode *bc,
-           intnum *(*resolve_label) (section *sect, /*@null@*/ bytecode *bc))
+bc_calc_len(bytecode *bc, intnum *(*resolve_label) (symrec *sym))
 {
     switch (bc->type) {
        case BC_EMPTY:
index 3cb06718db4b43e68413f97b4f6c1df6be578230..1242114249284482434116a292e3283645eac030 100644 (file)
@@ -64,8 +64,7 @@ void bc_print(FILE *f, const bytecode *bc);
  *  in-file label (eg, not an EXTERN variable, which is indeterminate).
  */
 unsigned long bc_calc_len(bytecode *bc, /*@only@*/ /*@null@*/
-                         intnum *(*resolve_label) (section *sect,
-                                                   /*@null@*/ bytecode *bc));
+                         intnum *(*resolve_label) (symrec *sym));
 
 /* void bcs_initialize(bytecodehead *headp); */
 #define        bcs_initialize(headp)   STAILQ_INIT(headp)
index be0ab2e4df2083ed71e0426490a95aa9c8ec23f2..ea206ad119e1cc5ceaa08e135949972ca8b1f91f 100644 (file)
@@ -716,24 +716,37 @@ expr_contains(expr *e, ExprType t)
     return expr_traverse_leaves_in(e, &t, expr_contains_callback);
 }
 
+/* NOTE: This can't be passed through *d because of data/function pointer
+ * portability issues.
+ */
+static intnum *(*labelequ_resolve_label) (symrec *sym);
+
 static int
-expr_expand_equ_callback(ExprItem *ei, /*@unused@*/ void *d)
+expr_expand_labelequ_callback(ExprItem *ei, /*@unused@*/ void *d)
 {
     const expr *equ_expr;
+    intnum *intn;
     if (ei->type == EXPR_SYM) {
        equ_expr = symrec_get_equ(ei->data.sym);
        if (equ_expr) {
            ei->type = EXPR_EXPR;
            ei->data.expn = expr_copy(equ_expr);
+       } else {
+           intn = labelequ_resolve_label(ei->data.sym);
+           if (intn) {
+               ei->type = EXPR_INT;
+               ei->data.intn = intn;
+           }
        }
     }
     return 0;
 }
 
 void
-expr_expand_equ(expr *e)
+expr_expand_labelequ(expr *e, intnum *(*resolve_label) (symrec *sym))
 {
-    expr_traverse_leaves_in(e, NULL, expr_expand_equ_callback);
+    labelequ_resolve_label = resolve_label;
+    expr_traverse_leaves_in(e, NULL, expr_expand_labelequ_callback);
 }
 
 /* Traverse over expression tree, calling func for each operation AFTER the
index 4f7ee9bfd151272fe20c8d9153b8655a09eb0f6a..b8a696aef5074d98511e1a7c6ba77b7622ed0f02 100644 (file)
@@ -46,9 +46,9 @@ typedef struct ExprItem ExprItem;
 void expr_delete(/*@only@*/ /*@null@*/ expr *e);
 
 /* Expands all (symrec) equ's in the expression into full expression
- * instances.
+ * instances.  Also resolves labels, if possible.
  */
-void expr_expand_equ(expr *e);
+void expr_expand_labelequ(expr *e, intnum *(*resolve_label) (symrec *sym));
 
 /* Simplifies the expression e as much as possible, eliminating extraneous
  * branches and simplifying integer-only subexpressions.
index 8a14b1f43963c8cc8e5899dbeb1e43532cb0f812..65ec69124fb9fa48a497a9ed748c00a48941dd37 100644 (file)
@@ -22,6 +22,8 @@
 #include "util.h"
 RCSID("$IdPath$");
 
+#include "symrec.h"
+
 #include "bytecode.h"
 #include "section.h"
 
@@ -39,11 +41,11 @@ RCSID("$IdPath$");
 #define BCFLAG_DONE            (1<<1)
 
 static /*@only@*/ /*@null@*/ intnum *
-basic_optimize_resolve_label(section *sect, bytecode *bc)
+basic_optimize_resolve_label(symrec *sym)
 {
     unsigned long flags;
 
-    flags = section_get_opt_flags(sect);
+    flags = symrec_get_opt_flags(sym);
 
     return NULL;
 }