Free Pascal
Programmers' manual


____________________________________________________________________
Programmers' manual for Free Pascal, version 2.0.2
Document version 2.0
November 2005

Michaël Van Canneyt

____________________________________________________________________________
Contents
List of Tables
 0.1 About this document
1 Compiler directives
 1.1 Local directives
  1.1.1 $A or $ALIGN : Align Data
  1.1.2 $ASMMODE : Assembler mode (Intel 80x86 only)
  1.1.3 $B or $BOOLEVAL : Complete boolean evaluation
  1.1.4 $C or $ASSERTIONS : Assertion support
  1.1.5 $CALLING : Specify calling convention
  1.1.6 $CHECKPOINTER : Check pointer values
  1.1.7 $CODEALIGN : Set the code alignment
  1.1.8 $COPERATOR : Allow C like operators
  1.1.9 $DEFINE : Dene a symbol
  1.1.10 $ELSE : Switch conditional compilation
  1.1.11 $ELSEC : Switch conditional compilation
  1.1.12 $ENDC : End conditional compilation
  1.1.13 $ENDIF : End conditional compilation
  1.1.14 $ERROR : Generate error message
  1.1.15 $EXTENDEDSYM: Ignored
  1.1.16 $F : Far or near functions
  1.1.17 $FATAL : Generate fatal error message
  1.1.18 $FPUTYPE : Select coprocessor type
  1.1.19 $GOTO : Support Goto and Label
  1.1.20 $H or $LONGSTRINGS : Use AnsiStrings
  1.1.21 $HINT : Generate hint message
  1.1.22 $HINTS : Emit hints
  1.1.23 $HPPEMIT: Ignored
  1.1.24 $IF : Start conditional compilation
  1.1.25 $IFC : Start conditional compilation
  1.1.26 $IFDEF Name : Start conditional compilation
  1.1.27 $IFNDEF : Start conditional compilation
  1.1.28 $IFOPT : Start conditional compilation
  1.1.29 $IMPLICITEXCEPTIONS : Do not generate nalization code
  1.1.30 $INFO : Generate info message
  1.1.31 $INLINE : Allow inline code.
  1.1.32 $INTERFACES : Specify Interface type.
  1.1.33 $I or $IOCHECKS : Input/Output checking
  1.1.34 $I or $INCLUDE : Include le
  1.1.35 $I or $INCLUDE : Include compiler info
  1.1.36 $I386_XXX : Specify assembler format (Intel 80x86 only)
  1.1.37 $J or $WRITABLECONSTS : Allow typed consts
  1.1.38 $L or $LINK : Link object le
  1.1.39 $LINKLIB : Link to a library
  1.1.40 $M or $TYPEINFO : Generate type info
  1.1.41 $MACRO : Allow use of macros.
  1.1.42 $MAXFPUREGISTERS : Maximum number of FPU registers for variables
  1.1.43 $MESSAGE : Generate info message
  1.1.44 $MMX : Intel MMX support (Intel 80x86 only)
  1.1.45 $NODEFINE : Ignored
  1.1.46 $NOTE : Generate note message
  1.1.47 $NOTES : Emit notes
  1.1.48 $OBJECTCHECK : Check Object
  1.1.49 $OUTPUT_FORMAT : Specify the output format
  1.1.50 $PACKENUM : Minimum enumeration type size
  1.1.51 $PACKRECORDS : Alignment of record elements
  1.1.52 $Q $OVERFLOWCHECKS: Overow checking
  1.1.53 $R or $RANGECHECKS : Range checking
  1.1.54 $R or $RESOURCE : Include resource
  1.1.55 $SATURATION : Saturation operations (Intel 80x86 only)
  1.1.56 $SETC : Dene and assign a value to a symbol
  1.1.57 $STATIC : Allow use of Static keyword.
  1.1.58 $STOP : Generate fatal error message
  1.1.59 $T or $TYPEDADDRESS : Typed address operator (@)
  1.1.60 $UNDEF : Undene a symbol
  1.1.61 $V or $VARSTRINGCHECKS : Var-string checking
  1.1.62 $W or $STACKFRAMES : Generate stackframes
  1.1.63 $WAIT : Wait for enter key press
  1.1.64 $WARNING : Generate warning message
  1.1.65 $WARNINGS : Emit warnings
 1.2 Global directives
  1.2.1 $APPID : Specify application ID.
  1.2.2 $APPID : Specify application name.
  1.2.3 $APPTYPE : Specify type of application.
  1.2.4 $CALLING : Default calling convention
  1.2.5 $CODEPAGE : Set the source codepage
  1.2.6 $COPYRIGHT specify copyright info
  1.2.7 $D or $DEBUGINFO : Debugging symbols
  1.2.8 $DESCRIPTION : Application description
  1.2.9 $D $DEBUGINFO : Include debug info
  1.2.10 $E : Emulation of coprocessor
  1.2.11 $G : Generate 80286 code
  1.2.12 $INCLUDEPATH : Specify include path.
  1.2.13 $INTERFACES : Default interface type
  1.2.14 $L or $LOCALSYMBOLS : Local symbol information
  1.2.15 $LIBRARYPATH : Specify library path.
  1.2.16 $M or $MEMORY : Memory sizes
  1.2.17 $MODE : Set compiler compatibility mode
  1.2.18 $N : Numeric processing
  1.2.19 $O : Overlay code generation
  1.2.20 $OBJECTPATH : Specify object path.
  1.2.21 $P or $OPENSTRINGS : Use open strings
  1.2.22 $PROFILE : Proling
  1.2.23 $S : Stack checking
  1.2.24 $SCREENNAME : Specify screen name
  1.2.25 $SMARTLINK : Use smartlinking
  1.2.26 $THREADNAME : Set thread name in Netware
  1.2.27 $THREADING : Allow use of threads.
  1.2.28 $UNITPATH : Specify unit path.
  1.2.29 $VERSION : Specify DLL version.
  1.2.30 $WEAKPACKAGEUNIT : ignored
  1.2.31 $X or $EXTENDEDSYNTAX : Extended syntax
  1.2.32 $Y or $REFERENCEINFO : Insert Browser information
