Copyright Digital Equipment Corp. All rights reserved.

Description

   The .GLOBAL_LABEL directive declares a global label within a
   routine that is not a routine entry point. Unless declared with
   .GLOBAL_LABEL, global labels in code (specified with "::") are
   assumed to be entry point labels, which require declaration. If
   they are not declared, they are flagged as errors.

   The compiler also allows the address of a global label to be
   stored (for instance, by means of  PUSHAL instruction). (The
   compiler flags as an error any attempt to store a label that has
   not been declared as a global label or an entry point.)

   By using the .GLOBAL_LABEL directive, you are acknowledging that
   the stored code address will not be the target of a CALL or JSB
   instruction. Global labels must appear inside routine boundaries.

   Labels declared with the .GLOBAL_LABEL directive can be used as
   the newpc argument in calls to the $UNWIND (Unwind Call Stack)
   system service because it allows the address of the label to be
   stored.

   However, there is no provision in the compiler to automatically
   adjust the stack pointer at such labels to remove arguments
   passed on the stack or compensate for stack alignment. If
   the call stack is unwound back to an alternate PC in the
   calling routine, the stack may still contain arguments and
   alignment bytes, and any stack-based references that expect this
   adjustment to the caller's original stack depth (which happened
   automatically on VAX) will be incorrect.

   Code that contains labels declared with this directive that are
   to be used as alternate PC targets for $UNWIND must be examined
   carefully to ensure correct behavior, with particular emphasis on
   any references based on the stack pointer.