@c Copyright 1991, 1992, 1993, 1994, 1995, 1998, 2004, 2011 @c Free Software Foundation, Inc. @c This is part of the GAS manual. @c For copying conditions, see the file as.texinfo. @page @node HPPA-Dependent @chapter HPPA Dependent Features @cindex support @menu * HPPA Notes:: Notes * HPPA Options:: Options * HPPA Syntax:: Syntax * HPPA Floating Point:: Floating Point * HPPA Directives:: HPPA Machine Directives * HPPA Opcodes:: Opcodes @end menu @node HPPA Notes @section Notes As a back end for @sc{gnu} @sc{cc} @code{@value{AS}} has been throughly tested and should work extremely well. We have tested it only minimally on hand written assembly code and no one has tested it much on the assembly output from the HP compilers. The format of the debugging sections has changed since the original @code{@value{AS}} port (version 1.3X) was released; therefore, you must rebuild all HPPA objects and libraries with the new assembler so that you can debug the final executable. The HPPA @code{@value{AS}} port generates a small subset of the relocations available in the SOM and ELF object file formats. Additional relocation support will be added as it becomes necessary. @node HPPA Options @section Options @code{@value{AS}} has no machine-dependent command-line options for the HPPA. @cindex HPPA Syntax @node HPPA Syntax @section Syntax The assembler syntax closely follows the HPPA instruction set reference manual; assembler directives and general syntax closely follow the HPPA assembly language reference manual, with a few noteworthy differences. First, a colon may immediately follow a label definition. This is simply for compatibility with how most assembly language programmers write code. Some obscure expression parsing problems may affect hand written code which uses the @code{spop} instructions, or code which makes significant use of the @code{!} line separator. @code{@value{AS}} is much less forgiving about missing arguments and other similar oversights than the HP assembler. @code{@value{AS}} notifies you of missing arguments as syntax errors; this is regarded as a feature, not a bug. Finally, @code{@value{AS}} allows you to use an external symbol without explicitly importing the symbol. @emph{Warning:} in the future this will be an error for HPPA targets. Special characters for HPPA targets include: @samp{;} is the line comment character. @samp{!} can be used instead of a newline to separate statements. Since @samp{$} has no special meaning, you may use it in symbol names. @node HPPA Floating Point @section Floating Point @cindex floating point, HPPA (@sc{ieee}) @cindex HPPA floating point (@sc{ieee}) The HPPA family uses @sc{ieee} floating-point numbers. @node HPPA Directives @section HPPA Assembler Directives @code{@value{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 @cite{HP9000 Series 800 Assembly Language Reference Manual} (HP 92432-90001). @cindex HPPA directives not supported @code{@value{AS}} does @emph{not} support the following assembler directives described in the HP manual: @example .endm .liston .enter .locct .leave .macro .listoff @end example @cindex @code{.param} on HPPA Beyond those implemented for compatibility, @code{@value{AS}} supports one additional assembler directive for the HPPA: @code{.param}. It conveys register argument locations for static functions. Its syntax closely follows the @code{.export} directive. @cindex HPPA-only directives These are the additional directives in @code{@value{AS}} for the HPPA: @table @code @item .block @var{n} @itemx .blockz @var{n} Reserve @var{n} bytes of storage, and initialize them to zero. @item .call Mark the beginning of a procedure call. Only the special case with @emph{no arguments} is allowed. @item .callinfo [ @var{param}=@var{value}, @dots{} ] [ @var{flag}, @dots{} ] Specify a number of parameters and flags that define the environment for a procedure. @var{param} may be any of @samp{frame} (frame size), @samp{entry_gr} (end of general register range), @samp{entry_fr} (end of float register range), @samp{entry_sr} (end of space register range). The values for @var{flag} are @samp{calls} or @samp{caller} (proc has subroutines), @samp{no_calls} (proc does not call subroutines), @samp{save_rp} (preserve return pointer), @samp{save_sp} (proc preserves stack pointer), @samp{no_unwind} (do not unwind this proc), @samp{hpux_int} (proc is interrupt routine). @item .code Assemble into the standard section called @samp{$TEXT$}, subsection @samp{$CODE$}. @ifset SOM @item .copyright "@var{string}" In the SOM object format, insert @var{string} into the object code, marked as a copyright string. @end ifset @ifset ELF @item .copyright "@var{string}" In the ELF object format, insert @var{string} into the object code, marked as a version string. @end ifset @item .enter Not yet supported; the assembler rejects programs containing this directive. @item .entry Mark the beginning of a procedure. @item .exit Mark the end of a procedure. @item .export @var{name} [ ,@var{typ} ] [ ,@var{param}=@var{r} ] Make a procedure @var{name} available to callers. @var{typ}, if present, must be one of @samp{absolute}, @samp{code} (ELF only, not SOM), @samp{data}, @samp{entry}, @samp{data}, @samp{entry}, @samp{millicode}, @samp{plabel}, @samp{pri_prog}, or @samp{sec_prog}. @var{param}, if present, provides either relocation information for the procedure arguments and result, or a privilege level. @var{param} may be @samp{argw@var{n}} (where @var{n} ranges from @code{0} to @code{3}, and indicates one of four one-word arguments); @samp{rtnval} (the procedure's result); or @samp{priv_lev} (privilege level). For arguments or the result, @var{r} specifies how to relocate, and must be one of @samp{no} (not relocatable), @samp{gr} (argument is in general register), @samp{fr} (in floating point register), or @samp{fu} (upper half of float register). For @samp{priv_lev}, @var{r} is an integer. @item .half @var{n} Define a two-byte integer constant @var{n}; synonym for the portable @code{@value{AS}} directive @code{.short}. @item .import @var{name} [ ,@var{typ} ] Converse of @code{.export}; make a procedure available to call. The arguments use the same conventions as the first two arguments for @code{.export}. @item .label @var{name} Define @var{name} as a label for the current assembly location. @item .leave Not yet supported; the assembler rejects programs containing this directive. @item .origin @var{lc} Advance location counter to @var{lc}. Synonym for the @code{@value{AS}} portable directive @code{.org}. @item .param @var{name} [ ,@var{typ} ] [ ,@var{param}=@var{r} ] @c Not in HP manual; @sc{gnu} HPPA extension Similar to @code{.export}, but used for static procedures. @item .proc Use preceding the first statement of a procedure. @item .procend Use following the last statement of a procedure. @item @var{label} .reg @var{expr} @c ?? Not in HP manual (Jan 1988 vn) Synonym for @code{.equ}; define @var{label} with the absolute expression @var{expr} as its value. @item .space @var{secname} [ ,@var{params} ] Switch to section @var{secname}, creating a new section by that name if necessary. You may only use @var{params} when creating a new section, not when switching to an existing one. @var{secname} may identify a section by number rather than by name. If specified, the list @var{params} declares attributes of the section, identified by keywords. The keywords recognized are @samp{spnum=@var{exp}} (identify this section by the number @var{exp}, an absolute expression), @samp{sort=@var{exp}} (order sections according to this sort key when linking; @var{exp} is an absolute expression), @samp{unloadable} (section contains no loadable data), @samp{notdefined} (this section defined elsewhere), and @samp{private} (data in this section not available to other programs). @item .spnum @var{secnam} @c ?? Not in HP manual (Jan 1988) Allocate four bytes of storage, and initialize them with the section number of the section named @var{secnam}. (You can define the section number with the HPPA @code{.space} directive.) @cindex @code{string} directive on HPPA @item .string "@var{str}" Copy the characters in the string @var{str} to the object file. @xref{Strings,,Strings}, for information on escape sequences you can use in @code{@value{AS}} strings. @emph{Warning!} The HPPA version of @code{.string} differs from the usual @code{@value{AS}} definition: it does @emph{not} write a zero byte after copying @var{str}. @item .stringz "@var{str}" Like @code{.string}, but appends a zero byte after copying @var{str} to object file. @item .subspa @var{name} [ ,@var{params} ] @itemx .nsubspa @var{name} [ ,@var{params} ] Similar to @code{.space}, but selects a subsection @var{name} within the current section. You may only specify @var{params} when you create a subsection (in the first instance of @code{.subspa} for this @var{name}). If specified, the list @var{params} declares attributes of the subsection, identified by keywords. The keywords recognized are @samp{quad=@var{expr}} (``quadrant'' for this subsection), @samp{align=@var{expr}} (alignment for beginning of this subsection; a power of two), @samp{access=@var{expr}} (value for ``access rights'' field), @samp{sort=@var{expr}} (sorting order for this subspace in link), @samp{code_only} (subsection contains only code), @samp{unloadable} (subsection cannot be loaded into memory), @samp{comdat} (subsection is comdat), @samp{common} (subsection is common block), @samp{dup_comm} (subsection may have duplicate names), or @samp{zero} (subsection is all zeros, do not write in object file). @code{.nsubspa} always creates a new subspace with the given name, even if one with the same name already exists. @samp{comdat}, @samp{common} and @samp{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. @samp{comdat} provides a form of linkonce support. It is useful for both code and data subspaces. A @samp{comdat} subspace has a key symbol marked by the @samp{is_comdat} flag or @samp{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 @samp{secondary_def} symbols. @samp{common} provides Fortran named common support. It is only useful for data subspaces. Symbols with the flag @samp{is_common} retain this flag in shared links. Referencing a @samp{is_common} symbol in a shared library from outside the library doesn't work. Thus, @samp{is_common} symbols must be output whenever they are needed. @samp{common} and @samp{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. @samp{dup_comm} by itself provides a type of one-only support for code. Only the first @samp{dup_comm} subspace is selected. There is a rather complex algorithm to compare subspaces. Code symbols marked with the @samp{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 @samp{comdat}, @samp{common} and @samp{dup_comm} from the subspace, respectively. This avoids having to introduce additional directives to mark these symbols. The HP assembler sets @samp{is_common} from @samp{common}. However, it doesn't set the @samp{dup_common} from @samp{dup_comm}. It doesn't have @samp{comdat} support. @item .version "@var{str}" Write @var{str} as version identifier in object code. @end table @node HPPA Opcodes @section Opcodes For detailed information on the HPPA machine instruction set, see @cite{PA-RISC Architecture and Instruction Set Reference Manual} (HP 09740-90039).