Unions (STABS)

### 5.10 Unions ¶

    union u_tag {
      int  u_int;
      float u_float;
      char* u_char;
    } an_u;

This code generates a stab for a union tag and a stab for a union variable. Both use the `N_LSYM` stab type. If a union variable is scoped locally to the procedure in which it is defined, its stab is located immediately preceding the `N_LBRAC` for the procedure’s block start.

The stab for the union tag, however, is located preceding the code for the procedure in which it is defined. The stab type is `N_LSYM`. This would seem to imply that the union type is file scope, like the struct type `s_tag`. This is not true. The contents and position of the stab for `u_type` do not convey any information about its procedure local scope.

    # 128 is N_LSYM
    .stabs "u_tag:T23=u4u_int:1,0,32;u_float:12,0,32;u_char:21,0,32;;",
           128,0,0,0

The symbol descriptor ‘`T`’, following the ‘`name:`’ means that the stab describes an enumeration, structure, or union tag. The type descriptor ‘`u`’, following the ‘`23=`’ of the type definition, narrows it down to a union type definition. Following the ‘`u`’ is the number of bytes in the union. After that is a list of union element descriptions. Their format is ‘`name:type, bit offset into the union, number of bytes for the element;`’.

The stab for the union variable is:

    .stabs "an_u:23",128,0,0,-20     # 128 is N_LSYM

‘`-20`’ specifies where the variable is stored (see Automatic Variables Allocated on the Stack).