X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCglue.c;h=060ef51547a28d7d0ba30125c03b0ca0ec8cf7d0;hb=b880df34d5377ceee7a8e9465e73aee076fa8d49;hp=374288498b38375c57fce62185a1f477f7e710ce;hpb=51a457fd02440788eaf3f1266e1f80b9a51cfc32;p=fw%2Fsdcc diff --git a/src/SDCCglue.c b/src/SDCCglue.c index 37428849..060ef515 100644 --- a/src/SDCCglue.c +++ b/src/SDCCglue.c @@ -646,68 +646,65 @@ printIvalType (symbol *sym, sym_link * type, initList * ilist, struct dbuf_s * o /*-----------------------------------------------------------------*/ /* printIvalBitFields - generate initializer for bitfields */ /*-----------------------------------------------------------------*/ -void printIvalBitFields(symbol **sym, initList **ilist, struct dbuf_s * oBuf) +static void +printIvalBitFields (symbol **sym, initList **ilist, struct dbuf_s * oBuf) { - value *val ; symbol *lsym = *sym; - initList *lilist = *ilist ; + initList *lilist = *ilist; unsigned long ival = 0; int size = 0; - do + while (lsym) { - unsigned long i; - val = list2val (lilist); - if (size) + + if (0 == SPEC_BLEN (lsym->etype)) { - if (SPEC_BLEN (lsym->etype) > 8) - { - size += ((SPEC_BLEN (lsym->etype) / 8) + - (SPEC_BLEN (lsym->etype) % 8 ? 1 : 0)); - } + /* bit-field structure member with a width of 0 */ + break; } - else + else if (!SPEC_BUNNAMED (lsym->etype)) { - size = ((SPEC_BLEN (lsym->etype) / 8) + - (SPEC_BLEN (lsym->etype) % 8 ? 1 : 0)); - } + /* not an unnamed bit-field structure member */ + value *val = list2val (lilist); + int bit_length = SPEC_BLEN (lsym->etype); - /* check if the literal value is within bounds */ - if (val && - checkConstantRange (lsym->etype, val->etype, '=', FALSE) == CCR_OVL && - !options.lessPedantic) - { - werror (W_LIT_OVERFLOW); - } + if (size) + { + if (bit_length > 8) + size += (bit_length + 7) / 8; + } + else + size = (bit_length + 7) / 8; - i = ulFromVal (val); - i &= (1 << SPEC_BLEN (lsym->etype)) - 1; - i <<= SPEC_BSTR (lsym->etype); - ival |= i; - if (!(lsym->next && - (IS_BITFIELD (lsym->next->type)) && - (SPEC_BSTR (lsym->next->etype)))) - break; + /* check if the literal value is within bounds */ + if (val && + checkConstantRange (lsym->etype, val->etype, '=', FALSE) == CCR_OVL && + !options.lessPedantic) + { + werror (W_LIT_OVERFLOW); + } + + ival |= (ulFromVal (val) & ((1ul << bit_length) - 1ul)) << SPEC_BSTR (lsym->etype); + lilist = lilist ? lilist->next : NULL; + } lsym = lsym->next; - lilist = lilist ? lilist->next : NULL; } - while (1); switch (size) - { - case 1: - dbuf_tprintf (oBuf, "\t!db !constbyte\n", ival); - break; + { + case 1: + dbuf_tprintf (oBuf, "\t!db !constbyte\n", ival); + break; - case 2: - dbuf_tprintf (oBuf, "\t!dw !constword\n", ival); - break; + case 2: + dbuf_tprintf (oBuf, "\t!dw !constword\n", ival); + break; - case 4: - dbuf_tprintf (oBuf, "\t!dw !constword,!constword\n", - (ival >> 16) & 0xffff, (ival & 0xffff)); - break; - } + case 4: + dbuf_tprintf (oBuf, "\t!dw !constword,!constword\n", + (ival >> 16) & 0xffff, (ival & 0xffff)); + break; + } *sym = lsym; *ilist = lilist; } @@ -715,7 +712,7 @@ void printIvalBitFields(symbol **sym, initList **ilist, struct dbuf_s * oBuf) /*-----------------------------------------------------------------*/ /* printIvalStruct - generates initial value for structures */ /*-----------------------------------------------------------------*/ -void +static void printIvalStruct (symbol * sym, sym_link * type, initList * ilist, struct dbuf_s * oBuf) { @@ -724,31 +721,37 @@ printIvalStruct (symbol * sym, sym_link * type, sflds = SPEC_STRUCT (type)->fields; - if (ilist) { - if (ilist->type != INIT_DEEP) { - werrorfl (sym->fileDef, sym->lineDef, E_INIT_STRUCT, sym->name); - return; - } + if (ilist) + { + if (ilist->type != INIT_DEEP) + { + werrorfl (sym->fileDef, sym->lineDef, E_INIT_STRUCT, sym->name); + return; + } - iloop = ilist->init.deep; - } + iloop = ilist->init.deep; + } - if (SPEC_STRUCT (type)->type == UNION) { - printIval (sym, sflds->type, iloop, oBuf, TRUE); - iloop = iloop ? iloop->next : NULL; - } else { - for (; sflds; sflds = sflds->next, iloop = (iloop ? iloop->next : NULL)) { - if (IS_BITFIELD(sflds->type)) { - printIvalBitFields(&sflds, &iloop, oBuf); - } else { - printIval (sym, sflds->type, iloop, oBuf, TRUE); - } + if (SPEC_STRUCT (type)->type == UNION) + { + printIval (sym, sflds->type, iloop, oBuf, 1); + iloop = iloop ? iloop->next : NULL; } - } - if (iloop) { + else + { + while (sflds) + { + if (IS_BITFIELD (sflds->type)) + printIvalBitFields(&sflds, &iloop, oBuf); + else + printIval (sym, sflds->type, iloop, oBuf, 1); + sflds = sflds->next; + iloop = iloop ? iloop->next : NULL; + } + } + + if (iloop) werrorfl (sym->fileDef, sym->lineDef, W_EXCESS_INITIALIZERS, "struct", sym->name); - } - return; } /*-----------------------------------------------------------------*/ @@ -768,6 +771,9 @@ printIvalChar (symbol * sym, sym_link * type, initList * ilist, struct dbuf_s * { if (!size) { + werror (E_INTERNAL_ERROR, __FILE__, __LINE__, + "size should never be 0"); + /* we have not been given a size, but now we know it */ size = strlen (SPEC_CVAL (val->etype).v_char) + 1; /* but first check, if it's a flexible array */