2 Using conditionals, messages and macros
 2.1 Conditionals
  2.1.1 Predened symbols
 2.2 Macros
 2.3 Compile time variables
 2.4 Compile time expressions
  2.4.1 Denition
  2.4.2 Usage
 2.5 Messages
3 Using Assembly language
 3.1 Using assembler in the sources
 3.2 Intel 80x86 Inline assembler
  3.2.1 Intel syntax
  3.2.2 AT&T Syntax
 3.3 Motorola 680x0 Inline assembler
 3.4 Signaling changed registers
4 Generated code
 4.1 Units
 4.2 Programs
5 Intel MMX support
 5.1 What is it about?
 5.2 Saturation support
 5.3 Restrictions of MMX support
 5.4 Supported MMX operations
 5.5 Optimizing MMX support
6 Code issues
 6.1 Register Conventions
  6.1.1 accumulator register
  6.1.2 accumulator 64-bit register
  6.1.3 oat result register
  6.1.4 self register
  6.1.5 frame pointer register
  6.1.6 stack pointer register
  6.1.7 scratch registers
  6.1.8 Processor mapping of registers
 6.2 Name mangling
  6.2.1 Mangled names for data blocks
  6.2.2 Mangled names for code blocks
  6.2.3 Modifying the mangled names
 6.3 Calling mechanism
 6.4 Nested procedure and functions
 6.5 Constructor and Destructor calls
  6.5.1 objects
  6.5.2 classes
 6.6 Entry and exit code
  6.6.1 Intel 80x86 standard routine prologue / epilogue
  6.6.2 Motorola 680x0 standard routine prologue / epilogue
 6.7 Parameter passing
  6.7.1 Parameter alignment
 6.8 Stack limitations
7 Linking issues
 7.1 Using external code and variables
  7.1.1 Declaring external functions or procedures
  7.1.2 Declaring external variables
  7.1.3 Declaring the calling convention modier
  7.1.4 Declaring the external object code
 7.2 Making libraries
  7.2.1 Exporting functions
  7.2.2 Exporting variables
  7.2.3 Compiling libraries
  7.2.4 Unit searching strategy
 7.3 Using smart linking
