summaryrefslogtreecommitdiff
path: root/compiler/pp.pas
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/pp.pas')
-rw-r--r--compiler/pp.pas207
1 files changed, 207 insertions, 0 deletions
diff --git a/compiler/pp.pas b/compiler/pp.pas
new file mode 100644
index 0000000000..5d7c4b5c3e
--- /dev/null
+++ b/compiler/pp.pas
@@ -0,0 +1,207 @@
+{
+ Copyright (c) 1998-2002 by Florian Klaempfl
+
+ Commandline compiler for Free Pascal
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ ****************************************************************************
+}
+program pp;
+
+{
+ possible compiler switches:
+ -----------------------------------------------------------------
+ CMEM use cmem unit for better memory debugging
+ I386 generate a compiler for the Intel i386+
+ x86_64 generate a compiler for the AMD x86-64 architecture
+ M68K generate a compiler for the M68000
+ SPARC generate a compiler for SPARC
+ POWERPC generate a compiler for the PowerPC
+ POWERPC64 generate a compiler for the PowerPC64 architecture
+ VIS generate a compile for the VIS
+ DEBUG version with debug code is generated
+ EXTDEBUG some extra debug code is executed
+ SUPPORT_MMX only i386: releases the compiler switch
+ MMX which allows the compiler to generate
+ MMX instructions
+ EXTERN_MSG Don't compile the msgfiles in the compiler, always
+ use external messagefiles, default for TP
+ TEST_GENERIC Test Generic version of code generator
+ (uses generic RTL calls)
+ -----------------------------------------------------------------
+ cpuflags The target processor has status flags (on by default)
+ cpufpemu The target compiler will also support emitting software
+ floating point operations
+ cpu64bit The target is a 64-bit processor
+ -----------------------------------------------------------------
+
+ Required switches for a i386 compiler be compiled by Free Pascal Compiler:
+ I386
+}
+
+{$i fpcdefs.inc}
+
+{$ifdef FPC}
+ { exactly one target CPU must be defined }
+ {$ifdef I386}
+ {$ifdef CPUDEFINED}
+ {$fatal ONLY one of the switches for the CPU type must be defined}
+ {$endif CPUDEFINED}
+ {$define CPUDEFINED}
+ {$endif I386}
+ {$ifdef x86_64}
+ {$ifdef CPUDEFINED}
+ {$fatal ONLY one of the switches for the CPU type must be defined}
+ {$endif CPUDEFINED}
+ {$define CPUDEFINED}
+ {$endif x86_64}
+ {$ifdef M68K}
+ {$ifdef CPUDEFINED}
+ {$fatal ONLY one of the switches for the CPU type must be defined}
+ {$endif CPUDEFINED}
+ {$define CPUDEFINED}
+ {$endif M68K}
+ {$ifdef vis}
+ {$ifdef CPUDEFINED}
+ {$fatal ONLY one of the switches for the CPU type must be defined}
+ {$endif CPUDEFINED}
+ {$define CPUDEFINED}
+ {$endif}
+ {$ifdef iA64}
+ {$ifdef CPUDEFINED}
+ {$fatal ONLY one of the switches for the CPU type must be defined}
+ {$endif CPUDEFINED}
+ {$define CPUDEFINED}
+ {$endif iA64}
+ {$ifdef POWERPC}
+ {$ifdef CPUDEFINED}
+ {$fatal ONLY one of the switches for the CPU type must be defined}
+ {$endif CPUDEFINED}
+ {$define CPUDEFINED}
+ {$endif POWERPC}
+ {$ifdef POWERPC64}
+ {$ifdef CPUDEFINED}
+ {$fatal ONLY one of the switches for the CPU type must be defined}
+ {$endif CPUDEFINED}
+ {$define CPUDEFINED}
+ {$endif POWERPC64}
+ {$ifdef ALPHA}
+ {$ifdef CPUDEFINED}
+ {$fatal ONLY one of the switches for the CPU type must be defined}
+ {$endif CPUDEFINED}
+ {$define CPUDEFINED}
+ {$endif ALPHA}
+ {$ifdef SPARC}
+ {$ifdef CPUDEFINED}
+ {$fatal ONLY one of the switches for the CPU type must be defined}
+ {$endif CPUDEFINED}
+ {$define CPUDEFINED}
+ {$endif SPARC}
+ {$ifdef ARM}
+ {$ifdef CPUDEFINED}
+ {$fatal ONLY one of the switches for the CPU type must be defined}
+ {$endif CPUDEFINED}
+ {$define CPUDEFINED}
+ {$endif ARM}
+ {$ifdef MIPS}
+ {$ifdef CPUDEFINED}
+ {$fatal ONLY one of the switches for the CPU type must be defined}
+ {$endif CPUDEFINED}
+ {$define CPUDEFINED}
+ {$endif MIPS}
+ {$ifndef CPUDEFINED}
+ {$fatal A CPU type switch must be defined}
+ {$endif CPUDEFINED}
+ {$ifdef support_mmx}
+ {$ifndef i386}
+ {$fatal I386 switch must be on for MMX support}
+ {$endif i386}
+ {$endif support_mmx}
+{$endif}
+
+uses
+{$ifdef cmem}
+ cmem,
+{$endif cmem}
+{$ifdef FPC}
+ {$ifdef profile}
+ profile,
+ {$endif profile}
+ {$ifndef NOCATCH}
+ {$ifdef Unix}
+ catch,
+ {$endif}
+ {$ifdef go32v2}
+ catch,
+ {$endif}
+ {$ifdef WATCOM}
+ catch,
+ {$endif}
+ {$endif NOCATCH}
+{$endif FPC}
+ globals,compiler;
+
+var
+ oldexit : pointer;
+procedure myexit;
+begin
+ exitproc:=oldexit;
+{$ifdef nocatch}
+ exit;
+{$endif nocatch}
+{ Show Runtime error if there was an error }
+ if (erroraddr<>nil) then
+ begin
+ case exitcode of
+ 100:
+ begin
+ erroraddr:=nil;
+ writeln('Error while reading file');
+ end;
+ 101:
+ begin
+ erroraddr:=nil;
+ writeln('Error while writing file');
+ end;
+ 202:
+ begin
+ erroraddr:=nil;
+ writeln('Error: Stack Overflow');
+ end;
+ 203:
+ begin
+ erroraddr:=nil;
+ writeln('Error: Out of memory');
+ end;
+ end;
+ { we cannot use aktfilepos.file because all memory might have been
+ freed already !
+ But we can use global parser_current_file var }
+ Writeln('Compilation aborted ',parser_current_file,':',aktfilepos.line);
+ end;
+end;
+
+begin
+ oldexit:=exitproc;
+ exitproc:=@myexit;
+{$ifdef extheaptrc}
+ keepreleased:=true;
+{$endif extheaptrc}
+ SetFPUExceptionMask([exInvalidOp, exDenormalized, exZeroDivide,
+ exOverflow, exUnderflow, exPrecision]);
+{ Call the compiler with empty command, so it will take the parameters }
+ Halt(compiler.Compile(''));
+end.