Updated byte size patch
Turns out that I'd missed one place where there was a hardcoded 8 in the last patch, so here's an updated version.
Signature · 4 lines
┌─── 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
compile-i386.c renamed from sparse.orig/compile-i386.c +1 -1
@@ -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;
evaluate.c renamed from sparse.orig/evaluate.c +13 -13
@@ -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 ;
example.c renamed from sparse.orig/example.c +1 -1
@@ -1830,7 +1830,7 @@ in->type =REG_FRAME ; in->offset = offset; - offset += bits >>3 ; + offset +=bits_to_bytes (bits); } i++;NEXT_PTR_LIST (argtype);
expand.c renamed from sparse.orig/expand.c +1 -1
@@ -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)
flow.c renamed from sparse.orig/flow.c +6 -4
@@ -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)); } }
show-parse.c renamed from sparse.orig/show-parse.c +1 -1
@@ -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;
symbol.c renamed from sparse.orig/symbol.c +5 -5
@@ -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;
target.h renamed from sparse.orig/target.h +10 -0
@@ -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
Quoted 2 lines · David Given
Turns out that I'd missed one place where there was a hardcoded 8 in the last patch, so here's an updated version.
I do still have some concerns about the potential performance loss, but it seems unlikely to cause a serious problem. I have *serious* doubts that Sparse will ever successfully handle a system without 8-bit bytes. However, I will merge this patch. I do need a signoff, though.
- Josh Triplett