| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Value handling | 2 * Value handling |
| 3 * | 3 * |
| 4 * Copyright (C) 2006-2007 Peter Johnson | 4 * Copyright (C) 2006-2007 Peter Johnson |
| 5 * | 5 * |
| 6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
| 7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
| 8 * are met: | 8 * are met: |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| 11 * 2. Redistributions in binary form must reproduce the above copyright | 11 * 2. Redistributions in binary form must reproduce the above copyright |
| 12 * notice, this list of conditions and the following disclaimer in the | 12 * notice, this list of conditions and the following disclaimer in the |
| 13 * documentation and/or other materials provided with the distribution. | 13 * documentation and/or other materials provided with the distribution. |
| 14 * | 14 * |
| 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' | 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' |
| 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE | 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE |
| 19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| 25 * POSSIBILITY OF SUCH DAMAGE. | 25 * POSSIBILITY OF SUCH DAMAGE. |
| 26 */ | 26 */ |
| 27 #include "util.h" | 27 #include "util.h" |
| 28 /*@unused@*/ RCSID("$Id: value.c 2220 2009-07-24 19:01:35Z peter $"); | |
| 29 | 28 |
| 30 #include "libyasm-stdint.h" | 29 #include "libyasm-stdint.h" |
| 31 #include "coretype.h" | 30 #include "coretype.h" |
| 32 #include "bitvect.h" | 31 #include "bitvect.h" |
| 33 | 32 |
| 34 #include "errwarn.h" | 33 #include "errwarn.h" |
| 35 #include "intnum.h" | 34 #include "intnum.h" |
| 36 #include "floatnum.h" | 35 #include "floatnum.h" |
| 37 #include "expr.h" | 36 #include "expr.h" |
| 38 #include "value.h" | 37 #include "value.h" |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 446 } | 445 } |
| 447 | 446 |
| 448 int | 447 int |
| 449 yasm_value_finalize_expr(yasm_value *value, yasm_expr *e, | 448 yasm_value_finalize_expr(yasm_value *value, yasm_expr *e, |
| 450 yasm_bytecode *precbc, unsigned int size) | 449 yasm_bytecode *precbc, unsigned int size) |
| 451 { | 450 { |
| 452 if (!e) { | 451 if (!e) { |
| 453 yasm_value_initialize(value, NULL, size); | 452 yasm_value_initialize(value, NULL, size); |
| 454 return 0; | 453 return 0; |
| 455 } | 454 } |
| 455 yasm_value_initialize(value, e, size); |
| 456 return yasm_value_finalize(value, precbc); |
| 457 } |
| 456 | 458 |
| 457 yasm_value_initialize(value, | 459 int |
| 458 yasm_expr__level_tree(e, 1, 1, 0, 0, NULL, NULL), | 460 yasm_value_finalize(yasm_value *value, yasm_bytecode *precbc) |
| 459 size); | 461 { |
| 462 if (!value->abs) |
| 463 return 0; |
| 464 |
| 465 value->abs = yasm_expr__level_tree(value->abs, 1, 1, 0, 0, NULL, NULL); |
| 460 | 466 |
| 461 /* quit early if there was an issue in simplify() */ | 467 /* quit early if there was an issue in simplify() */ |
| 462 if (yasm_error_occurred()) | 468 if (yasm_error_occurred()) |
| 463 return 1; | 469 return 1; |
| 464 | 470 |
| 465 /* Strip top-level AND masking to an all-1s mask the same size | 471 /* Strip top-level AND masking to an all-1s mask the same size |
| 466 * of the value size. This allows forced avoidance of overflow warnings. | 472 * of the value size. This allows forced avoidance of overflow warnings. |
| 467 */ | 473 */ |
| 468 if (value->abs->op == YASM_EXPR_AND) { | 474 if (value->abs->op == YASM_EXPR_AND) { |
| 469 int term; | 475 int term; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 /* Simplify 0 in abs to NULL */ | 548 /* Simplify 0 in abs to NULL */ |
| 543 if (value->abs->op == YASM_EXPR_IDENT | 549 if (value->abs->op == YASM_EXPR_IDENT |
| 544 && value->abs->terms[0].type == YASM_EXPR_INT | 550 && value->abs->terms[0].type == YASM_EXPR_INT |
| 545 && yasm_intnum_is_zero(value->abs->terms[0].data.intn)) { | 551 && yasm_intnum_is_zero(value->abs->terms[0].data.intn)) { |
| 546 yasm_expr_destroy(value->abs); | 552 yasm_expr_destroy(value->abs); |
| 547 value->abs = NULL; | 553 value->abs = NULL; |
| 548 } | 554 } |
| 549 return 0; | 555 return 0; |
| 550 } | 556 } |
| 551 | 557 |
| 552 int | |
| 553 yasm_value_finalize(yasm_value *value, yasm_bytecode *precbc) | |
| 554 { | |
| 555 unsigned int valsize = value->size; | |
| 556 return yasm_value_finalize_expr(value, value->abs, precbc, valsize); | |
| 557 } | |
| 558 | |
| 559 yasm_intnum * | 558 yasm_intnum * |
| 560 yasm_value_get_intnum(yasm_value *value, yasm_bytecode *bc, int calc_bc_dist) | 559 yasm_value_get_intnum(yasm_value *value, yasm_bytecode *bc, int calc_bc_dist) |
| 561 { | 560 { |
| 562 /*@dependent@*/ /*@null@*/ yasm_intnum *intn = NULL; | 561 /*@dependent@*/ /*@null@*/ yasm_intnum *intn = NULL; |
| 563 /*@only@*/ yasm_intnum *outval; | 562 /*@only@*/ yasm_intnum *outval; |
| 564 int sym_local; | 563 int sym_local; |
| 565 | 564 |
| 566 if (value->abs) { | 565 if (value->abs) { |
| 567 /* Handle integer expressions, if non-integer or too complex, return | 566 /* Handle integer expressions, if non-integer or too complex, return |
| 568 * NULL. | 567 * NULL. |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 if (value->ip_rel) | 762 if (value->ip_rel) |
| 764 fprintf(f, "%*s(IP-relative)\n", indent_level, ""); | 763 fprintf(f, "%*s(IP-relative)\n", indent_level, ""); |
| 765 if (value->jump_target) | 764 if (value->jump_target) |
| 766 fprintf(f, "%*s(Jump target)\n", indent_level, ""); | 765 fprintf(f, "%*s(Jump target)\n", indent_level, ""); |
| 767 if (value->section_rel) | 766 if (value->section_rel) |
| 768 fprintf(f, "%*s(Section-relative)\n", indent_level, ""); | 767 fprintf(f, "%*s(Section-relative)\n", indent_level, ""); |
| 769 if (value->no_warn) | 768 if (value->no_warn) |
| 770 fprintf(f, "%*s(Overflow warnings disabled)\n", indent_level, ""); | 769 fprintf(f, "%*s(Overflow warnings disabled)\n", indent_level, ""); |
| 771 } | 770 } |
| 772 } | 771 } |
| OLD | NEW |