mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-11 23:46:01 +02:00
+ Corrections of error pointed out by Luk Vandelaer
This commit is contained in:
parent
cedb198a59
commit
4ef03db483
340
docs/prog.tex
340
docs/prog.tex
@ -89,7 +89,7 @@ Since the compiler is continuously under development, this document may get
|
|||||||
out of date. Wherever possible, the information in this manual will be
|
out of date. Wherever possible, the information in this manual will be
|
||||||
updated. If you find something which isn't correct, or you think something
|
updated. If you find something which isn't correct, or you think something
|
||||||
is missing, feel free to contact me\footnote{at
|
is missing, feel free to contact me\footnote{at
|
||||||
\var{michael@tfdec1.fys.kuleuven.ac.be}}.
|
\var{Michael.VanCanneyt@wisa.be}}.
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
% Compiler switches
|
% Compiler switches
|
||||||
@ -119,10 +119,12 @@ counterparts.
|
|||||||
% Local switches
|
% Local switches
|
||||||
\section{Local directives}
|
\section{Local directives}
|
||||||
\label{se:LocalSwitch}
|
\label{se:LocalSwitch}
|
||||||
Local directives have no command-line counterpart. They influence the
|
Local directives can occur more than once in a unit or program,
|
||||||
compiler's behaviour from the moment they're encountered until the moment
|
If they have a command-line counterpart, the command-line artgument is
|
||||||
another switch annihilates their behaviour, or the end of the unit or
|
restored as the default for each compiled file. The local directives
|
||||||
program is reached.
|
influence the compiler's behaviour from the moment they're encountered
|
||||||
|
until the moment another switch annihilates their behaviour, or the end
|
||||||
|
of the current unit or program is reached.
|
||||||
|
|
||||||
\subsection{\var{\$A} or \var{\$ALIGN}: Align Data}
|
\subsection{\var{\$A} or \var{\$ALIGN}: Align Data}
|
||||||
|
|
||||||
@ -162,8 +164,28 @@ If False and Bofu then
|
|||||||
|
|
||||||
\subsection{\var{\$C} or \var{\$ASSERTIONS} : Assertion support}
|
\subsection{\var{\$C} or \var{\$ASSERTIONS} : Assertion support}
|
||||||
|
|
||||||
This switch is recognised for Delphi compatibility only. Assertions are not
|
The \var{\{\$ASSERTION\}} switch determines if assert statements are
|
||||||
yet supported by the compiler, but will be implemented in the future.
|
compiled into the binary or not. If the switch is on, the statement
|
||||||
|
\begin{verbatim}
|
||||||
|
Assert(BooleanExpression,AssertMessage);
|
||||||
|
\end{verbatim}
|
||||||
|
Will be compiled in the binary. If te \var{BooleanExpression} evaluates to
|
||||||
|
\var{False}, the RTL will check if the \var{AssertErrorProc} is set. If it
|
||||||
|
is set, it will be called with as parameters the \var{AssertMessage}
|
||||||
|
message, the name of the file, the LineNumber and the address. If it is not
|
||||||
|
set, a runtime error 227 is generated.
|
||||||
|
|
||||||
|
The \var{AssertErrorProc} is defined as
|
||||||
|
\begin{verbatim}
|
||||||
|
Type
|
||||||
|
TAssertErrorProc=procedure(const msg,fname:string;lineno,erroraddr:longint);
|
||||||
|
Var
|
||||||
|
AssertErrorProc = TAssertErrorProc;
|
||||||
|
\end{verbatim}
|
||||||
|
This can be used mainly for debugging purposes. The \file{SYSTEM} unit sets the
|
||||||
|
\var{AssertErrorProc} to a handler that displays a message on \var{stderr}
|
||||||
|
and simply exits. The \file{SYSUTILS} unit catches the run-time error 227
|
||||||
|
and raises an \var{EAssertionFailed} exception.
|
||||||
|
|
||||||
\subsection{\var{\$DEFINE} : Define a symbol}
|
\subsection{\var{\$DEFINE} : Define a symbol}
|
||||||
|
|
||||||
@ -172,7 +194,7 @@ The directive
|
|||||||
{$DEFINE name}
|
{$DEFINE name}
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
defines the symbol \var{name}. This symbol remains defined until the end of
|
defines the symbol \var{name}. This symbol remains defined until the end of
|
||||||
the current module, or until a \var{\$UNDEF name} directive is encountered.
|
the current module (i.e. unit or program), or until a \var{\$UNDEF name} directive is encountered.
|
||||||
|
|
||||||
If \var{name} is already defined, this has no effect. \var{Name} is case
|
If \var{name} is already defined, this has no effect. \var{Name} is case
|
||||||
insensitive.
|
insensitive.
|
||||||
@ -180,7 +202,7 @@ insensitive.
|
|||||||
|
|
||||||
\subsection{\var{\$ELSE} : Switch conditional compilation}
|
\subsection{\var{\$ELSE} : Switch conditional compilation}
|
||||||
|
|
||||||
The \var{\{\$ELSE \}} switches between compiling and ignoting the source
|
The \var{\{\$ELSE \}} switches between compiling and ignoring the source
|
||||||
text delimited by the preceding \var{\{\$IFxxx\}} and following
|
text delimited by the preceding \var{\{\$IFxxx\}} and following
|
||||||
\var{\{\$ENDIF\}}. Any text after the \var{ELSE} keyword but before the
|
\var{\{\$ENDIF\}}. Any text after the \var{ELSE} keyword but before the
|
||||||
brace is ignored:
|
brace is ignored:
|
||||||
@ -354,7 +376,7 @@ compilation continues as if the directive wasn't there.
|
|||||||
\subsection{\var{\$IFOPT} : Start conditional compilation}
|
\subsection{\var{\$IFOPT} : Start conditional compilation}
|
||||||
|
|
||||||
The \var{\{\$IFOPT switch\}} will compile the text that follows it if the
|
The \var{\{\$IFOPT switch\}} will compile the text that follows it if the
|
||||||
switch \var{switch} is currently in the specified state.
|
switch \var{switch} is currently in the specified state.
|
||||||
If it isn't in the specified state, then compilation continues after the
|
If it isn't in the specified state, then compilation continues after the
|
||||||
corresponding \var{\{\$ENDIF\}} directive.
|
corresponding \var{\{\$ENDIF\}} directive.
|
||||||
|
|
||||||
@ -366,6 +388,8 @@ As an example:
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
Will compile the writeln statement if generation of type information is on.
|
Will compile the writeln statement if generation of type information is on.
|
||||||
|
|
||||||
|
{\em Remark:} The \var{\{\$IFOPT\}} directive accepts only short options,
|
||||||
|
i.e. \var{\{\$IFOPT TYPEINFO\}} will not be accepted.
|
||||||
\subsection{\var{\$INFO} : Generate info message}
|
\subsection{\var{\$INFO} : Generate info message}
|
||||||
|
|
||||||
If the generation of info is turned on, through the \var{-vi} command-line
|
If the generation of info is turned on, through the \var{-vi} command-line
|
||||||
@ -441,12 +465,12 @@ i.e. an identifier, keyword or operator.
|
|||||||
The compiler will look for the file to include in the following places:
|
The compiler will look for the file to include in the following places:
|
||||||
|
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item It will look in the path specified in the incude file name.
|
\item It will look in the path specified in the include file name.
|
||||||
\item It will look in the directory where the current source file is.
|
\item It will look in the directory where the current source file is.
|
||||||
\item it will look in all directories specified in the include file search
|
\item it will look in all directories specified in the include file search
|
||||||
path.
|
path.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
You can add files to the include file search path with the \var{-I}
|
You can add directories to the include file search path with the \var{-I}
|
||||||
command-line option.
|
command-line option.
|
||||||
|
|
||||||
\subsection{\var{\$I} or \var{\$INCLUDE} : Include compiler info}
|
\subsection{\var{\$I} or \var{\$INCLUDE} : Include compiler info}
|
||||||
@ -458,8 +482,8 @@ In this form:
|
|||||||
where \var{xxx} is one of \var{TIME}, \var{DATE}, \var{FPCVERSION} or
|
where \var{xxx} is one of \var{TIME}, \var{DATE}, \var{FPCVERSION} or
|
||||||
\var{FPCTARGET}, will generate a macro with the value of these things.
|
\var{FPCTARGET}, will generate a macro with the value of these things.
|
||||||
If \var{xxx} is none of the above, then it is assumed to be the value of
|
If \var{xxx} is none of the above, then it is assumed to be the value of
|
||||||
an environment variable. It's value will be fetched, and inserted in the coe
|
an environment variable. It's value will be fetched, and inserted in the code
|
||||||
as if it were a srtring.
|
as if it were a string.
|
||||||
|
|
||||||
For example, the following program
|
For example, the following program
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
@ -467,8 +491,8 @@ Program InfoDemo;
|
|||||||
|
|
||||||
Const User = {$I %USER%};
|
Const User = {$I %USER%};
|
||||||
|
|
||||||
joe begin
|
begin
|
||||||
Write ('This program was comilped at ',{$I %TIME%});
|
Write ('This program was compiled at ',{$I %TIME%});
|
||||||
Writeln (' on ',{$I %DATE%});
|
Writeln (' on ',{$I %DATE%});
|
||||||
Writeln ('By ',User);
|
Writeln ('By ',User);
|
||||||
Writeln ('Compiler version : ',{$I %FPCVERSION%});
|
Writeln ('Compiler version : ',{$I %FPCVERSION%});
|
||||||
@ -477,7 +501,7 @@ end.
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
Creates the following output :
|
Creates the following output :
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
This program was comilped at 17:40:18 on 1998/09/09
|
This program was compiled at 17:40:18 on 1998/09/09
|
||||||
By michael
|
By michael
|
||||||
Compiler version : 0.99.7
|
Compiler version : 0.99.7
|
||||||
Target CPU : i386
|
Target CPU : i386
|
||||||
@ -493,14 +517,14 @@ The \var{\{\$L filename\}} or \var{\{\$LINK filename\}} directive
|
|||||||
tells the compiler that the file \file{filename} should be linked to
|
tells the compiler that the file \file{filename} should be linked to
|
||||||
your program.
|
your program.
|
||||||
|
|
||||||
the compiler will look for this file in the following way:
|
The compiler will look for this file in the following way:
|
||||||
|
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item It will look in the path specified in the object file name.
|
\item It will look in the path specified in the object file name.
|
||||||
\item It will look in the directory where the current source file is.
|
\item It will look in the directory where the current source file is.
|
||||||
\item it will look in all directories specified in the object file search path.
|
\item it will look in all directories specified in the object file search path.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
You can add files to the object file search path with the \var{-Fo}
|
You can add directories to the object file search path with the \var{-Fo}
|
||||||
option.
|
option.
|
||||||
|
|
||||||
On \linux systems, the name is case sensitive, and must be typed
|
On \linux systems, the name is case sensitive, and must be typed
|
||||||
@ -536,7 +560,7 @@ function strlen (P : pchar) : longint;cdecl;external;
|
|||||||
|
|
||||||
end.
|
end.
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
If one would issue the command the command
|
If one would issue the command
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
ppc386 foo.pp
|
ppc386 foo.pp
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
@ -675,7 +699,7 @@ use when storing enumerated types. It is of the following form:
|
|||||||
{$MINENUMSIZE xxx}
|
{$MINENUMSIZE xxx}
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
Where the form with \var{\$MINENUMSIZE} is for Delphi compatibility.
|
Where the form with \var{\$MINENUMSIZE} is for Delphi compatibility.
|
||||||
var{xxx} can be one of \var{1,2} or \var{4}, or \var{NORMAL} or
|
\var{xxx} can be one of \var{1,2} or \var{4}, or \var{NORMAL} or
|
||||||
\var{DEFAULT}, corresponding to the default value of 4.
|
\var{DEFAULT}, corresponding to the default value of 4.
|
||||||
|
|
||||||
|
|
||||||
@ -683,7 +707,7 @@ As an alternative form one can use \var{\{\$Z1\}}, \var{\{\$Z2\}}
|
|||||||
\var{\{\$Z4\}}. Contrary to Delphi, the default size is 4 bytes
|
\var{\{\$Z4\}}. Contrary to Delphi, the default size is 4 bytes
|
||||||
(\var{\{\$Z4\}}).
|
(\var{\{\$Z4\}}).
|
||||||
|
|
||||||
So the follwoing code
|
So the following code
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
{$PACKENUM 1}
|
{$PACKENUM 1}
|
||||||
Type
|
Type
|
||||||
@ -721,7 +745,7 @@ two that is equal to or larger than the element's size.
|
|||||||
The default alignment (which can be selected with \var{DEFAULT}) is 2,
|
The default alignment (which can be selected with \var{DEFAULT}) is 2,
|
||||||
contrary to Turbo Pascal, where it is 1.
|
contrary to Turbo Pascal, where it is 1.
|
||||||
|
|
||||||
More information on this and an exmple program can be found in the reference
|
More information on this and an example program can be found in the reference
|
||||||
guide, in the section about record types.
|
guide, in the section about record types.
|
||||||
|
|
||||||
{\em Remark:}
|
{\em Remark:}
|
||||||
@ -747,7 +771,7 @@ The generation of overflow checking code can also be controlled
|
|||||||
using the \var{-Co} command line compiler option (see \userref).
|
using the \var{-Co} command line compiler option (see \userref).
|
||||||
|
|
||||||
\subsection{\var{\$R} or \var{\$RANGECHECKS} : Range checking}
|
\subsection{\var{\$R} or \var{\$RANGECHECKS} : Range checking}
|
||||||
By default, the computer doesn't generate code to check the ranges of array
|
By default, the compiler doesn't generate code to check the ranges of array
|
||||||
indices, enumeration types, subrange types, etc. Specifying the
|
indices, enumeration types, subrange types, etc. Specifying the
|
||||||
\var{\{\$R+\}} switch tells the computer to generate code to check these
|
\var{\{\$R+\}} switch tells the computer to generate code to check these
|
||||||
indices. If, at run-time, an index or enumeration type is specified that is
|
indices. If, at run-time, an index or enumeration type is specified that is
|
||||||
@ -776,7 +800,7 @@ object file, and all object files are put together in a big archive. When
|
|||||||
using such a unit, only the pieces of code that you really need or call,
|
using such a unit, only the pieces of code that you really need or call,
|
||||||
will be linked in your program, thus reducing the size of your executable
|
will be linked in your program, thus reducing the size of your executable
|
||||||
substantially. Beware that using smartlinked units slows down the
|
substantially. Beware that using smartlinked units slows down the
|
||||||
compilation process, because a separate object file must be creayed for each
|
compilation process, because a separate object file must be created for each
|
||||||
procedure. If you have units with many functions and procedures, this can
|
procedure. If you have units with many functions and procedures, this can
|
||||||
be a time consuming process, even more so if you use an external assembler
|
be a time consuming process, even more so if you use an external assembler
|
||||||
(the assembler is called to assemble each procedure or function code block).
|
(the assembler is called to assemble each procedure or function code block).
|
||||||
@ -849,7 +873,7 @@ will display the follwing message:
|
|||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
Press <return> to continue
|
Press <return> to continue
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
before waiting for a keypress. Careful ! this may interfere with automatic
|
before waiting for a keypress. Careful ! This may interfere with automatic
|
||||||
compilation processes. It should be used for debuggig purposes only.
|
compilation processes. It should be used for debuggig purposes only.
|
||||||
|
|
||||||
\subsection{\var{\$WARNING} : Generate warning message}
|
\subsection{\var{\$WARNING} : Generate warning message}
|
||||||
@ -900,7 +924,7 @@ The command-line compiler switch \var{-Sa1} has the same effect as the
|
|||||||
\section{Global directives}
|
\section{Global directives}
|
||||||
\label{se:GlobalSwitch}
|
\label{se:GlobalSwitch}
|
||||||
Global directives affect the whole of the compilation process. That is why
|
Global directives affect the whole of the compilation process. That is why
|
||||||
they also have a command - line counterpart. The command-line counterpart is
|
they also have a command-line counterpart. The command-line counterpart is
|
||||||
given for each of the directives.
|
given for each of the directives.
|
||||||
|
|
||||||
\subsection{\var{\$APPTYPE} : Specify type of application (Win32 only)}
|
\subsection{\var{\$APPTYPE} : Specify type of application (Win32 only)}
|
||||||
@ -912,13 +936,16 @@ application. By default, a program compiled by \fpc is a console
|
|||||||
application. Running it will display a console window. Specifying the
|
application. Running it will display a console window. Specifying the
|
||||||
\var{\{\$APPTYPE GUI\}} directive will mark the application as a graphical
|
\var{\{\$APPTYPE GUI\}} directive will mark the application as a graphical
|
||||||
application; no console window will be opened when the application is run.
|
application; no console window will be opened when the application is run.
|
||||||
|
If run from the command-line, the command prompt will be returned immediatly
|
||||||
|
after the application was started.
|
||||||
|
|
||||||
Care should be taken when compiling \var{GUI} applications; the \var{Input}
|
Care should be taken when compiling \var{GUI} applications; the \var{Input}
|
||||||
and \var{Output} files are not available in a GUI application, and
|
and \var{Output} files are not available in a GUI application, and
|
||||||
attempting to read from or write to them will result in a run-time error.
|
attempting to read from or write to them will result in a run-time error.
|
||||||
|
|
||||||
It is possible to determine the application type of a windows application
|
It is possible to determine the application type of a windows application
|
||||||
at runtime. The \var{IsConsole} constant, declared as
|
at runtime. The \var{IsConsole} constant, declared in the Win32 system unit
|
||||||
|
as
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
Const
|
Const
|
||||||
IsConsole : Boolean
|
IsConsole : Boolean
|
||||||
@ -953,7 +980,7 @@ The compiler itself doesn't do the emulation of the coprocessor.
|
|||||||
|
|
||||||
To use coprocessor emulation under \dos go32v1 there is nothing special
|
To use coprocessor emulation under \dos go32v1 there is nothing special
|
||||||
required, as it is handled automatically. (As of version 0.99.10, the
|
required, as it is handled automatically. (As of version 0.99.10, the
|
||||||
go32v1 platform will no longer be supported)
|
go32v1 platform is no longer be supported)
|
||||||
|
|
||||||
To use coprocessor emulation under \dos go32v2 you must use the
|
To use coprocessor emulation under \dos go32v2 you must use the
|
||||||
emu387 unit, which contains correct initialization code for the
|
emu387 unit, which contains correct initialization code for the
|
||||||
@ -974,7 +1001,7 @@ long as the only type used is single or real.
|
|||||||
|
|
||||||
\subsection{\var{\$G} : Generate 80286 code}
|
\subsection{\var{\$G} : Generate 80286 code}
|
||||||
|
|
||||||
This option is recognised for Turbo Pascal compatibility, but is ignored,
|
This option is recognised for Turbo Pascal compatibility, but is ignored.
|
||||||
|
|
||||||
\subsection{\var{\$INCLUDEPATH} : Specify include path.}
|
\subsection{\var{\$INCLUDEPATH} : Specify include path.}
|
||||||
|
|
||||||
@ -1007,12 +1034,12 @@ practice to use makefiles and makefile variables.
|
|||||||
|
|
||||||
This switch (not to be confused with the \var{\{\$L file\}} file linking
|
This switch (not to be confused with the \var{\{\$L file\}} file linking
|
||||||
directive) is recognised for Turbo Pascal compatibility, but is ignored.
|
directive) is recognised for Turbo Pascal compatibility, but is ignored.
|
||||||
generation of symbol information is controlled by the \var{\$D} switch.
|
Generation of symbol information is controlled by the \var{\$D} switch.
|
||||||
|
|
||||||
\subsection{\var{\$LIBRARYPATH} : Specify library path.}
|
\subsection{\var{\$LIBRARYPATH} : Specify library path.}
|
||||||
|
|
||||||
This option serves to specify the library path, where the linker looks for
|
This option serves to specify the library path, where the linker looks for
|
||||||
static or dynamic libraries. \var{\{\$LIBRARYPATH XXX} will add \var{XXX}
|
static or dynamic libraries. \var{\{\$LIBRARYPATH XXX\}} will add \var{XXX}
|
||||||
to the library path. \var{XXX} can contain one or more paths, separated
|
to the library path. \var{XXX} can contain one or more paths, separated
|
||||||
by semi-colons or colons.
|
by semi-colons or colons.
|
||||||
|
|
||||||
@ -1041,7 +1068,7 @@ follows:
|
|||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
{$M StackSize,HeapSize}
|
{$M StackSize,HeapSize}
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
Wher \var{StackSize} and \var{HeapSize} should be two integer values,
|
where \var{StackSize} and \var{HeapSize} should be two integer values,
|
||||||
greater than 1024. The first number sets the size of the stack, and the
|
greater than 1024. The first number sets the size of the stack, and the
|
||||||
second the size of the heap. (Stack setting is ignored under \linux).
|
second the size of the heap. (Stack setting is ignored under \linux).
|
||||||
The two numbers can be set on the command line using the \var{-Ch}
|
The two numbers can be set on the command line using the \var{-Ch}
|
||||||
@ -1050,8 +1077,8 @@ and \var{-Cs} switches.
|
|||||||
\subsection{\var{\$MODE} : Set compiler compatibility mode}
|
\subsection{\var{\$MODE} : Set compiler compatibility mode}
|
||||||
|
|
||||||
The \var{\{\$MODE\}} sets the compatibility mode of the compiler. This
|
The \var{\{\$MODE\}} sets the compatibility mode of the compiler. This
|
||||||
is equivalent to setting one of the command-line options \var{-So} or
|
is equivalent to setting one of the command-line options \var{-So},
|
||||||
\var{-Sd} or \var{-S2}. it has the following arguments:
|
\var{-Sd}, \var{-Sp} or \var{-S2}. it has the following arguments:
|
||||||
\begin{description}
|
\begin{description}
|
||||||
\item[Default] Default mode. This reverts back to the mode that was set on
|
\item[Default] Default mode. This reverts back to the mode that was set on
|
||||||
the command-line.
|
the command-line.
|
||||||
@ -1059,7 +1086,8 @@ the command-line.
|
|||||||
enabled. This is the same as the command-line option \var{-Sd}.
|
enabled. This is the same as the command-line option \var{-Sd}.
|
||||||
\item[TP] Turbo pascal compatibility mode. Object pascal extensions are
|
\item[TP] Turbo pascal compatibility mode. Object pascal extensions are
|
||||||
disabled, except ansistrings, which remain valid. This is the same as the command-line option \var{-So}
|
disabled, except ansistrings, which remain valid. This is the same as the command-line option \var{-So}
|
||||||
\item[FPC] FPC mode.
|
\item[FPC] FPC mode. This is the default, if no command-line switch is
|
||||||
|
supplied.
|
||||||
\item[OBJFPC] Object pascal mode. This is the same as the \var{-S2}
|
\item[OBJFPC] Object pascal mode. This is the same as the \var{-S2}
|
||||||
command-line option.
|
command-line option.
|
||||||
\item[GPC] GNU pascal mode. This is the same as the \var{-Sp} command-line
|
\item[GPC] GNU pascal mode. This is the same as the \var{-Sp} command-line
|
||||||
@ -1067,7 +1095,7 @@ option.
|
|||||||
\end{description}
|
\end{description}
|
||||||
|
|
||||||
For an exact description of each of these modes, see appendix \ref{ch:AppD},
|
For an exact description of each of these modes, see appendix \ref{ch:AppD},
|
||||||
on page \pageref{ch:AppD}
|
on page \pageref{ch:AppD}.
|
||||||
|
|
||||||
\subsection{\var{\$N} : Numeric processing }
|
\subsection{\var{\$N} : Numeric processing }
|
||||||
|
|
||||||
@ -1173,7 +1201,7 @@ generation is not yet fully supported.
|
|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
% Using conditionals and macros
|
% Using conditionals and macros
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\chapter{Using conditionals, Messages and macros}
|
\chapter{Using conditionals, messages and macros}
|
||||||
\label{ch:CondMessageMacro}
|
\label{ch:CondMessageMacro}
|
||||||
The \fpc compiler supports conditionals as in normal Turbo Pascal. It does,
|
The \fpc compiler supports conditionals as in normal Turbo Pascal. It does,
|
||||||
however, more than that. It allows you to make macros which can be used in
|
however, more than that. It allows you to make macros which can be used in
|
||||||
@ -1253,7 +1281,7 @@ with the patch-number of the compiler. 'OS' needs to be changed by the type
|
|||||||
of operating system. Currently this can be one of \var{DOS}, \var{GO32V2},
|
of operating system. Currently this can be one of \var{DOS}, \var{GO32V2},
|
||||||
\var{LINUX}, \var{OS2}, \var{WIN32}, \var{MACOS}, \var{AMIGA} or \var{ATARI}.
|
\var{LINUX}, \var{OS2}, \var{WIN32}, \var{MACOS}, \var{AMIGA} or \var{ATARI}.
|
||||||
|
|
||||||
This symbol is undefined if you specify a target that is different from the
|
The \var{OS} symbol is undefined if you specify a target that is different from the
|
||||||
platform you're compiling on.
|
platform you're compiling on.
|
||||||
The \var{-TSomeOS} option on the command line will define the \var{SomeOS} symbol,
|
The \var{-TSomeOS} option on the command line will define the \var{SomeOS} symbol,
|
||||||
and will undefine the existing platform symbol\footnote{In versions prior to
|
and will undefine the existing platform symbol\footnote{In versions prior to
|
||||||
@ -1295,8 +1323,8 @@ The prototype of this construct is as follows :
|
|||||||
In this directive \var{expr} is a Pascal expression which is evaluated using
|
In this directive \var{expr} is a Pascal expression which is evaluated using
|
||||||
strings, unless both parts of a comparision can be evaluated as numbers,
|
strings, unless both parts of a comparision can be evaluated as numbers,
|
||||||
in which case they are evaluated using numbers\footnote{Otherwise
|
in which case they are evaluated using numbers\footnote{Otherwise
|
||||||
\var{\{\$If 8>54} would evaluate to \var{True}}.
|
\var{\{\$If 8>54\}} would evaluate to \var{True}}.
|
||||||
If the complemete expression evaluates to \var{'0'}, then it is considered
|
If the complete expression evaluates to \var{'0'}, then it is considered
|
||||||
false and rejected. Otherwise it is considered true and accepted. This may
|
false and rejected. Otherwise it is considered true and accepted. This may
|
||||||
have unexpected consequences :
|
have unexpected consequences :
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
@ -1332,30 +1360,30 @@ begin
|
|||||||
{$if (fpc_version=0) and (fpc_release>6) and (fpc_patch>4)}
|
{$if (fpc_version=0) and (fpc_release>6) and (fpc_patch>4)}
|
||||||
{$info At least this is version 0.9.5}
|
{$info At least this is version 0.9.5}
|
||||||
{$else}
|
{$else}
|
||||||
{$fatalerror Problem with version check}
|
{$fatal Problem with version check}
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
{$define x:=1234}
|
{$define x:=1234}
|
||||||
{$if x=1234}
|
{$if x=1234}
|
||||||
{$info x=1234}
|
{$info x=1234}
|
||||||
{$else}
|
{$else}
|
||||||
{$fatalerror x should be 1234}
|
{$fatal x should be 1234}
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
{$if 12asdf and 12asdf}
|
{$if 12asdf and 12asdf}
|
||||||
{$info $if 12asdf and 12asdf is ok}
|
{$info $if 12asdf and 12asdf is ok}
|
||||||
{$else}
|
{$else}
|
||||||
{$fatalerror $if 12asdf and 12asdf rejected}
|
{$fatal $if 12asdf and 12asdf rejected}
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
{$if 0 or 1}
|
{$if 0 or 1}
|
||||||
{$info $if 0 or 1 is ok}
|
{$info $if 0 or 1 is ok}
|
||||||
{$else}
|
{$else}
|
||||||
{$fatalerror $if 0 or 1 rejected}
|
{$fatal $if 0 or 1 rejected}
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
{$if 0}
|
{$if 0}
|
||||||
{$fatalerror $if 0 accepted}
|
{$fatal $if 0 accepted}
|
||||||
{$else}
|
{$else}
|
||||||
{$info $if 0 is ok}
|
{$info $if 0 is ok}
|
||||||
{$endif}
|
{$endif}
|
||||||
@ -1363,51 +1391,51 @@ begin
|
|||||||
{$if 12=12}
|
{$if 12=12}
|
||||||
{$info $if 12=12 is ok}
|
{$info $if 12=12 is ok}
|
||||||
{$else}
|
{$else}
|
||||||
{$fatalerror $if 12=12 rejected}
|
{$fatal $if 12=12 rejected}
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
{$if 12<>312}
|
{$if 12<>312}
|
||||||
{$info $if 12<>312 is ok}
|
{$info $if 12<>312 is ok}
|
||||||
{$else}
|
{$else}
|
||||||
{$fatalerror $if 12<>312 rejected}
|
{$fatal $if 12<>312 rejected}
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
|
|
||||||
{$if 12<=312}
|
{$if 12<=312}
|
||||||
{$info $if 12<=312 is ok}
|
{$info $if 12<=312 is ok}
|
||||||
{$else}
|
{$else}
|
||||||
{$fatalerror $if 12<=312 rejected}
|
{$fatal $if 12<=312 rejected}
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
{$if 12<312}
|
{$if 12<312}
|
||||||
{$info $if 12<312 is ok}
|
{$info $if 12<312 is ok}
|
||||||
{$else}
|
{$else}
|
||||||
{$fatalerror $if 12<312 rejected}
|
{$fatal $if 12<312 rejected}
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
{$if a12=a12}
|
{$if a12=a12}
|
||||||
{$info $if a12=a12 is ok}
|
{$info $if a12=a12 is ok}
|
||||||
{$else}
|
{$else}
|
||||||
{$fatalerror $if a12=a12 rejected}
|
{$fatal $if a12=a12 rejected}
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
{$if a12<=z312}
|
{$if a12<=z312}
|
||||||
{$info $if a12<=z312 is ok}
|
{$info $if a12<=z312 is ok}
|
||||||
{$else}
|
{$else}
|
||||||
{$fatalerror $if a12<=z312 rejected}
|
{$fatal $if a12<=z312 rejected}
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
|
|
||||||
{$if a12<z312}
|
{$if a12<z312}
|
||||||
{$info $if a12<z312 is ok}
|
{$info $if a12<z312 is ok}
|
||||||
{$else}
|
{$else}
|
||||||
{$fatalerror $if a12<z312 rejected}
|
{$fatal $if a12<z312 rejected}
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
{$if not(0)}
|
{$if not(0)}
|
||||||
{$info $if not(0) is OK}
|
{$info $if not(0) is OK}
|
||||||
{$else}
|
{$else}
|
||||||
{$fatalerror $if not(0) rejected}
|
{$fatal $if not(0) rejected}
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
{$info *************************************************}
|
{$info *************************************************}
|
||||||
@ -1445,8 +1473,9 @@ version isn't suitable for your code.
|
|||||||
|
|
||||||
The compiler treats these messages as if they were generated by the
|
The compiler treats these messages as if they were generated by the
|
||||||
compiler. This means that if you haven't turned on warning messages, the
|
compiler. This means that if you haven't turned on warning messages, the
|
||||||
warning will not e displayed. Errors are always displayed, and the compiler
|
warning will not be displayed. Errors are always displayed, and the
|
||||||
stops as if an error had occurred.
|
compiler stops if 50 errors have occurred. After a fatal error, the compiler
|
||||||
|
stops at once.
|
||||||
|
|
||||||
For messages, the syntax is as follows :
|
For messages, the syntax is as follows :
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
@ -1470,7 +1499,7 @@ For errors :
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
Lastly, for fatal errors :
|
Lastly, for fatal errors :
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
{$FatalError Error Message text }
|
{$Fatal Error Message text }
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
or
|
or
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
@ -1777,7 +1806,7 @@ into account :
|
|||||||
Eventually they will be supported.
|
Eventually they will be supported.
|
||||||
\item Directives are case sensitive, other identifiers are not case sensitive.
|
\item Directives are case sensitive, other identifiers are not case sensitive.
|
||||||
\item Contrary to GAS local labels/symbols {\em must} start with \var{.L}
|
\item Contrary to GAS local labels/symbols {\em must} start with \var{.L}
|
||||||
\item The nor operator \var{'!'} is not supported.
|
\item The not operator \var{'!'} is not supported.
|
||||||
\item String expressions in operands are not supported.
|
\item String expressions in operands are not supported.
|
||||||
\item CBTW,CWTL,CWTD and CLTD are not supported, use the normal intel
|
\item CBTW,CWTL,CWTD and CLTD are not supported, use the normal intel
|
||||||
equivalents instead.
|
equivalents instead.
|
||||||
@ -1833,7 +1862,7 @@ program, you will run into trouble because of this calling mechanism. In C,
|
|||||||
the calling procedure is expected to clear the stack, not the called
|
the calling procedure is expected to clear the stack, not the called
|
||||||
procedure. In other words, the arguments still are on the stack when the
|
procedure. In other words, the arguments still are on the stack when the
|
||||||
procedure exits. To avoid this problem, \fpc supports the \var{export}
|
procedure exits. To avoid this problem, \fpc supports the \var{export}
|
||||||
modifier. Procedures that are defined using the export modifier, use a
|
modifier. Procedures that are defined using the \var{export} modifier, use a
|
||||||
C-compatible calling mechanism. This means that they can be called from a
|
C-compatible calling mechanism. This means that they can be called from a
|
||||||
C program or library, or that you can use them as a callback function.
|
C program or library, or that you can use them as a callback function.
|
||||||
|
|
||||||
@ -1887,8 +1916,8 @@ The generated exit sequence for procedure and functions looks as follows:
|
|||||||
|
|
||||||
Where \var{xx} is the total size of the pushed parameters.
|
Where \var{xx} is the total size of the pushed parameters.
|
||||||
|
|
||||||
To have more information on function return values take a look at the
|
To have more information on function return values take a look at
|
||||||
\sees{RegConvs} section.
|
\sees{RegConvs}.
|
||||||
|
|
||||||
|
|
||||||
\subsection{ M680x0 calling conventions }
|
\subsection{ M680x0 calling conventions }
|
||||||
@ -1910,8 +1939,8 @@ The generated exit sequence for procedure and functions looks as follows:
|
|||||||
|
|
||||||
Where \var{xx} is the total size of the pushed parameters.
|
Where \var{xx} is the total size of the pushed parameters.
|
||||||
|
|
||||||
To have more information on function return values take a look at the
|
To have more information on function return values take a look at
|
||||||
\sees{RegConvs} section.
|
\sees{RegConvs}.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1977,7 +2006,7 @@ of the part that the linker plays in creating your executable.
|
|||||||
The linker is only called when you compile a program. When compiling units,
|
The linker is only called when you compile a program. When compiling units,
|
||||||
the linker isn't invoked.
|
the linker isn't invoked.
|
||||||
|
|
||||||
However, there are times that you want to C libraries, or to external
|
However, there are times that you want to link to C libraries, or to external
|
||||||
object files that are generated using a C compiler (or even another pascal
|
object files that are generated using a C compiler (or even another pascal
|
||||||
compiler). The \fpc compiler can generate calls to a C function,
|
compiler). The \fpc compiler can generate calls to a C function,
|
||||||
and can generate functions that can be called from C (exported functions).
|
and can generate functions that can be called from C (exported functions).
|
||||||
@ -1992,7 +2021,7 @@ want to use.
|
|||||||
object file or what library, so the compiler can link the necessary code in.
|
object file or what library, so the compiler can link the necessary code in.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
The same holds for variables. To access a variable that resides in an
|
The same holds for variables. To access a variable that resides in an
|
||||||
external object file, you ust declare it, and tell the compiler where to
|
external object file, you must declare it, and tell the compiler where to
|
||||||
find it.
|
find it.
|
||||||
The following sections attempt to explain how to do this.
|
The following sections attempt to explain how to do this.
|
||||||
|
|
||||||
@ -2007,7 +2036,7 @@ want to use. \fpc supports Delphi syntax, i.e. you must use the
|
|||||||
the code block of the function. As such, It cannot be used in an interface
|
the code block of the function. As such, It cannot be used in an interface
|
||||||
section of a unit, but must always reside in the implementation section.
|
section of a unit, but must always reside in the implementation section.
|
||||||
|
|
||||||
There exist four variants of the external direcive :
|
There exist four variants of the external directive :
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item A simple external declaration:
|
\item A simple external declaration:
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
@ -2016,7 +2045,9 @@ Procedure ProcName (Args : TPRocArgs); external;
|
|||||||
The \var{external} directive tells the compiler that the function resides in
|
The \var{external} directive tells the compiler that the function resides in
|
||||||
an external block of code. You can use this together with the \var{\{\$L \}}
|
an external block of code. You can use this together with the \var{\{\$L \}}
|
||||||
or \var{\{\$LinkLib \}} directives to link to a function or procedure in a
|
or \var{\{\$LinkLib \}} directives to link to a function or procedure in a
|
||||||
library or external object file.
|
library or external object file. Object files are looked for in the object
|
||||||
|
search path (set by \var{-Fo}) and libraries are searched for in the linker
|
||||||
|
path (set by \var{-Fl}).
|
||||||
|
|
||||||
\item You can give the \var{external} directive a library name as an
|
\item You can give the \var{external} directive a library name as an
|
||||||
argument:
|
argument:
|
||||||
@ -2051,7 +2082,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
\item Lastly, onder \windows and \ostwo, there is a fourth possibility
|
\item Lastly, onder \windows and \ostwo, there is a fourth possibility
|
||||||
to specify an external function: In \file{.DLL} files, functionas also have
|
to specify an external function: In \file{.DLL} files, functions also have
|
||||||
a unique number (their index). It is possible to refer to these fuctions
|
a unique number (their index). It is possible to refer to these fuctions
|
||||||
using their index:
|
using their index:
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
@ -2092,7 +2123,7 @@ Var
|
|||||||
The effect of this declaration is twofold:
|
The effect of this declaration is twofold:
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item No space is allocated for this variable.
|
\item No space is allocated for this variable.
|
||||||
\item The name of the variable used in the assebler code is \var{varname}.
|
\item The name of the variable used in the assembler code is \var{varname}.
|
||||||
This is a case sensitive name, so you must be careful.
|
This is a case sensitive name, so you must be careful.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
The variable will be
|
The variable will be
|
||||||
@ -2108,7 +2139,7 @@ The effect of this declaration is twofold as in the previous case:
|
|||||||
\item The \var{external} modifier ensures that no space is allocated for
|
\item The \var{external} modifier ensures that no space is allocated for
|
||||||
this variable.
|
this variable.
|
||||||
\item The \var{cvar} modifier tells the compiler that the name of the
|
\item The \var{cvar} modifier tells the compiler that the name of the
|
||||||
variable used in the assebler code is exactly as specified in the
|
variable used in the assembler code is exactly as specified in the
|
||||||
declaration. This is a case sensitive name, so you must be careful.
|
declaration. This is a case sensitive name, so you must be careful.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
In this case, you access the variable with it's C name, but case
|
In this case, you access the variable with it's C name, but case
|
||||||
@ -2315,7 +2346,7 @@ information on the different kinds of calling scheme.
|
|||||||
|
|
||||||
The naming conventions can be controlled by 3 modifiers:
|
The naming conventions can be controlled by 3 modifiers:
|
||||||
\begin{description}
|
\begin{description}
|
||||||
\item [cdecl:\ ] A function that has a \var{cdecl} modifier, will used
|
\item [cdecl:\ ] A function that has a \var{cdecl} modifier, will be used
|
||||||
with C calling conventions, that is, the caller clears the stack. Also
|
with C calling conventions, that is, the caller clears the stack. Also
|
||||||
the mangled name will be the name {\em exactly} as in the declaration.
|
the mangled name will be the name {\em exactly} as in the declaration.
|
||||||
\var{cdecl} is part of the function declaration, and hence must be present
|
\var{cdecl} is part of the function declaration, and hence must be present
|
||||||
@ -2325,7 +2356,7 @@ both in the interface and implementation section of a unit.
|
|||||||
exact declaration name as its mangled name. Under \windowsnt and \ostwo,
|
exact declaration name as its mangled name. Under \windowsnt and \ostwo,
|
||||||
this modifier signals a function that is exported from a DLL.
|
this modifier signals a function that is exported from a DLL.
|
||||||
The calling conventions used by a \var{export} procedure depend on the OS.
|
The calling conventions used by a \var{export} procedure depend on the OS.
|
||||||
this keyword can be used only in the implementation section.
|
This keyword can be used only in the implementation section.
|
||||||
\item [Alias: ] The \var{alias} modifier can be used to give a supplementary
|
\item [Alias: ] The \var{alias} modifier can be used to give a supplementary
|
||||||
assembler name to your function. This doesn't modify the calling conventions
|
assembler name to your function. This doesn't modify the calling conventions
|
||||||
of the function.
|
of the function.
|
||||||
@ -2370,7 +2401,7 @@ from the units too.
|
|||||||
\subsection{Exporting variables}
|
\subsection{Exporting variables}
|
||||||
|
|
||||||
Similarly as when you export functions, you can export variables.
|
Similarly as when you export functions, you can export variables.
|
||||||
when exportig variables, one should only consider the names of the
|
When exportig variables, one should only consider the names of the
|
||||||
variables. To declare a variable that should be used by a C program,
|
variables. To declare a variable that should be used by a C program,
|
||||||
one declares it with the \var{cvar} modifier:
|
one declares it with the \var{cvar} modifier:
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
@ -2428,10 +2459,10 @@ ppumove -e ppl -o name unit1 unit2 unit3
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
This will move 3 units in 1 library (called \file{libname.so} on linux,
|
This will move 3 units in 1 library (called \file{libname.so} on linux,
|
||||||
\file{name.dll} on \windows) and it will create 3 files \file{unit1.ppl},
|
\file{name.dll} on \windows) and it will create 3 files \file{unit1.ppl},
|
||||||
\file{unit2.ppl} and \file{file3.ppl}, which are unit files, but which tell
|
\file{unit2.ppl} and \file{unit3.ppl}, which are unit files, but which tell
|
||||||
the compiler to look in library \var{name} when linking your executable.
|
the compiler to look in library \var{name} when linking your executable.
|
||||||
|
|
||||||
The \var{ppumove} program has options to create statical or dynammical
|
The \var{ppumove} program has options to create statical or dynamical
|
||||||
libraries. It is provided with the compiler.
|
libraries. It is provided with the compiler.
|
||||||
|
|
||||||
% unit searching
|
% unit searching
|
||||||
@ -2469,7 +2500,7 @@ different directories, depending on whether \var{-XD} or \var{-XS} is used.
|
|||||||
\section{Using smart linking}
|
\section{Using smart linking}
|
||||||
\label{se:SmartLinking}
|
\label{se:SmartLinking}
|
||||||
|
|
||||||
You can compile your units using smart linking. When you use smartl linking,
|
You can compile your units using smart linking. When you use smartlinking,
|
||||||
the compiler creates a series of code blocks that are as small as possible,
|
the compiler creates a series of code blocks that are as small as possible,
|
||||||
i.e. a code block will contain only the code for one procedure or function.
|
i.e. a code block will contain only the code for one procedure or function.
|
||||||
|
|
||||||
@ -2488,7 +2519,7 @@ Unit Testunit
|
|||||||
Interface
|
Interface
|
||||||
...
|
...
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
Smartlinking will slow down the compilation process, expecially for large
|
Smartlinking will slow down the compilation process, especially for large
|
||||||
units.
|
units.
|
||||||
|
|
||||||
When a unit \file{foo.pp} is smartlinked, the name of the codefile is
|
When a unit \file{foo.pp} is smartlinked, the name of the codefile is
|
||||||
@ -2498,15 +2529,15 @@ Technically speaking, the compiler makes small assembler files for each
|
|||||||
procedure and function in the unit, as well as for all global defined
|
procedure and function in the unit, as well as for all global defined
|
||||||
variables (whether they're in the interface section or not). It then
|
variables (whether they're in the interface section or not). It then
|
||||||
assembles all these small files, and uses \file{ar} to collect the resulting
|
assembles all these small files, and uses \file{ar} to collect the resulting
|
||||||
object fioles in one archive.
|
object files in one archive.
|
||||||
|
|
||||||
Smartlinking and the creation of shared (or dynamic) libraries are mutually
|
Smartlinking and the creation of shared (or dynamic) libraries are mutually
|
||||||
exclusive, that is, if you turn on smartlinking, then the creation of shared
|
exclusive, that is, if you turn on smartlinking, then the creation of shared
|
||||||
libraries is turned of. The creation of static libraries is still possible.
|
libraries is turned of. The creation of static libraries is still possible.
|
||||||
The reason for this is that it has little sense in making a smarlinked
|
The reason for this is that it has little sense in making a smarlinked
|
||||||
dynamica library. The whole shared library is loaded into memory anyway by
|
dynamical library. The whole shared library is loaded into memory anyway by
|
||||||
the dynamic linker (or \windowsnt), so there would be no gain in size by
|
the dynamic linker (or \windowsnt), so there would be no gain in size by
|
||||||
making it smartinked.
|
making it smartlinked.
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
% Objects
|
% Objects
|
||||||
@ -2514,7 +2545,7 @@ making it smartinked.
|
|||||||
\chapter{Objects}
|
\chapter{Objects}
|
||||||
\label{ch:Objects}
|
\label{ch:Objects}
|
||||||
In this short chapter we give some technical things about objects. For
|
In this short chapter we give some technical things about objects. For
|
||||||
instructions on how to use and declare objects, see \refref.
|
instructions on how to use and declare objects, see the \refref.
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
% Constructor and Destructor calls.
|
% Constructor and Destructor calls.
|
||||||
@ -2548,7 +2579,7 @@ This field is initialized by the call to the object's \var{Constructor} method.
|
|||||||
|
|
||||||
If the object you defined has no virtual methods, then a \var{nil} is stored
|
If the object you defined has no virtual methods, then a \var{nil} is stored
|
||||||
in the VMT pointer. This ensures that the size of objects is equal, whether
|
in the VMT pointer. This ensures that the size of objects is equal, whether
|
||||||
they have virtual methods ore not.
|
they have virtual methods or not.
|
||||||
|
|
||||||
The memory allocated looks as in \seet{ObjMem}.
|
The memory allocated looks as in \seet{ObjMem}.
|
||||||
\begin{FPCltable}{ll}{Object memory layout}{ObjMem} \hline
|
\begin{FPCltable}{ll}{Object memory layout}{ObjMem} \hline
|
||||||
@ -2564,8 +2595,8 @@ Offset & What \\ \hline
|
|||||||
\section{The Virtual Method Table}
|
\section{The Virtual Method Table}
|
||||||
\label{se:VMT}
|
\label{se:VMT}
|
||||||
The Virtual Method Table (VMT) for each object type consists of 2 check
|
The Virtual Method Table (VMT) for each object type consists of 2 check
|
||||||
fields (containing the size of the data), a pointer to the object's anchestor's
|
fields (containing the size of the data), a pointer to the object's ancestor's
|
||||||
VMT (\var{Nil} if there is no anchestor), and then the pointers to all virtual
|
VMT (\var{Nil} if there is no ancestor), and then the pointers to all virtual
|
||||||
methods. The VMT layout is illustrated in \seet{VMTMem}.
|
methods. The VMT layout is illustrated in \seet{VMTMem}.
|
||||||
|
|
||||||
The VMT is constructed by the compiler. Every instance of an object receives
|
The VMT is constructed by the compiler. Every instance of an object receives
|
||||||
@ -2652,7 +2683,7 @@ and memory allocations for all used variables.
|
|||||||
linker must link together.
|
linker must link together.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
The link response file is, by default, removed from the disk. Only when you
|
The link response file is, by default, removed from the disk. Only when you
|
||||||
specify the \var{-s} command-line option or when linking fails, then the ile
|
specify the \var{-s} command-line option or when linking fails, then the file
|
||||||
is left on the disk. It is named \file{link.res}.
|
is left on the disk. It is named \file{link.res}.
|
||||||
|
|
||||||
The assembly language file is converted to an object file by the assembler,
|
The assembly language file is converted to an object file by the assembler,
|
||||||
@ -2667,7 +2698,7 @@ parameters to executables in wildly different ways.
|
|||||||
It's name is \file{prt0.o}, and the
|
It's name is \file{prt0.o}, and the
|
||||||
source file resides in \file{prt0.s} or some variant of this name. It
|
source file resides in \file{prt0.s} or some variant of this name. It
|
||||||
usually resided where the system unit source for your system resides.
|
usually resided where the system unit source for your system resides.
|
||||||
It's main function is to save the environment and command-line arguments,
|
It's main function is to save the environment and command-line arguments and
|
||||||
set up the stack. Then it calls the main program.
|
set up the stack. Then it calls the main program.
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
@ -2775,7 +2806,7 @@ MMX operations and before using floating point operations, you
|
|||||||
have to call the routine \var{EMMS} of the \var{MMX} unit.
|
have to call the routine \var{EMMS} of the \var{MMX} unit.
|
||||||
This routine restores the FPU registers.
|
This routine restores the FPU registers.
|
||||||
|
|
||||||
{\em careful:} The compiler doesn't warn if you mix floating point and
|
{\em Careful:} The compiler doesn't warn if you mix floating point and
|
||||||
MMX operations, so be careful.
|
MMX operations, so be careful.
|
||||||
|
|
||||||
The MMX instructions are optimized for multi media (what else?).
|
The MMX instructions are optimized for multi media (what else?).
|
||||||
@ -2787,7 +2818,7 @@ An important restriction is that MMX operations aren't range or overflow
|
|||||||
checked, even when you turn range and overflow checking on. This is due to
|
checked, even when you turn range and overflow checking on. This is due to
|
||||||
the nature of MMX operations.
|
the nature of MMX operations.
|
||||||
|
|
||||||
The \var{MMX} unit must be always used when doing MMX operations
|
The \var{MMX} unit must always be used when doing MMX operations
|
||||||
because the exit code of this unit clears the MMX unit. If it wouldn't do
|
because the exit code of this unit clears the MMX unit. If it wouldn't do
|
||||||
that, other program will crash. A consequence of this is that you can't use
|
that, other program will crash. A consequence of this is that you can't use
|
||||||
MMX operations in the exit code of your units or programs, since they would
|
MMX operations in the exit code of your units or programs, since they would
|
||||||
@ -2797,7 +2828,7 @@ check this, so you are responsible for this !
|
|||||||
\section{Supported MMX operations}
|
\section{Supported MMX operations}
|
||||||
\label{se:SupportedMMX}
|
\label{se:SupportedMMX}
|
||||||
|
|
||||||
|
{\em Still to be written...}
|
||||||
|
|
||||||
\section{Optimizing MMX support}
|
\section{Optimizing MMX support}
|
||||||
\label{se:OptimizingMMX}
|
\label{se:OptimizingMMX}
|
||||||
@ -2827,7 +2858,7 @@ procedure.
|
|||||||
% The 32-bit model
|
% The 32-bit model
|
||||||
\section{The 32-bit model.}
|
\section{The 32-bit model.}
|
||||||
\label{se:ThirtytwoBit}
|
\label{se:ThirtytwoBit}
|
||||||
The \fpc Pascal compiler issues 32-bit code. This has several consequences:
|
The \fpc compiler issues 32-bit code. This has several consequences:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item You need a 386 processor to run the generated code. The
|
\item You need a 386 processor to run the generated code. The
|
||||||
compiler functions on a 286 when you compile it using Turbo Pascal,
|
compiler functions on a 286 when you compile it using Turbo Pascal,
|
||||||
@ -2854,15 +2885,16 @@ of this function. This has as a consequence that the return type is
|
|||||||
\item [Cseg(), Dseg()] : Returned, respectively, the code and data segments
|
\item [Cseg(), Dseg()] : Returned, respectively, the code and data segments
|
||||||
of your program. This returns zero in the \fpc implementation of the
|
of your program. This returns zero in the \fpc implementation of the
|
||||||
system unit, since both code and data are in the same memory space.
|
system unit, since both code and data are in the same memory space.
|
||||||
\item [Ptr] accepted a segment and offset from an address, and would return
|
\item [Ptr:] Accepted a segment and offset from an address, and would return
|
||||||
a pointer to this address. This has been changed in the run-time library.
|
a pointer to this address. This has been changed in the run-time library.
|
||||||
Standard it returns now simply the offset. If you want to retain the old
|
Standard it returns now simply the offset. If you want to retain the old
|
||||||
functionality, you can recompile the run-time library with the
|
functionality, you can recompile the run-time library with the
|
||||||
\var{DoMapping} symbol defined. This will restore the Turbo Pascal
|
\var{DoMapping} symbol defined. This will restore the Turbo Pascal
|
||||||
behaviour.
|
behaviour.
|
||||||
\item [memw and mem] these arrays gave access to the \dos memory. \fpc
|
\item [memw and mem] These arrays gave access to the \dos memory. \fpc
|
||||||
supports them, they are mapped into \dos memory space. You need the
|
supports them on the go32v2 platform, they are mapped into \dos memory
|
||||||
\var{GO32} unit for this.
|
space. You need the \var{GO32} unit for this. On other platforms, they are
|
||||||
|
{\em not} supported
|
||||||
\end{description}
|
\end{description}
|
||||||
|
|
||||||
You shouldn't use these functions, since they are very non-portable, they're
|
You shouldn't use these functions, since they are very non-portable, they're
|
||||||
@ -2914,7 +2946,7 @@ size of all pushed parameters is limited to 64K.
|
|||||||
|
|
||||||
\subsubsection{ DOS }
|
\subsubsection{ DOS }
|
||||||
|
|
||||||
Under the DOS targets , the default stack is set to 256Kb. This value
|
Under the DOS targets, the default stack is set to 256Kb. This value
|
||||||
cannot be modified for the GO32V1 target. But this can be modified
|
cannot be modified for the GO32V1 target. But this can be modified
|
||||||
with the GO32V2 target using a special DJGPP utility \var{stubedit}.
|
with the GO32V2 target using a special DJGPP utility \var{stubedit}.
|
||||||
It is to note that the stack size may be changed with some compiler
|
It is to note that the stack size may be changed with some compiler
|
||||||
@ -2923,7 +2955,7 @@ size will be used instead, otherwise the default stack size is used.
|
|||||||
|
|
||||||
\subsubsection{ Linux }
|
\subsubsection{ Linux }
|
||||||
|
|
||||||
Under Linux, stack size is only limited by the available memory by
|
Under Linux, stack size is only limited by the available memory of
|
||||||
the system.
|
the system.
|
||||||
|
|
||||||
\subsubsection{ OS/2 }
|
\subsubsection{ OS/2 }
|
||||||
@ -2974,7 +3006,7 @@ Pascal. These extra possibilities are explained in the next subsections.
|
|||||||
|
|
||||||
% The heap grows
|
% The heap grows
|
||||||
\subsection{The heap grows}
|
\subsection{The heap grows}
|
||||||
\fpc supports the \var{HeapEerror} procedural variable. If this variable is
|
\fpc supports the \var{HeapError} procedural variable. If this variable is
|
||||||
non-nil, then it is called in case you try to allocate memory, and the heap
|
non-nil, then it is called in case you try to allocate memory, and the heap
|
||||||
is full. By default, \var{HeapError} points to the \var{GrowHeap} function,
|
is full. By default, \var{HeapError} points to the \var{GrowHeap} function,
|
||||||
which tries to increase the heap.
|
which tries to increase the heap.
|
||||||
@ -2992,7 +3024,7 @@ allocated.
|
|||||||
|
|
||||||
% Using Blocks
|
% Using Blocks
|
||||||
\subsection{Using Blocks}
|
\subsection{Using Blocks}
|
||||||
If you need to allocate a lot of small block for a small period, then you
|
If you need to allocate a lot of small blocks for a small period, then you
|
||||||
may want to recompile the run-time library with the \var{USEBLOCKS} symbol
|
may want to recompile the run-time library with the \var{USEBLOCKS} symbol
|
||||||
defined. If it is recompiled, then the heap management is done in a
|
defined. If it is recompiled, then the heap management is done in a
|
||||||
different way.
|
different way.
|
||||||
@ -3021,12 +3053,12 @@ the performance of the heap manager.
|
|||||||
{\em Remark : The split heap is still somewhat buggy. Use at your own risk
|
{\em Remark : The split heap is still somewhat buggy. Use at your own risk
|
||||||
for the moment.}
|
for the moment.}
|
||||||
|
|
||||||
The split heap can be used to quickly release a lot of blocks you alloated
|
The split heap can be used to quickly release a lot of blocks you allocated
|
||||||
previously.
|
previously.
|
||||||
|
|
||||||
Suppose that in a part of your program, you allocate a lot of memory chunks
|
Suppose that in a part of your program, you allocate a lot of memory chunks
|
||||||
on the heap. Suppose that you know that you'll release all this memory when
|
on the heap. Suppose that you know that you'll release all this memory when
|
||||||
this particular part of you program is finished.
|
this particular part of your program is finished.
|
||||||
|
|
||||||
In Turbo Pascal, you could foresee this, and mark the position of the heap
|
In Turbo Pascal, you could foresee this, and mark the position of the heap
|
||||||
(using the \var{Mark} function) when entering this particular part of your
|
(using the \var{Mark} function) when entering this particular part of your
|
||||||
@ -3064,16 +3096,16 @@ This means that the following functions are available :
|
|||||||
procedure Switch_To_Temp_Heap;
|
procedure Switch_To_Temp_Heap;
|
||||||
procedure Switch_Heap;
|
procedure Switch_Heap;
|
||||||
procedure ReleaseTempHeap;
|
procedure ReleaseTempHeap;
|
||||||
procedure GetempMem(var p : pointer;size : longint);
|
procedure GetTempMem(var p : pointer;size : longint);
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
\var{split\_heap} is used to split the heap. It cannot be called two times
|
\var{Split\_Heap} is used to split the heap. It cannot be called two times
|
||||||
in a row, without a call to \var{releasetempheap}. \var{Releasetempheap}
|
in a row, without a call to \var{releasetempheap}. \var{Releasetempheap}
|
||||||
completely releases the memory used by the temporary heap.
|
completely releases the memory used by the temporary heap.
|
||||||
Switching temporarily back to the base heap can be done using the
|
Switching temporarily back to the base heap can be done using the
|
||||||
\var{switch\_to\_base\_heap} call, and returning to the temporary heap is done
|
\var{Switch\_To\_Base\_Heap} call, and returning to the temporary heap is done
|
||||||
using the \var{switch\_to\_temp\_heap} call. Switching from one to the other
|
using the \var{Switch\_To\_Temp\_Heap} call. Switching from one to the other
|
||||||
without knowing on which one your are right now, can be done using the
|
without knowing on which one your are right now, can be done using the
|
||||||
\var{switch\_heap} call, which will split the heap first if needed.
|
\var{Switch\_Heap} call, which will split the heap first if needed.
|
||||||
|
|
||||||
A call to \var{GetTempMem} will allocate a memory block on the temporary
|
A call to \var{GetTempMem} will allocate a memory block on the temporary
|
||||||
heap, whatever the current heap is. The current heap after this call will be
|
heap, whatever the current heap is. The current heap after this call will be
|
||||||
@ -3099,7 +3131,7 @@ ReleaseTempHeap;
|
|||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
% Accessing DOS memory under the GO32 extender
|
% Accessing DOS memory under the GO32 extender
|
||||||
\section{using \dos memory under the Go32 extender}
|
\section{Using \dos memory under the Go32 extender}
|
||||||
\label{se:AccessingDosMemory}
|
\label{se:AccessingDosMemory}
|
||||||
|
|
||||||
Because \fpc is a 32 bit compiler, and uses a \dos extender, accessing DOS
|
Because \fpc is a 32 bit compiler, and uses a \dos extender, accessing DOS
|
||||||
@ -3138,7 +3170,7 @@ begin
|
|||||||
segment := word(result shr 16);
|
segment := word(result shr 16);
|
||||||
end;
|
end;
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
(you need to free this memory using the \var{global\_dos\_free} function.)
|
(You need to free this memory using the \var{global\_dos\_free} function.)
|
||||||
|
|
||||||
You can access any place in memory using a selector. You can get a selector
|
You can access any place in memory using a selector. You can get a selector
|
||||||
using the \var{allocate\_ldt\_descriptor} function, and then let this selector
|
using the \var{allocate\_ldt\_descriptor} function, and then let this selector
|
||||||
@ -3161,7 +3193,7 @@ the \file{GO32} unit.
|
|||||||
\section{ Non processor specific }
|
\section{ Non processor specific }
|
||||||
|
|
||||||
The following sections describe the general optimizations
|
The following sections describe the general optimizations
|
||||||
done by the compiler, they are non processor specific. Some
|
done by the compiler, they are not processor specific. Some
|
||||||
of these require some compiler switch override while others are done
|
of these require some compiler switch override while others are done
|
||||||
automatically (those which require a switch will be noted as such).
|
automatically (those which require a switch will be noted as such).
|
||||||
|
|
||||||
@ -3215,7 +3247,7 @@ by the code generator.
|
|||||||
\subsection{ Range checking }
|
\subsection{ Range checking }
|
||||||
|
|
||||||
Assignments of constants to variables are range checked at compile
|
Assignments of constants to variables are range checked at compile
|
||||||
time, which removes the need the generation of runtime range checking
|
time, which removes the need of the generation of runtime range checking
|
||||||
code.
|
code.
|
||||||
|
|
||||||
\emph{Remark:} This feature was not implemented before version
|
\emph{Remark:} This feature was not implemented before version
|
||||||
@ -3224,11 +3256,11 @@ code.
|
|||||||
\subsection{ Shifts instead of multiply or divide }
|
\subsection{ Shifts instead of multiply or divide }
|
||||||
|
|
||||||
When one of the operands in a multiplication is a power of
|
When one of the operands in a multiplication is a power of
|
||||||
two, they are encoded using arithmetic shifts instructions,
|
two, they are encoded using arithmetic shift instructions,
|
||||||
which generates more efficient code.
|
which generates more efficient code.
|
||||||
|
|
||||||
Similarly, if the divisor in a \var{div} operation is a power
|
Similarly, if the divisor in a \var{div} operation is a power
|
||||||
of two, it is encoded using arithmetic shifts instructions.
|
of two, it is encoded using arithmetic shift instructions.
|
||||||
|
|
||||||
The same is true when accessing array indexes which are
|
The same is true when accessing array indexes which are
|
||||||
powers of two, the address is calculated using arithmetic
|
powers of two, the address is calculated using arithmetic
|
||||||
@ -3311,7 +3343,7 @@ an experimental feature, and should be used with caution.
|
|||||||
|
|
||||||
\subsection{ Intel x86 specific }
|
\subsection{ Intel x86 specific }
|
||||||
|
|
||||||
Here follows a listing of the opimizing techniques used in the compiler:
|
Here follows a listing of the optimizing techniques used in the compiler:
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item When optimizing for a specific Processor (\var{-Op1, -Op2, -Op3},
|
\item When optimizing for a specific Processor (\var{-Op1, -Op2, -Op3},
|
||||||
the following is done:
|
the following is done:
|
||||||
@ -3458,10 +3490,10 @@ faster, but code-wise larger, instruction sequences (such as
|
|||||||
\item[-Og:\ ] This one is exactly the reverse of -OG, and as such these
|
\item[-Og:\ ] This one is exactly the reverse of -OG, and as such these
|
||||||
switches are mutually exclusive: enabling one will disable the other.
|
switches are mutually exclusive: enabling one will disable the other.
|
||||||
|
|
||||||
\item[-Or:\ ] this setting (once it's fixed) causes the code generator to
|
\item[-Or:\ ] This setting (once it's fixed) causes the code generator to
|
||||||
check which variables are used most, so it can keep those in a register.
|
check which variables are used most, so it can keep those in a register.
|
||||||
|
|
||||||
\item[-Opn:\ ] with n = 1..3: setting the target processor does NOT
|
\item[-Opn:\ ] with n = 1..3: Setting the target processor does NOT
|
||||||
activate the optimizer. It merely influences the code generator and,
|
activate the optimizer. It merely influences the code generator and,
|
||||||
if activated, the optimizer:
|
if activated, the optimizer:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
@ -3487,7 +3519,7 @@ when they cannot be used.
|
|||||||
\end{description}
|
\end{description}
|
||||||
|
|
||||||
\section{Tips to get faster code}
|
\section{Tips to get faster code}
|
||||||
Here some general tips for getting better code are presented. They
|
Here, some general tips for getting better code are presented. They
|
||||||
mainly concern coding style.
|
mainly concern coding style.
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
@ -3516,13 +3548,13 @@ assembler file at the end of the assembly process, so you can study the
|
|||||||
assembler file.
|
assembler file.
|
||||||
|
|
||||||
{\em Note:} Code blocks which contain an assembler block, are not processed
|
{\em Note:} Code blocks which contain an assembler block, are not processed
|
||||||
at all by the optimizer at this time. Update: as of versino 0.99.11, the Pascal
|
at all by the optimizer at this time. Update: as of version 0.99.11,
|
||||||
code surrounding the assembler blocks is optimized.
|
the Pascal code surrounding the assembler blocks is optimized.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\section{ Floating point }
|
\section{ Floating point }
|
||||||
|
|
||||||
This is where can be found processor specific information on Floating
|
This is where can be found processor specific information on floating
|
||||||
point code generated by the compiler.
|
point code generated by the compiler.
|
||||||
|
|
||||||
\subsection{ Intel x86 specific }
|
\subsection{ Intel x86 specific }
|
||||||
@ -3534,7 +3566,7 @@ All normal floating point types map to their real type, including
|
|||||||
|
|
||||||
Early generations of the Motorola 680x0 processors did not have integrated
|
Early generations of the Motorola 680x0 processors did not have integrated
|
||||||
floating point units, so to circumvent this fact, all floating point
|
floating point units, so to circumvent this fact, all floating point
|
||||||
operations are emulated (when the \var{\$E+} switch ,which is the default)
|
operations are emulated (with the \var{\$E+} switch, which is the default)
|
||||||
using the IEEE \var{Single} floating point type. In other words when
|
using the IEEE \var{Single} floating point type. In other words when
|
||||||
emulation is on, Real, Single, Double and Extended all map to the
|
emulation is on, Real, Single, Double and Extended all map to the
|
||||||
\var{single} floating point type.
|
\var{single} floating point type.
|
||||||
@ -3566,14 +3598,14 @@ point mode have not been extensively tested as of version 0.99.5.
|
|||||||
% Basics
|
% Basics
|
||||||
\section{Basics}
|
\section{Basics}
|
||||||
|
|
||||||
The best and most updated documentation about the ppu files can be found
|
The best and most updated documentation about the ppu files can be
|
||||||
in \file{ppu.pas} and \file{ppudump.pp} which can be found in
|
found in \file{ppu.pas} and \file{ppudump.pp} which can be found in
|
||||||
\file{rtl/utils/}.
|
\file{rtl/utils/}.
|
||||||
|
|
||||||
To read or write the ppufile, you can use the ppu unit \file{ppu.pas}
|
To read or write the ppufile, you can use the ppu unit \file{ppu.pas}
|
||||||
which has an object called tppufile which holds all routines that deal
|
which has an object called tppufile which holds all routines that deal
|
||||||
with ppufile handling. Describing the layout of a ppufile, the methods
|
with ppufile handling. While describing the layout of a ppufile, the
|
||||||
which can be used for it are described.
|
methods which can be used for it are presented as well.
|
||||||
|
|
||||||
A unit file consists of basically five or six parts:
|
A unit file consists of basically five or six parts:
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
@ -3586,7 +3618,6 @@ definitions.
|
|||||||
units and inside this unit. Only available when the \var{uf\_has\_browser} flag is
|
units and inside this unit. Only available when the \var{uf\_has\_browser} flag is
|
||||||
set in the unit flags
|
set in the unit flags
|
||||||
\item A file implementation part (currently unused).
|
\item A file implementation part (currently unused).
|
||||||
implementation part.
|
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
|
|
||||||
\section{reading ppufiles}
|
\section{reading ppufiles}
|
||||||
@ -3688,8 +3719,9 @@ are definied in \file{ppu.pas} \\
|
|||||||
\section{The sections}
|
\section{The sections}
|
||||||
|
|
||||||
After this header follow the sections. All sections work the same!
|
After this header follow the sections. All sections work the same!
|
||||||
A section contains of entries and is ended with also an entry, but
|
A section consists of entries and ends also with an entry, but
|
||||||
containing the specific ibend constant (see \file{ppu.pas} for a list).
|
containing the specific \var{ibend} constant (see \file{ppu.pas} for a list
|
||||||
|
of constants).
|
||||||
|
|
||||||
Each entry starts with an entryheader.
|
Each entry starts with an entryheader.
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
@ -3702,12 +3734,12 @@ Each entry starts with an entryheader.
|
|||||||
|
|
||||||
\begin{tabular}{lp{10cm}}
|
\begin{tabular}{lp{10cm}}
|
||||||
field & Description \\ \hline
|
field & Description \\ \hline
|
||||||
id & this is 1 or 2 and can be check if it the entry is correctly
|
id & this is 1 or 2 and can be checked to see whether the entry is correctly
|
||||||
found. 1 means its a main entry, which says that it is part of the
|
found. 1 means its a main entry, which says that it is part of the
|
||||||
basic layout as explained before. 2 toggles that it it a sub entry
|
basic layout as explained before. 2 means that it it a sub entry
|
||||||
of a record or object \\
|
of a record or object. \\
|
||||||
nr & contains the ib constant number which determines what kind of
|
nr & contains the ib constant number which determines what kind of
|
||||||
entry it is \\
|
entry it is. \\
|
||||||
size & size of this entry without the header, can be used to skip entries
|
size & size of this entry without the header, can be used to skip entries
|
||||||
very easily. \\ \hline
|
very easily. \\ \hline
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
@ -3729,7 +3761,7 @@ A common way how this works is (example is for the symbols):
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Then you can parse each entry type yourself. \var{ppufile.readentry} will take
|
Then you can parse each entry type yourself. \var{ppufile.readentry} will take
|
||||||
care of skipping unread bytes in the entry an read the next entry
|
care of skipping unread bytes in the entry and reads the next entry
|
||||||
correctly! A special function is \var{skipuntilentry(untilb:byte):boolean;}
|
correctly! A special function is \var{skipuntilentry(untilb:byte):boolean;}
|
||||||
which will read the ppufile until it finds entry \var{untilb} in the main
|
which will read the ppufile until it finds entry \var{untilb} in the main
|
||||||
entries.
|
entries.
|
||||||
@ -3839,6 +3871,42 @@ about the structure of the compiler have a look at the
|
|||||||
Compiler Manual which contains also some informations about
|
Compiler Manual which contains also some informations about
|
||||||
compiler internals.
|
compiler internals.
|
||||||
|
|
||||||
|
The \file{compiler} directory contains a subdirectory \var{utils},
|
||||||
|
which contains mainly the utilities for creation and maintainance of the
|
||||||
|
message files.
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
% The compiler source tree
|
||||||
|
\section{The RTL source tree}
|
||||||
|
The RTL source tree is divided in many subdirectories, but is very
|
||||||
|
structured and easy to understand. It mainly consists of three parts:
|
||||||
|
|
||||||
|
\begin{enumerate}
|
||||||
|
\item A OS-dependent directory. This contains the files that are different for
|
||||||
|
each operating system. When compiling the RTL, you should do it here. The
|
||||||
|
following directories exist:
|
||||||
|
\begin{itemize}
|
||||||
|
\item \file{atari} for the atari. Not maintained any more.
|
||||||
|
\item \file{amiga} for the amiga. Not maintained any more.
|
||||||
|
\item \file{go32v1} For \dos, using the GO32v1 extender. Not maintained any
|
||||||
|
more.
|
||||||
|
\item \file{go32v2} For \dos, using the GO32v2 extender.
|
||||||
|
\item \file{linux} for \linux platforms. It has two subdirect
|
||||||
|
\item \file{os2} for \ostwo.
|
||||||
|
\item \file{win32} for Win32 platforms.
|
||||||
|
\end{itemize}
|
||||||
|
\item A processor dependent directory. This contains files that are system
|
||||||
|
independent, but processor dependent. It contains mostly optimized routines
|
||||||
|
for a specific processor. The following directories exist:
|
||||||
|
\begin{itemize}
|
||||||
|
\item \file{i386} for the Intel series of processors.
|
||||||
|
\item \file{m68k} for the motorola m68000 series of processors.
|
||||||
|
\end{itemize}
|
||||||
|
\item An OS-independent and Processor independent directory: \file{inc}. This
|
||||||
|
contains complete units, and include files containing interface parts of
|
||||||
|
units.
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
% Appendix C
|
% Appendix C
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
@ -3890,6 +3958,7 @@ this mode is selected by the \var{-So} switch.
|
|||||||
implementation of a function/procedure. In particular, you can omit the
|
implementation of a function/procedure. In particular, you can omit the
|
||||||
parameters when implementing the function or procedure.
|
parameters when implementing the function or procedure.
|
||||||
\item Overloading of functions is not allowed.
|
\item Overloading of functions is not allowed.
|
||||||
|
\item The Objpas unit is NOT loaded.
|
||||||
\item Nested comments are not allowed.
|
\item Nested comments are not allowed.
|
||||||
\item You can not use the cvar type.
|
\item You can not use the cvar type.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
@ -3911,11 +3980,12 @@ consequences of this is that the type \var{Integer} is redefined as
|
|||||||
This mode is selected by the \var{{\$MODE GPC}} switch. On the command-line,
|
This mode is selected by the \var{{\$MODE GPC}} switch. On the command-line,
|
||||||
this mode is selected by the \var{-Sp} switch.
|
this mode is selected by the \var{-Sp} switch.
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item You cmust use the address operator to assign procedural variables.
|
\item You must use the address operator to assign procedural variables.
|
||||||
\item A forward declaration must not be repeated exactly the same by the
|
\item A forward declaration must not be repeated exactly the same by the
|
||||||
implementation of a function/procedure. In particular, you can omit the
|
implementation of a function/procedure. In particular, you can omit the
|
||||||
parameters when implementing the function or procedure.
|
parameters when implementing the function or procedure.
|
||||||
\item Overloading of functions is not allowed.
|
\item Overloading of functions is not allowed.
|
||||||
|
\item The Objpas unit is NOT loaded.
|
||||||
\item Nested comments are not allowed.
|
\item Nested comments are not allowed.
|
||||||
\item You can not use the cvar type.
|
\item You can not use the cvar type.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
@ -4545,10 +4615,10 @@ systems:
|
|||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Only on GO32v2, it's called \file{system}.
|
\item Only on GO32v2, it's called \file{system}.
|
||||||
\item For \linux it's called \file{syslinux}.
|
\item For \linux it's called \file{syslinux}.
|
||||||
\item For \windowsnt it's calles \file{syswin32}.
|
\item For \windowsnt it's called \file{syswin32}.
|
||||||
\item For \ostwo it's called \file{sysos2}
|
\item For \ostwo it's called \file{sysos2}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
This unit resides in the OS-depentent subirectories of the RTL.
|
This unit resides in the OS-dependent subdirectories of the RTL.
|
||||||
\item[strings] The strings unit. This unit resides in the \file{inc}
|
\item[strings] The strings unit. This unit resides in the \file{inc}
|
||||||
subdirectory of the RTL.
|
subdirectory of the RTL.
|
||||||
\item[dos] The \file{dos} unit. It resides in the OS-dependent subdirectory
|
\item[dos] The \file{dos} unit. It resides in the OS-dependent subdirectory
|
||||||
@ -4615,7 +4685,7 @@ the compiler you're using.
|
|||||||
is on your system. If you want to compile with the RTL you compiled first,
|
is on your system. If you want to compile with the RTL you compiled first,
|
||||||
this should be \file{../rtl/OS} (replace the OS with the appropriate
|
this should be \file{../rtl/OS} (replace the OS with the appropriate
|
||||||
operating system subdirectory of the RTL).
|
operating system subdirectory of the RTL).
|
||||||
\item A define with the processor you're compiling for. is required.
|
\item A define with the processor you're compiling for. Required.
|
||||||
\item \var{-dGDB} is not strictly needed, but is better to add since
|
\item \var{-dGDB} is not strictly needed, but is better to add since
|
||||||
otherwise you won't be able to compile with debug information.
|
otherwise you won't be able to compile with debug information.
|
||||||
\item \var{-Sg} is needed, some parts of the compiler use \var{goto}
|
\item \var{-Sg} is needed, some parts of the compiler use \var{goto}
|
||||||
|
@ -3014,10 +3014,12 @@ The collection has reached its maximal size, and you are trying to add
|
|||||||
another element. (objects unit)
|
another element. (objects unit)
|
||||||
\item [216 General Protection fault]
|
\item [216 General Protection fault]
|
||||||
You are trying to access memory outside your appointed memory.
|
You are trying to access memory outside your appointed memory.
|
||||||
\item [217 Unhandled expetion occurred]
|
\item [217 Unhandled exception occurred]
|
||||||
An exception occurred, and there was no exception handler present.
|
An exception occurred, and there was no exception handler present.
|
||||||
The \file{sysutils} unit installs a default exception handler which catches
|
The \file{sysutils} unit installs a default exception handler which catches
|
||||||
all excpetions and exits gracefully.
|
all excpetions and exits gracefully.
|
||||||
|
\item [227 Assertion failed error]
|
||||||
|
An assertion failed, and no AssertErrorProc procedural variable was installed.
|
||||||
\end{description}
|
\end{description}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user