comparison lwasm/lwasm.c @ 416:1d69ed28f175

Fixed offset problem with emission of incomplete references at start of insn
author lost@l-w.ca
date Tue, 10 Aug 2010 22:00:21 -0600
parents a2f52e97b454
children 4b137a8cf32a
comparison
equal deleted inserted replaced
415:2d7255509130 416:1d69ed28f175
622 /* do nothing */ ; 622 /* do nothing */ ;
623 } 623 }
624 624
625 int lwasm_emitexpr(line_t *l, lw_expr_t expr, int size) 625 int lwasm_emitexpr(line_t *l, lw_expr_t expr, int size)
626 { 626 {
627 int v; 627 int v = 0;
628 628 int ol;
629
630 ol = l -> outputl;
631 if (ol == -1)
632 ol = 0;
633
629 if (lw_expr_istype(expr, lw_expr_type_int)) 634 if (lw_expr_istype(expr, lw_expr_type_int))
630 { 635 {
631 v = lw_expr_intval(expr); 636 v = lw_expr_intval(expr);
632 } 637 }
633 // handle external/cross-section/incomplete references here 638 // handle external/cross-section/incomplete references here
648 lw_expr_destroy(te); 653 lw_expr_destroy(te);
649 654
650 re = lw_alloc(sizeof(reloctab_t)); 655 re = lw_alloc(sizeof(reloctab_t));
651 re -> next = l -> csect -> reloctab; 656 re -> next = l -> csect -> reloctab;
652 l -> csect -> reloctab = re; 657 l -> csect -> reloctab = re;
653 te = lw_expr_build(lw_expr_type_int, l -> outputl); 658 te = lw_expr_build(lw_expr_type_int, ol);
654 re -> offset = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, l -> addr, te); 659 re -> offset = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, l -> addr, te);
655 lw_expr_destroy(te); 660 lw_expr_destroy(te);
656 lwasm_reduce_expr(l -> as, re -> offset); 661 lwasm_reduce_expr(l -> as, re -> offset);
657 re -> expr = te2; 662 re -> expr = te2;
658 re -> size = 2; 663 re -> size = 2;
662 lw_expr_destroy(te); 667 lw_expr_destroy(te);
663 668
664 re = lw_alloc(sizeof(reloctab_t)); 669 re = lw_alloc(sizeof(reloctab_t));
665 re -> next = l -> csect -> reloctab; 670 re -> next = l -> csect -> reloctab;
666 l -> csect -> reloctab = re; 671 l -> csect -> reloctab = re;
667 te = lw_expr_build(lw_expr_type_int, l -> outputl + 2); 672 te = lw_expr_build(lw_expr_type_int, ol + 2);
668 re -> offset = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, l -> addr, te); 673 re -> offset = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, l -> addr, te);
669 lw_expr_destroy(te); 674 lw_expr_destroy(te);
670 lwasm_reduce_expr(l -> as, re -> offset); 675 lwasm_reduce_expr(l -> as, re -> offset);
671 re -> expr = te2; 676 re -> expr = te2;
672 re -> size = 2; 677 re -> size = 2;
675 { 680 {
676 // add "expression" record to section table 681 // add "expression" record to section table
677 re = lw_alloc(sizeof(reloctab_t)); 682 re = lw_alloc(sizeof(reloctab_t));
678 re -> next = l -> csect -> reloctab; 683 re -> next = l -> csect -> reloctab;
679 l -> csect -> reloctab = re; 684 l -> csect -> reloctab = re;
680 te = lw_expr_build(lw_expr_type_int, l -> outputl); 685 te = lw_expr_build(lw_expr_type_int, ol);
681 re -> offset = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, l -> addr, te); 686 re -> offset = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, l -> addr, te);
682 lw_expr_destroy(te); 687 lw_expr_destroy(te);
683 lwasm_reduce_expr(l -> as, re -> offset); 688 lwasm_reduce_expr(l -> as, re -> offset);
684 re -> size = size; 689 re -> size = size;
685 re -> expr = lw_expr_copy(expr); 690 re -> expr = lw_expr_copy(expr);