@@ -226,14 +226,33 @@ private DataType parseUnion(XmlPullParser parser, XmlMessageLog log) {
226226 return unionDT ;
227227 }
228228
229- while (parser .peek ().getName ().equals ("field" )) {
230- XmlElement fieldElement = parser .start ("field" );
231- DataType fieldDT = parseDataTypeTag (parser , log );
232- unionDT .add (fieldDT , fieldDT .getLength (), key .name (), "" );
233- parser .end (fieldElement );
229+ while (parser .peek ().getName ().contains ("field" )) {
230+ String fieldType = parser .peek ().getName ();
231+ if (fieldType .equals ("field" )) {
232+ XmlElement fieldElement = parser .start ("field" );
233+ DataType fieldDT = parseDataTypeTag (parser , log );
234+ unionDT .add (fieldDT , fieldDT .getLength (), key .name (), "" );
235+ parser .end (fieldElement );
236+ }
237+ else if (fieldType .equals ("bitfield" )) {
238+ XmlElement bitFieldElement = parser .start ("bitfield" );
239+ int bitFieldSize =
240+ SpecXmlUtils .decodeInt (bitFieldElement .getAttribute (ATTRIB_SIZE .name ()));
241+ String componentName = bitFieldElement .getAttribute (ATTRIB_NAME .name ());
242+ DataType fieldDT = parseDataTypeTag (parser , log );
243+
244+ try {
245+ unionDT .addBitField (fieldDT , bitFieldSize , componentName , null );
246+ }
247+ catch (InvalidDataTypeException e ) {
248+ log .appendException (e );
249+ }
250+ parser .end (bitFieldElement );
251+ }
234252 }
235253 parser .end (unionElement );
236254 return unionDT ;
255+
237256 }
238257
239258 /**
@@ -295,8 +314,9 @@ private DataType parsePointerRelative(XmlPullParser parser, XmlMessageLog log) {
295314 DataType baseType = parseDataTypeTag (parser , log );
296315 PointerTypedef relPointerDT =
297316 new PointerTypedef (baseType .getName (), baseType , size , programDataManager , offset );
298-
299- DataType resolved = resolveAndMapDataType (new DataTypeKey (baseType .getName ()+"relptr" , idHolder ), relPointerDT );
317+
318+ DataType resolved = resolveAndMapDataType (
319+ new DataTypeKey (baseType .getName () + "relptr" , idHolder ), relPointerDT );
300320 parser .end (pointerRelElement );
301321
302322 return resolved ;
@@ -331,7 +351,25 @@ private DataType parseStruct(XmlPullParser parser, XmlMessageLog log) {
331351 return createdStruct ;
332352 }
333353
334- while (parser .peek ().getName ().equals ("field" )) {
354+ while (parser .peek ().getName ().contains ("field" )) {
355+ handleStructFieldType (parser , createdStruct , log );
356+ }
357+ parser .end (structElement );
358+
359+ return createdStruct ;
360+
361+ }
362+
363+ /**
364+ * Parse and populate field and bit field types for created structs.
365+ *
366+ * @param parser XmlPullParser
367+ * @param createdStruct Structure
368+ * @param log XmlMessageLog
369+ */
370+ private void handleStructFieldType (XmlPullParser parser , Structure createdStruct ,
371+ XmlMessageLog log ) {
372+ if (parser .peek ().getName ().equals ("field" )) {
335373 XmlElement fieldElement = parser .start ("field" );
336374 int fieldOffset =
337375 SpecXmlUtils .decodeInt (fieldElement .getAttribute (ATTRIB_OFFSET .name ()));
@@ -341,10 +379,27 @@ private DataType parseStruct(XmlPullParser parser, XmlMessageLog log) {
341379 fieldElement .getAttribute (ATTRIB_NAME .name ()), "" );
342380 parser .end (fieldElement );
343381 }
344- parser .end (structElement );
345-
346- return createdStruct ;
382+ else if (parser .peek ().getName ().equals ("bitfield" )) {
383+ XmlElement bitFieldElement = parser .start ("bitfield" );
384+ int bitFieldSize =
385+ SpecXmlUtils .decodeInt (bitFieldElement .getAttribute (ATTRIB_SIZE .name ()));
386+ String componentName = bitFieldElement .getAttribute (ATTRIB_NAME .name ());
387+ int byteOffset =
388+ SpecXmlUtils .decodeInt (bitFieldElement .getAttribute (ATTRIB_OFFSET .name ()));
389+ int bitOffset =
390+ SpecXmlUtils .decodeInt (bitFieldElement .getAttribute (ATTRIB_FIRST .name ()));
391+ int byteWidth = Math .ceilDiv ((bitOffset + bitFieldSize ), 8 );
392+ DataType fieldDT = parseDataTypeTag (parser , log );
347393
394+ try {
395+ createdStruct .insertBitFieldAt (byteOffset , byteWidth , bitOffset , fieldDT ,
396+ bitFieldSize , componentName , null );
397+ }
398+ catch (InvalidDataTypeException e ) {
399+ log .appendException (e );
400+ }
401+ parser .end (bitFieldElement );
402+ }
348403 }
349404
350405 /**
0 commit comments