Mercurial > hg-old > index.cgi
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); |