.. _Intrinsic_Subprograms: ********************* Intrinsic Subprograms ********************* .. index:: Intrinsic Subprograms GNAT allows a user application program to write the declaration: .. code-block:: ada pragma Import (Intrinsic, name); providing that the name corresponds to one of the implemented intrinsic subprograms in GNAT, and that the parameter profile of the referenced subprogram meets the requirements. This chapter describes the set of implemented intrinsic subprograms, and the requirements on parameter profiles. Note that no body is supplied; as with other uses of pragma Import, the body is supplied elsewhere (in this case by the compiler itself). Note that any use of this feature is potentially non-portable, since the Ada standard does not require Ada compilers to implement this feature. .. _Intrinsic_Operators: Intrinsic Operators =================== .. index:: Intrinsic operator All the predefined numeric operators in package Standard in ``pragma Import (Intrinsic,..)`` declarations. In the binary operator case, the operands must have the same size. The operand or operands must also be appropriate for the operator. For example, for addition, the operands must both be floating-point or both be fixed-point, and the right operand for ``"**"`` must have a root type of ``Standard.Integer'Base``. You can use an intrinsic operator declaration as in the following example: .. code-block:: ada type Int1 is new Integer; type Int2 is new Integer; function "+" (X1 : Int1; X2 : Int2) return Int1; function "+" (X1 : Int1; X2 : Int2) return Int2; pragma Import (Intrinsic, "+"); This declaration would permit 'mixed mode' arithmetic on items of the differing types ``Int1`` and ``Int2``. It is also possible to specify such operators for private types, if the full views are appropriate arithmetic types. .. _Compilation_ISO_Date: Compilation_ISO_Date ==================== .. index:: Compilation_ISO_Date This intrinsic subprogram is used in the implementation of the library package ``GNAT.Source_Info``. The only useful use of the intrinsic import in this case is the one in this unit, so an application program should simply call the function ``GNAT.Source_Info.Compilation_ISO_Date`` to obtain the date of the current compilation (in local time format YYYY-MM-DD). .. _Compilation_Date: Compilation_Date ================ .. index:: Compilation_Date Same as Compilation_ISO_Date, except the string is in the form MMM DD YYYY. .. _Compilation_Time: Compilation_Time ================ .. index:: Compilation_Time This intrinsic subprogram is used in the implementation of the library package ``GNAT.Source_Info``. The only useful use of the intrinsic import in this case is the one in this unit, so an application program should simply call the function ``GNAT.Source_Info.Compilation_Time`` to obtain the time of the current compilation (in local time format HH:MM:SS). .. _Enclosing_Entity: Enclosing_Entity ================ .. index:: Enclosing_Entity This intrinsic subprogram is used in the implementation of the library package ``GNAT.Source_Info``. The only useful use of the intrinsic import in this case is the one in this unit, so an application program should simply call the function ``GNAT.Source_Info.Enclosing_Entity`` to obtain the name of the current subprogram, package, task, entry, or protected subprogram. .. _Exception_Information: Exception_Information ===================== .. index:: Exception_Information' This intrinsic subprogram is used in the implementation of the library package ``GNAT.Current_Exception``. The only useful use of the intrinsic import in this case is the one in this unit, so an application program should simply call the function ``GNAT.Current_Exception.Exception_Information`` to obtain the exception information associated with the current exception. .. _Exception_Message: Exception_Message ================= .. index:: Exception_Message This intrinsic subprogram is used in the implementation of the library package ``GNAT.Current_Exception``. The only useful use of the intrinsic import in this case is the one in this unit, so an application program should simply call the function ``GNAT.Current_Exception.Exception_Message`` to obtain the message associated with the current exception. .. _Exception_Name: Exception_Name ============== .. index:: Exception_Name This intrinsic subprogram is used in the implementation of the library package ``GNAT.Current_Exception``. The only useful use of the intrinsic import in this case is the one in this unit, so an application program should simply call the function ``GNAT.Current_Exception.Exception_Name`` to obtain the name of the current exception. .. _File: File ==== .. index:: File This intrinsic subprogram is used in the implementation of the library package ``GNAT.Source_Info``. The only useful use of the intrinsic import in this case is the one in this unit, so an application program should simply call the function ``GNAT.Source_Info.File`` to obtain the name of the current file. .. _Line: Line ==== .. index:: Line This intrinsic subprogram is used in the implementation of the library package ``GNAT.Source_Info``. The only useful use of the intrinsic import in this case is the one in this unit, so an application program should simply call the function ``GNAT.Source_Info.Line`` to obtain the number of the current source line. .. _Shifts_and_Rotates: Shifts and Rotates ================== .. index:: Shift_Left .. index:: Shift_Right .. index:: Shift_Right_Arithmetic .. index:: Rotate_Left .. index:: Rotate_Right In standard Ada, the shift and rotate functions are available only for the predefined modular types in package ``Interfaces``. However, in GNAT it is possible to define these functions for any integer type (signed or modular), as in this example: .. code-block:: ada function Shift_Left (Value : T; Amount : Natural) return T with Import, Convention => Intrinsic; The function name must be one of Shift_Left, Shift_Right, Shift_Right_Arithmetic, Rotate_Left, or Rotate_Right. T must be an integer type. T'Size must be 8, 16, 32 or 64 bits; if T is modular, the modulus must be 2**8, 2**16, 2**32 or 2**64. The result type must be the same as the type of ``Value``. The shift amount must be Natural. The formal parameter names can be anything. A more convenient way of providing these shift operators is to use the Provide_Shift_Operators pragma, which provides the function declarations and corresponding pragma Import's for all five shift functions. For signed types the semantics of these operators is to interpret the bitwise result of the corresponding operator for modular type. In particular, shifting a negative number may change its sign bit to positive. .. _Source_Location: Source_Location =============== .. index:: Source_Location This intrinsic subprogram is used in the implementation of the library routine ``GNAT.Source_Info``. The only useful use of the intrinsic import in this case is the one in this unit, so an application program should simply call the function ``GNAT.Source_Info.Source_Location`` to obtain the current source file location.