8 Memory issues
 8.1 The memory model.
 8.2 Data formats
  8.2.1 Integer types
  8.2.2 Char types
  8.2.3 Boolean types
  8.2.4 Enumeration types
  8.2.5 Floating point types
  8.2.6 Pointer types
  8.2.7 String types
  8.2.8 Set types
  8.2.9 Static array types
  8.2.10 Dynamic array types
  8.2.11 Record types
  8.2.12 Object types
  8.2.13 Class types
  8.2.14 File types
  8.2.15 Procedural types
 8.3 Data alignment
  8.3.1 Typed constants and variable alignment
  8.3.2 Structured types alignment
 8.4 The heap
  8.4.1 Heap allocation strategy
  8.4.2 The heap grows
  8.4.3 Debugging the heap
  8.4.4 Writing your own memory manager
 8.5 Using dos memory under the Go32 extender
 8.6 When porting Turbo Pascal code
9 Resource strings
 9.1 Introduction
 9.2 The resource string le
 9.3 Updating the string tables
 9.4 GNU gettext
 9.5 Caveat
10 Thread programming
 10.1 Introduction
 10.2 Programming threads
 10.3 Critical sections
 10.4 The Thread Manager
11 Optimizations
 11.1 Non processor specic
  11.1.1 Constant folding
  11.1.2 Constant merging
  11.1.3 Short cut evaluation
  11.1.4 Constant set inlining
  11.1.5 Small sets
  11.1.6 Range checking
  11.1.7 And instead of modulo
  11.1.8 Shifts instead of multiply or divide
  11.1.9 Automatic alignment
  11.1.10 Smart linking
  11.1.11 Inline routines
  11.1.12 Stack frame omission
  11.1.13 Register variables
 11.2 Processor specic
  11.2.1 Intel 80x86 specic
  11.2.2 Motorola 680x0 specic
 11.3 Optimization switches
 11.4 Tips to get faster code
 11.5 Tips to get smaller code
12 Programming shared libraries
 12.1 Introduction
 12.2 Creating a library
 12.3 Using a library in a pascal program
 12.4 Using a pascal library from a C program
 12.5 Some Windows issues
13 Using Windows resources
 13.1 The resource directive $R
 13.2 Creating resources
 13.3 Using string tables.
 13.4 Inserting version information
 13.5 Inserting an application icon
 13.6 Using a pascal preprocessor
A Anatomy of a unit le
 A.1 Basics
 A.2 reading ppules
 A.3 The Header
 A.4 The sections
 A.5 Creating ppules
B Compiler and RTL source tree structure
 B.1 The compiler source tree
 B.2 The RTL source tree
C Compiler limits
D Compiler modes
 D.1 FPC mode
 D.2 TP mode
 D.3 Delphi mode
 D.4 GPC mode
 D.5 OBJFPC mode
 D.6 MAC mode
E Using fpcmake
 E.1 Introduction
 E.2 Functionality
 E.3 Usage
 E.4 Format of the conguration le
  E.4.1 clean
  E.4.2 compiler
  E.4.3 Default
  E.4.4 Dist
  E.4.5 Install
  E.4.6 Package
  E.4.7 Prerules
  E.4.8 Requires
  E.4.9 Rules
  E.4.10 Target
 E.5 Programs needed to use the generated makele
 E.6 Variables that aect the generated makele
  E.6.1 Directory variables
  E.6.2 Compiler command-line variables
 E.7 Variables set by fpcmake
  E.7.1 Directory variables
  E.7.2 Target variables
  E.7.3 Compiler command-line variables
  E.7.4 Program names
  E.7.5 File extensions
  E.7.6 Target les
 E.8 Rules and targets created by fpcmake
  E.8.1 Pattern rules
  E.8.2 Build rules
  E.8.3 Cleaning rules
  E.8.4 archiving rules
  E.8.5 Installation rules
  E.8.6 Informative rules
F Compiling the compiler
 F.1 Introduction
 F.2 Before starting
 F.3 Compiling using make
 F.4 Compiling by hand
  F.4.1 Compiling the RTL
  F.4.2 Compiling the compiler
G Compiler denes during compilation
H Stack conguration
 H.1 DOS
 H.2 Linux
 H.3 Netbsd
 H.4 Freebsd
 H.5 BeOS
 H.6 Windows
 H.7 OS/2
 H.8 Amiga
 H.9 Atari
I Operating system specic behavior