mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 09:08:03 +02:00

* redesign of systems.pas to support assemblers and linkers + Unitname is now also in the PPU-file, increased version to 14
408 lines
9.9 KiB
ObjectPascal
408 lines
9.9 KiB
ObjectPascal
{
|
|
$Id$
|
|
Copyright (c) 1993-98 by Florian Klaempfl
|
|
|
|
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.
|
|
|
|
****************************************************************************}
|
|
|
|
{
|
|
possible compiler switches (* marks a currently required switch):
|
|
-----------------------------------------------------------------
|
|
USE_RHIDE generates errors and warning in an format recognized
|
|
by rhide
|
|
TP to compile the compiler with Turbo or Borland Pascal
|
|
GDB* support of the GNU Debugger
|
|
I386 generate a compiler for the Intel i386+
|
|
M68K generate a compiler for the M68000
|
|
MULLER release special debug code of Pierre Muller
|
|
(needs some extra units)
|
|
USEOVERLAY compiles a TP version which uses overlays
|
|
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
|
|
-----------------------------------------------------------------
|
|
|
|
Required switches for a i386 compiler be compiled by Free Pascal Compiler:
|
|
GDB;I386
|
|
|
|
Required switches for a i386 compiler be compiled by Turbo Pascal:
|
|
GDB;I386;TP
|
|
|
|
Required switches for a 68000 compiler be compiled by Turbo Pascal:
|
|
GDB;M68k;TP
|
|
}
|
|
|
|
{$ifdef FPC}
|
|
{$ifndef GDB}
|
|
{ people can try to compile without GDB }
|
|
{$error The compiler switch GDB must be defined}
|
|
{$endif GDB}
|
|
{ but I386 or M68K must be defined }
|
|
{ and only one of the two }
|
|
{$ifndef I386}
|
|
{$ifndef M68K}
|
|
{$fatalerror One of the switches I386 or M68K must be defined}
|
|
{$endif M68K}
|
|
{$endif I386}
|
|
{$ifdef I386}
|
|
{$ifdef M68K}
|
|
{$fatalerror ONLY one of the switches I386 or M68K must be defined}
|
|
{$endif M68K}
|
|
{$endif I386}
|
|
{$ifdef support_mmx}
|
|
{$ifndef i386}
|
|
{$fatalerror I386 switch must be on for MMX support}
|
|
{$endif i386}
|
|
{$endif support_mmx}
|
|
{$endif}
|
|
|
|
{$ifdef TP}
|
|
{$IFNDEF DPMI}
|
|
{$M 24576,0,655360}
|
|
{$ELSE}
|
|
{$M 65000}
|
|
{$ENDIF DPMI}
|
|
{$E+,N+,F+,S-,R-}
|
|
{$endif TP}
|
|
|
|
|
|
program pp;
|
|
|
|
{$IFDEF TP}
|
|
{$UNDEF PROFILE}
|
|
{$IFDEF DPMI}
|
|
{$UNDEF USEOVERLAY}
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
{$ifdef FPC}
|
|
{$UNDEF USEOVERLAY}
|
|
{$UNDEF USEPMD}
|
|
{$ENDIF}
|
|
|
|
uses
|
|
{$ifdef fpc}
|
|
{$ifdef GO32V2}
|
|
emu387,
|
|
dpmiexcp,
|
|
{$endif GO32V2}
|
|
{$endif}
|
|
{$ifdef useoverlay}
|
|
{$ifopt o+}
|
|
Overlay,ppovin,
|
|
{$else}
|
|
{ warn when not $O+ is used }
|
|
- You must compile with the $O+ switch
|
|
{$endif}
|
|
{$endif useoverlay}
|
|
{$ifdef lock}
|
|
lock,
|
|
{$endif lock}
|
|
{$ifdef profile}
|
|
profile,
|
|
{$endif profile}
|
|
{$ifdef muller}
|
|
openfile,
|
|
{$ifdef usepmd}
|
|
usepmd,
|
|
{$endif usepmd}
|
|
{$endif}
|
|
{$ifdef LINUX}
|
|
catch,
|
|
{$endif LINUX}
|
|
{$IfDef PMD}
|
|
OpenFile,
|
|
BBError,
|
|
ObjMemory,
|
|
PMD, MemCheck,
|
|
{$EndIf}
|
|
{$ifdef TP}
|
|
objects,
|
|
{$endif}
|
|
|
|
dos,cobjects,
|
|
globals,parser,systems,tree,symtable,options,link,import,files,
|
|
verb_def,verbose;
|
|
|
|
{$ifdef useoverlay}
|
|
{$O files}
|
|
{$O globals}
|
|
{$O hcodegen}
|
|
{$O pass_1}
|
|
{$O tree}
|
|
{$O types}
|
|
{$O objects}
|
|
{$O options}
|
|
{$O cobjects}
|
|
{$O globals}
|
|
{$O systems}
|
|
{$O parser}
|
|
{$O dos}
|
|
{$O scanner}
|
|
{$O symtable}
|
|
{$O objects}
|
|
{$O aasm}
|
|
{$ifdef gdb}
|
|
{$O gdb}
|
|
{$endif gdb}
|
|
{$ifdef i386}
|
|
{$O opts386}
|
|
{$O cgi386}
|
|
{$O aopt386}
|
|
{$O cgai386}
|
|
{$O i386}
|
|
{$O radi386}
|
|
{$O rai386}
|
|
{$O ratti386}
|
|
{$O tgeni386}
|
|
{$endif}
|
|
{$ifdef m68k}
|
|
{$O opts68k}
|
|
{$O cg68k}
|
|
{$O ra68k}
|
|
{$O ag68kgas}
|
|
{$endif}
|
|
{$endif useoverlay}
|
|
|
|
|
|
function print_status(const status : tcompilestatus) : boolean;
|
|
begin
|
|
print_status:=false;
|
|
if (abslines=1) then
|
|
Message1(general_i_kb_free,tostr(memavail shr 10));
|
|
if (status.currentline mod 100=0) then
|
|
Message2(general_l_lines_and_free,tostr(status.currentline),tostr(memavail shr 10));
|
|
{$ifdef tp}
|
|
if (use_big) then
|
|
begin
|
|
{$ifdef dpmi}
|
|
Message1(general_i_stream_kb_free,tostr(symbolstream.getsize shr 10));
|
|
{$else}
|
|
Message1(general_i_ems_kb_free,tostr(symbolstream.getsize shr 10));
|
|
{$endif}
|
|
end;
|
|
{$endif}
|
|
end;
|
|
|
|
|
|
function getrealtime : real;
|
|
var
|
|
h,m,s,s100 : word;
|
|
begin
|
|
dos.gettime(h,m,s,s100);
|
|
getrealtime:=h*3600.0+m*60.0+s+s100/100.0;
|
|
end;
|
|
|
|
|
|
|
|
var
|
|
oldexit : pointer;
|
|
procedure myexit;{$ifndef FPC}far;{$endif}
|
|
begin
|
|
exitproc:=oldexit;
|
|
{$ifdef tp}
|
|
if use_big then
|
|
symbolstream.done;
|
|
{$endif}
|
|
if (erroraddr<>nil) then
|
|
begin
|
|
case exitcode of
|
|
202 : begin
|
|
erroraddr:=nil;
|
|
Writeln('Error: Stack Overflow');
|
|
end;
|
|
203 : begin
|
|
erroraddr:=nil;
|
|
Writeln('Error: Out of memory');
|
|
end;
|
|
end;
|
|
{when the module is assigned, then the messagefile is also loaded}
|
|
if assigned(current_module) and assigned(current_module^.current_inputfile) then
|
|
Writeln('Compilation aborted at line ',current_module^.current_inputfile^.line_no);
|
|
end;
|
|
end;
|
|
|
|
|
|
{$ifdef tp}
|
|
procedure do_streamerror;
|
|
begin
|
|
if symbolstream.status=-2 then
|
|
WriteLn('Error: Not enough EMS memory')
|
|
else
|
|
WriteLn('Error: EMS Error ',symbolstream.status);
|
|
{$ifndef MULLER}
|
|
halt(1);
|
|
{$else MULLER}
|
|
runerror(190);
|
|
{$endif MULLER}
|
|
end;
|
|
|
|
{$ifdef USEOVERLAY}
|
|
function _heaperror(size:word):integer;far;
|
|
type
|
|
heaprecord=record
|
|
next:pointer;
|
|
values:longint;
|
|
end;
|
|
var
|
|
l,m:longint;
|
|
begin
|
|
l:=ovrgetbuf-ovrminsize;
|
|
if (size>maxavail) and (l>=size) then
|
|
begin
|
|
m:=((longint(size)+$3fff) and $ffffc000);
|
|
{Clear the overlay buffer.}
|
|
ovrclearbuf;
|
|
{Shrink it.}
|
|
ovrheapend:=ovrheapend-m shr 4;
|
|
heaprecord(ptr(ovrheapend,0)^).next:=freelist;
|
|
heaprecord(ptr(ovrheapend,0)^).values:=m shl 12;
|
|
heaporg:=ptr(ovrheapend,0);
|
|
freelist:=heaporg;
|
|
Writeln('Warning: Overlay buffer shrinked, because of memory shortage');
|
|
_heaperror:=2;
|
|
end
|
|
else
|
|
_heaperror:=0;
|
|
end;
|
|
{$endif USEOVERLAY}
|
|
{$endif TP}
|
|
|
|
|
|
|
|
var
|
|
start : real;
|
|
{$IfDef Extdebug}
|
|
EntryMemAvail : longint;
|
|
{$EndIf}
|
|
begin
|
|
oldexit:=exitproc;
|
|
exitproc:=@myexit;
|
|
{$ifdef linux}
|
|
heapblocks:=true;
|
|
{$else}
|
|
{$ifdef go32v2}
|
|
heapblocks:=true;
|
|
{$endif}
|
|
{$endif}
|
|
{$ifdef EXTDEBUG}
|
|
EntryMemAvail:=MemAvail;
|
|
{$endif}
|
|
{$ifdef MULLER}
|
|
{$ifdef DPMI}
|
|
HeapBlock:=$ff00;
|
|
{$endif DPMI}
|
|
{$endif MULLER}
|
|
{$ifdef TP}
|
|
{$IFDEF USEOVERLAY}
|
|
heaperror:=@_heaperror;
|
|
{$ENDIF USEOVERLAY}
|
|
if use_big then
|
|
begin
|
|
streamerror:=@do_streamerror;
|
|
{ symbolstream.init('TMPFILE',stcreate,16000); }
|
|
{$ifndef dpmi}
|
|
symbolstream.init(10000,4000000); {using ems streams}
|
|
{$else}
|
|
symbolstream.init(1000000,16000); {using memory streams}
|
|
{$endif}
|
|
if symbolstream.errorinfo=stiniterror then
|
|
do_streamerror;
|
|
{ write something, because pos 0 means nil pointer }
|
|
symbolstream.writestr(@inputfile);
|
|
end;
|
|
{$endif tp}
|
|
|
|
{$ifndef TP}
|
|
compilestatusproc:=@print_status;
|
|
{$else}
|
|
compilestatusproc:=print_status;
|
|
{$endif}
|
|
|
|
{ inits which need to be done before the arguments are parsed }
|
|
get_exepath;
|
|
init_tree;
|
|
globalsinit;
|
|
init_symtable;
|
|
linker.init;
|
|
|
|
{ read the arguments }
|
|
read_arguments;
|
|
|
|
{ inits which depend on arguments }
|
|
initparser;
|
|
initimport;
|
|
|
|
{show some info}
|
|
Message1(general_i_compilername,FixFileName(paramstr(0)));
|
|
Message1(general_i_unitsearchpath,unitsearchpath);
|
|
Message1(general_d_sourceos,source_os.name);
|
|
Message1(general_i_targetos,target_os.name);
|
|
Message1(general_u_exepath,exepath);
|
|
{$ifdef linux}
|
|
Message1(general_u_gcclibpath,librarysearchpath);
|
|
{$endif}
|
|
|
|
start:=getrealtime;
|
|
compile(inputdir+inputfile+inputextension,false);
|
|
if errorcount=0 then
|
|
begin
|
|
start:=getrealtime-start;
|
|
Message2(general_i_abslines_compiled,tostr(abslines),tostr(trunc(start))+'.'+tostr(trunc(frac(start)*10)));
|
|
end;
|
|
|
|
clearnodes;
|
|
done_symtable;
|
|
{$ifdef EXTDEBUG}
|
|
Comment(V_Info,'Memory lost = '+tostr(EntryMemAvail-MemAvail));
|
|
{$endif EXTDEBUG}
|
|
{ exits with error 1 if no codegeneration }
|
|
if errorcount=0 then
|
|
halt(0)
|
|
else
|
|
halt(1);
|
|
end.
|
|
{
|
|
$Log$
|
|
Revision 1.7 1998-05-04 17:54:28 peter
|
|
+ smartlinking works (only case jumptable left todo)
|
|
* redesign of systems.pas to support assemblers and linkers
|
|
+ Unitname is now also in the PPU-file, increased version to 14
|
|
|
|
Revision 1.6 1998/04/29 13:40:23 peter
|
|
+ heapblocks:=true
|
|
|
|
Revision 1.5 1998/04/29 10:33:59 pierre
|
|
+ added some code for ansistring (not complete nor working yet)
|
|
* corrected operator overloading
|
|
* corrected nasm output
|
|
+ started inline procedures
|
|
+ added starstarn : use ** for exponentiation (^ gave problems)
|
|
+ started UseTokenInfo cond to get accurate positions
|
|
|
|
Revision 1.3 1998/04/21 10:16:48 peter
|
|
* patches from strasbourg
|
|
* objects is not used anymore in the fpc compiled version
|
|
|
|
Revision 1.2 1998/04/07 13:19:47 pierre
|
|
* bugfixes for reset_gdb_info
|
|
in MEM parsing for go32v2
|
|
better external symbol creation
|
|
support for rhgdb.exe (lowercase file names)
|
|
}
|