Go to the previous, next section.

Structure and Union Types

Structure and union types are defined with the TYPE_STRUCT and TYPE_UNION operators and use the struct_type derived type class. Both of these types include a name and a list of fields. The difference between them is that the fields of a union are all stored at the same offset so that only one field may be used at a time, while the fields of a structure are not allowed to overlap. The name method returns the name of a structure or union type, which should be distinct from the names of other types within the symbol table where it is defined. The name is automatically entered in the lexicon (see section Lexicon) when it is set with the set_name method.

The struct_type class contains a field to record the total size of the type in bits. The set_size method is used to assign to this field. Because structure and union types may be used as array elements, they must be able to tile an array without violating any alignment restrictions. This means that extra padding may need to be added at the end of a structure or union. Consequently, the total size of the type may be greater than the sizes of the fields.

The names, types, and offsets of the fields are stored in dynamically-allocated arrays within a struct_type node. The set_num_fields method determines the number of fields and thus the size of these arrays. The number of fields may be changed at any time. If necessary, additional space will be allocated. The num_fields method returns the current number of fields. The field_name, field_type, and offset methods retrieve the field names, types, and offsets, and the set_field_name, set_field_type, and set_offset methods change their values. The fields are numbered beginning with zero. For structures the fields must be in order of increasing offsets. The field offsets for union types should all be zero. The field names are automatically entered in the lexicon (see section Lexicon).

The find_field_by_name method can be used to search for a field with a particular name. If successful, it returns the index of the field; otherwise, it returns a value of -1. The find_field_by_offset method can also be used for structure types to find the field at a certain offset. If the specified offset is not exactly at the beginning of a field, find_field_by_offset returns the index of the field containing it and saves the offset within that field in the left parameter.

Go to the previous, next section.