- subtp = dwTagFromType (field->type, tp);
- dwAddTagAttr (memtp, dwNewAttrTagRef (DW_AT_type, subtp));
- if (!subtp->parent)
- dwAddTagChild (parent, subtp);
+ if (IS_BITFIELD (field->type))
+ {
+ int blen = SPEC_BLEN (field->type);
+ int bstr = SPEC_BSTR (field->type);
+ sym_link * type;
+
+ dwAddTagAttr (memtp,
+ dwNewAttrConst (DW_AT_byte_size,
+ (blen+7)/8));
+ dwAddTagAttr (memtp,
+ dwNewAttrConst (DW_AT_bit_size, blen));
+ dwAddTagAttr (memtp,
+ dwNewAttrConst (DW_AT_bit_offset,
+ ((blen+7) & ~7)
+ - (blen+bstr)));
+ if (blen < 8)
+ type = typeFromStr ("uc");
+ else
+ type = typeFromStr ("ui");
+ subtp = dwTagFromType (type, tp);
+ dwAddTagAttr (memtp, dwNewAttrTagRef (DW_AT_type, subtp));
+ }
+ else
+ {
+ subtp = dwTagFromType (field->type, tp);
+ dwAddTagAttr (memtp, dwNewAttrTagRef (DW_AT_type, subtp));
+ if (!subtp->parent)
+ dwAddTagChild (parent, subtp);
+ }