Turns out that I'd missed one place where there was a hardcoded 8 in the last patch, so here's an updated version. -- ┌─── dg@cowlark.com ───── http://www.cowlark.com ───── │ "I have always wished for my computer to be as easy to use as my │ telephone; my wish has come true because I can no longer figure out │ how to use my telephone." --- Bjarne Stroustrup
diff -urw ../sparse.orig/compile-i386.c ./compile-i386.c --- ../sparse.orig/compile-i386.c 2008-06-28 22:44:21.706554998 +0100 +++ ./compile-i386.c 2008-06-28 23:45:21.246554627 +0100 @@ -2081,7 +2081,7 @@ insn("pushl", new, NULL, !framesize ? "begin function call" : NULL); - framesize += size >> 3; + framesize += bits_to_bytes(size); } END_FOR_EACH_PTR_REVERSE(arg); fn = expr->fn; diff -urw ../sparse.orig/evaluate.c ./evaluate.c --- ../sparse.orig/evaluate.c 2008-06-28 22:44:21.706554998 +0100 +++ ./evaluate.c 2008-07-05 15:38:53.786931491 +0100 @@ -72,7 +72,7 @@ unsigned int length = expr->string->length; sym->array_size = alloc_const_expression(expr->pos, length); - sym->bit_size = bits_in_char * length; + sym->bit_size = bytes_to_bits(length); sym->ctype.alignment = 1; sym->string = 1; sym->ctype.modifiers = MOD_STATIC; @@ -83,7 +83,7 @@ initstr->string = expr->string; array->array_size = sym->array_size; - array->bit_size = bits_in_char * length; + array->bit_size = bytes_to_bits(length); array->ctype.alignment = 1; array->ctype.modifiers = MOD_STATIC; array->ctype.base_type = &char_ctype; @@ -579,7 +579,7 @@ } /* Get the size of whatever the pointer points to */ - multiply = base->bit_size >> 3; + multiply = bits_to_bytes(base->bit_size); if (ctype == &null_ctype) ctype = &ptr_ctype; @@ -831,7 +831,7 @@ struct expression *sub = alloc_expression(expr->pos, EXPR_BINOP); struct expression *div = expr; struct expression *val = alloc_expression(expr->pos, EXPR_VALUE); - unsigned long value = lbase->bit_size >> 3; + unsigned long value = bits_to_bytes(lbase->bit_size); val->ctype = size_t_ctype; val->value = value; @@ -1591,7 +1591,7 @@ e3->op = '+'; e3->left = e0; e3->right = alloc_const_expression(expr->pos, - expr->r_bitpos >> 3); + bits_to_bytes(expr->r_bitpos)); e3->ctype = &lazy_ptr_ctype; } else { e3 = e0; @@ -1727,7 +1727,7 @@ } else if (class == TYPE_PTR) { struct symbol *target = examine_pointer_target(ctype); if (!is_function(target)) - multiply = target->bit_size >> 3; + multiply = bits_to_bytes(target->bit_size); } if (multiply) { @@ -1949,7 +1949,7 @@ expr->base = deref->base; expr->r_bitpos = deref->r_bitpos; } - expr->r_bitpos += offset << 3; + expr->r_bitpos += bytes_to_bits(offset); expr->type = EXPR_SLICE; expr->r_nrbits = member->bit_size; expr->r_bitpos += member->bit_offset; @@ -2037,10 +2037,10 @@ return NULL; size = type->bit_size; - if ((size < 0) || (size & 7)) + if ((size < 0) || (size & (bits_in_char - 1))) expression_error(expr, "cannot size expression"); expr->type = EXPR_VALUE; - expr->value = size >> 3; + expr->value = bits_to_bytes(size); expr->taint = 0; expr->ctype = size_t_ctype; return size_t_ctype; @@ -2071,10 +2071,10 @@ return NULL; } size = type->bit_size; - if (size & 7) + if (size & (bits_in_char-1)) size = 0; expr->type = EXPR_VALUE; - expr->value = size >> 3; + expr->value = bits_to_bytes(size); expr->taint = 0; expr->ctype = size_t_ctype; return size_t_ctype; @@ -2158,7 +2158,7 @@ unsigned from = e->idx_from; unsigned to = e->idx_to + 1; e->type = EXPR_POS; - e->init_offset = from * (e->ctype->bit_size>>3); + e->init_offset = from * bits_to_bytes(e->ctype->bit_size); e->init_nr = to - from; e->init_expr = child; } @@ -2865,7 +2865,7 @@ unrestrict(idx, i_class, &i_type); idx = cast_to(idx, size_t_ctype); m = alloc_const_expression(expr->pos, - ctype->bit_size >> 3); + bits_to_bytes(ctype->bit_size)); m->ctype = size_t_ctype; m->flags = Int_const_expr; expr->type = EXPR_BINOP; diff -urw ../sparse.orig/example.c ./example.c --- ../sparse.orig/example.c 2008-06-28 22:44:21.706554998 +0100 +++ ./example.c 2008-06-28 23:47:38.750558346 +0100 @@ -1830,7 +1830,7 @@ in->type = REG_FRAME; in->offset = offset; - offset += bits >> 3; + offset += bits_to_bytes(bits); } i++; NEXT_PTR_LIST(argtype); diff -urw ../sparse.orig/expand.c ./expand.c --- ../sparse.orig/expand.c 2008-06-28 22:44:21.710555415 +0100 +++ ./expand.c 2008-06-28 23:49:46.523309559 +0100 @@ -880,7 +880,7 @@ { unsigned long offset = 0; while (expr->type == EXPR_POS) { - offset += expr->init_offset << 3; + offset += bytes_to_bits(expr->init_offset); expr = expr->init_expr; } if (expr && expr->ctype) diff -urw ../sparse.orig/flow.c ./flow.c --- ../sparse.orig/flow.c 2008-06-28 22:44:21.710555415 +0100 +++ ./flow.c 2008-06-28 23:49:45.014554518 +0100 @@ -16,6 +16,7 @@ #include "expression.h" #include "linearize.h" #include "flow.h" +#include "target.h" unsigned long bb_generation; @@ -265,8 +266,8 @@ static int overlapping_memop(struct instruction *a, struct instruction *b) { - unsigned int a_start = a->offset << 3; - unsigned int b_start = b->offset << 3; + unsigned int a_start = bytes_to_bits(a->offset); + unsigned int b_start = bytes_to_bits(b->offset); unsigned int a_size = a->size; unsigned int b_size = b->size; @@ -581,13 +582,14 @@ pseudo_t pseudo = insn->src; if (insn->bb && pseudo->type == PSEUDO_SYM) { - int offset = insn->offset, bit = (offset << 3) + insn->size; + int offset = insn->offset, bit = bytes_to_bits(offset) + insn->size; struct symbol *sym = pseudo->sym; if (sym->bit_size > 0 && (offset < 0 || bit > sym->bit_size)) warning(insn->pos, "invalid access %s '%s' (%d %d)", offset < 0 ? "below" : "past the end of", - show_ident(sym->ident), offset, sym->bit_size >> 3); + show_ident(sym->ident), offset, + bits_to_bytes(sym->bit_size)); } } diff -urw ../sparse.orig/show-parse.c ./show-parse.c --- ../sparse.orig/show-parse.c 2008-06-28 22:44:21.718555926 +0100 +++ ./show-parse.c 2008-06-28 23:47:40.010553617 +0100 @@ -673,7 +673,7 @@ int new = show_expression(arg); int size = arg->ctype->bit_size; printf("\tpush.%d\t\tv%d\n", size, new); - framesize += size >> 3; + framesize += bits_to_bytes(size); } END_FOR_EACH_PTR_REVERSE(arg); fn = expr->fn; diff -urw ../sparse.orig/symbol.c ./symbol.c --- ../sparse.orig/symbol.c 2008-06-28 22:44:21.722555178 +0100 +++ ./symbol.c 2008-06-28 23:49:45.758555385 +0100 @@ -128,7 +128,7 @@ base_size = 0; } - align_bit_mask = (sym->ctype.alignment << 3) - 1; + align_bit_mask = bytes_to_bits(sym->ctype.alignment) - 1; /* * Bitfields have some very special rules.. @@ -143,7 +143,7 @@ bit_size = (bit_size + align_bit_mask) & ~align_bit_mask; bit_offset = 0; } - sym->offset = (bit_size - bit_offset) >> 3; + sym->offset = bits_to_bytes(bit_size - bit_offset); sym->bit_offset = bit_offset; sym->ctype.base_type->bit_offset = bit_offset; info->bit_size = bit_size + width; @@ -156,7 +156,7 @@ * Otherwise, just align it right and add it up.. */ bit_size = (bit_size + align_bit_mask) & ~align_bit_mask; - sym->offset = bit_size >> 3; + sym->offset = bits_to_bytes(bit_size); info->bit_size = bit_size + base_size; // warning (sym->pos, "regular: offset=%d", sym->offset); @@ -182,7 +182,7 @@ sym->ctype.alignment = info.max_align; bit_size = info.bit_size; if (info.align_size) { - bit_align = (sym->ctype.alignment << 3)-1; + bit_align = bytes_to_bits(sym->ctype.alignment)-1; bit_size = (bit_size + bit_align) & ~bit_align; } sym->bit_size = bit_size; @@ -877,7 +877,7 @@ struct symbol *sym = ctype->ptr; unsigned long bit_size = ctype->bit_size ? *ctype->bit_size : -1; unsigned long maxalign = ctype->maxalign ? *ctype->maxalign : 0; - unsigned long alignment = (bit_size + 7) >> 3; + unsigned long alignment = bits_to_bytes(bit_size + bits_in_char - 1); if (alignment > maxalign) alignment = maxalign; diff -urw ../sparse.orig/target.h ./target.h --- ../sparse.orig/target.h 2008-06-28 22:44:21.722555178 +0100 +++ ./target.h 2008-06-29 00:04:25.950553965 +0100 @@ -42,4 +42,14 @@ extern int bits_in_enum; extern int enum_alignment; +/* + * Helper functions for converting bits to bytes and vice versa. + */ + +static inline int bits_to_bytes(int bits) +{ return bits / bits_in_char; } + +static inline int bytes_to_bits(int bytes) +{ return bytes * bits_in_char; } + #endif
Attachment:
signature.asc
Description: OpenPGP digital signature