#### 8.10.5 HPPA Assembler Directives

`as` for the HPPA supports many additional directives for compatibility with the native assembler. This section describes them only briefly. For detailed information on HPPA-specific assembler directives, see HP9000 Series 800 Assembly Language Reference Manual (HP 92432-90001).

`as` does not support the following assembler directives described in the HP manual:

         .endm           .liston
         .enter          .locct
         .leave          .macro
         .listoff

Beyond those implemented for compatibility, `as` supports one additional assembler directive for the HPPA: `.param`. It conveys register argument locations for static functions. Its syntax closely follows the `.export` directive.

These are the additional directives in `as` for the HPPA:

`.block` n
`.blockz` n
  Reserve n bytes of storage, and initialize them to zero.
`.call`
  Mark the beginning of a procedure call. Only the special case with no arguments is allowed.
`.callinfo [` param `=` value `, ... ] [` flag `, ... ]`
  Specify a number of parameters and flags that define the environment for a procedure.

  param may be any of frame (frame size), entry_gr (end of general register range), entry_fr (end of float register range), entry_sr (end of space register range).

  The values for flag are calls or caller (proc has subroutines), no_calls (proc does not call subroutines), save_rp (preserve return pointer), save_sp (proc preserves stack pointer), no_unwind (do not unwind this proc), hpux_int (proc is interrupt routine).

`.code`
  Assemble into the standard section called $TEXT$, subsection $CODE$.
`.copyright "` string `"`
  In the SOM object format, insert string into the object code, marked as a copyright string.
`.copyright "` string `"`
  In the ELF object format, insert string into the object code, marked as a version string.
`.enter`
  Not yet supported; the assembler rejects programs containing this directive.
`.entry`
  Mark the beginning of a procedure.
`.exit`
  Mark the end of a procedure.
`.export` name `[ ,` typ `] [ ,` param `=` r `]`
  Make a procedure name available to callers. typ, if present, must be one of absolute, code (ELF only, not SOM), data, entry, data, entry, millicode, plabel, pri_prog, or sec_prog.

  param, if present, provides either relocation information for the procedure arguments and result, or a privilege level. param may be argw n (where n ranges from `0` to `3`, and indicates one of four one-word arguments); rtnval (the procedure's result); or priv_lev (privilege level). For arguments or the result, r specifies how to relocate, and must be one of no (not relocatable), gr (argument is in general register), fr (in floating point register), or fu (upper half of float register). For priv_lev, r is an integer.

`.half` n
  Define a two-byte integer constant n; synonym for the portable `as` directive `.short`.
`.import` name `[ ,` typ `]`
  Converse of `.export`; make a procedure available to call. The arguments use the same conventions as the first two arguments for `.export`.
`.label` name
  Define name as a label for the current assembly location.
`.leave`
  Not yet supported; the assembler rejects programs containing this directive.
`.origin` lc
  Advance location counter to lc. Synonym for the `as` portable directive `.org`.
`.param` name `[ ,` typ `] [ ,` param `=` r `]`
  Similar to `.export`, but used for static procedures.
`.proc`
  Use preceding the first statement of a procedure.
`.procend`
  Use following the last statement of a procedure.
label `.reg` expr
  Synonym for `.equ`; define label with the absolute expression expr as its value.
`.space` secname `[ ,` params `]`
  Switch to section secname, creating a new section by that name if necessary. You may only use params when creating a new section, not when switching to an existing one. secname may identify a section by number rather than by name.

  If specified, the list params declares attributes of the section, identified by keywords. The keywords recognized are spnum= exp (identify this section by the number exp, an absolute expression), sort= exp (order sections according to this sort key when linking; exp is an absolute expression), unloadable (section contains no loadable data), notdefined (this section defined elsewhere), and private (data in this section not available to other programs).

`.spnum` secnam
  Allocate four bytes of storage, and initialize them with the section number of the section named secnam. (You can define the section number with the HPPA `.space` directive.)

`.string "` str `"`
  Copy the characters in the string str to the object file. See Strings, for information on escape sequences you can use in `as` strings.

  Warning! The HPPA version of `.string` differs from the usual `as` definition: it does not write a zero byte after copying str.

`.stringz "` str `"`
  Like `.string`, but appends a zero byte after copying str to object file.
`.subspa` name `[ ,` params `]`
`.nsubspa` name `[ ,` params `]`
  Similar to `.space`, but selects a subsection name within the current section. You may only specify params when you create a subsection (in the first instance of `.subspa` for this name).

  If specified, the list params declares attributes of the subsection, identified by keywords. The keywords recognized are quad= expr (“quadrant” for this subsection), align= expr (alignment for beginning of this subsection; a power of two), access= expr (value for “access rights” field), sort= expr (sorting order for this subspace in link), code_only (subsection contains only code), unloadable (subsection cannot be loaded into memory), comdat (subsection is comdat), common (subsection is common block), dup_comm (subsection may have duplicate names), or zero (subsection is all zeros, do not write in object file).

  `.nsubspa` always creates a new subspace with the given name, even if one with the same name already exists.

  comdat, common and dup_comm can be used to implement various flavors of one-only support when using the SOM linker. The SOM linker only supports specific combinations of these flags. The details are not documented. A brief description is provided here.

  comdat provides a form of linkonce support. It is useful for both code and data subspaces. A comdat subspace has a key symbol marked by the is_comdat flag or ST_COMDAT. Only the first subspace for any given key is selected. The key symbol becomes universal in shared links. This is similar to the behavior of secondary_def symbols.

  common provides Fortran named common support. It is only useful for data subspaces. Symbols with the flag is_common retain this flag in shared links. Referencing a is_common symbol in a shared library from outside the library doesn't work. Thus, is_common symbols must be output whenever they are needed.

  common and dup_comm together provide Cobol common support. The subspaces in this case must all be the same length. Otherwise, this support is similar to the Fortran common support.

  dup_comm by itself provides a type of one-only support for code. Only the first dup_comm subspace is selected. There is a rather complex algorithm to compare subspaces. Code symbols marked with the dup_common flag are hidden. This support was intended for "C++ duplicate inlines".

  A simplified technique is used to mark the flags of symbols based on the flags of their subspace. A symbol with the scope SS_UNIVERSAL and type ST_ENTRY, ST_CODE or ST_DATA is marked with the corresponding settings of comdat, common and dup_comm from the subspace, respectively. This avoids having to introduce additional directives to mark these symbols. The HP assembler sets is_common from common. However, it doesn't set the dup_common from dup_comm. It doesn't have comdat support.

`.version "` str `"`
  Write str as version identifier in object code.