fpc/compiler/new/pass_1.pas
2000-07-13 06:29:38 +00:00

197 lines
5.3 KiB
ObjectPascal

{
$Id$
Copyright (c) 1998-2000 by Florian Klaempfl
This unit implements the first pass of the code generator
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.
****************************************************************************
}
{$ifdef tp}
{$F+}
{$endif tp}
unit pass_1;
interface
uses
tree;
procedure firstpass(p : ptree);
procedure firstpassnode(p : pnode);
function do_firstpass(var p : ptree) : boolean;
function do_firstpassnode(var p : pnode) : boolean;
implementation
uses
globtype,systems,
cobjects,verbose,globals,
aasm,symtable,types,
cgbase,cpuasm,cpubase
{ not yet converted:
htypechk,tcadd,tccal,tccnv,tccon,tcflw,
tcinl,tcld,tcmat,tcmem,tcset
}
;
{*****************************************************************************
FirstPass
*****************************************************************************}
{$ifdef dummy}
type
firstpassproc = procedure(var p : ptree);
procedure firstnothing(var p : ptree);
begin
p^.resulttype:=voiddef;
end;
procedure firsterror(var p : ptree);
begin
p^.error:=true;
codegenerror:=true;
p^.resulttype:=generrordef;
end;
procedure firststatement(var p : ptree);
begin
{ left is the next statement in the list }
p^.resulttype:=voiddef;
{ no temps over several statements }
cleartempgen;
{ right is the statement itself calln assignn or a complex one }
firstpass(p^.right);
if (not (cs_extsyntax in aktmoduleswitches)) and
assigned(p^.right^.resulttype) and
(p^.right^.resulttype<>pdef(voiddef)) then
CGMessage(cg_e_illegal_expression);
if codegenerror then
exit;
p^.registers32:=p^.right^.registers32;
p^.registersfpu:=p^.right^.registersfpu;
{$ifdef SUPPORT_MMX}
p^.registersmmx:=p^.right^.registersmmx;
{$endif SUPPORT_MMX}
{ left is the next in the list }
firstpass(p^.left);
if codegenerror then
exit;
if p^.right^.registers32>p^.registers32 then
p^.registers32:=p^.right^.registers32;
if p^.right^.registersfpu>p^.registersfpu then
p^.registersfpu:=p^.right^.registersfpu;
{$ifdef SUPPORT_MMX}
if p^.right^.registersmmx>p^.registersmmx then
p^.registersmmx:=p^.right^.registersmmx;
{$endif}
end;
procedure firstasm(var p : ptree);
begin
procinfo.flags:=procinfo^.flags or pi_uses_asm;
end;
{$endif dummy}
procedure firstpassnode(p : pnode);
var
oldcodegenerror : boolean;
oldlocalswitches : tlocalswitches;
oldpos : tfileposinfo;
{$ifdef extdebug}
str1,str2 : string;
oldp : pnode;
not_first : boolean;
{$endif extdebug}
begin
oldcodegenerror:=codegenerror;
oldpos:=aktfilepos;
oldlocalswitches:=aktlocalswitches;
if not p^.error then
begin
codegenerror:=false;
aktfilepos:=p^.fileinfo;
aktlocalswitches:=p^.localswitches;
p^.pass_1;
aktlocalswitches:=oldlocalswitches;
aktfilepos:=oldpos;
p^.error:=codegenerror;
codegenerror:=codegenerror or oldcodegenerror;
end
else
codegenerror:=true;
end;
function do_firstpass(var p : ptree) : boolean;
begin
codegenerror:=false;
do_firstpass:=codegenerror;
end;
procedure firstpass(p : ptree);
begin
codegenerror:=false;
end;
function do_firstpassnode(var p : pnode) : boolean;
begin
codegenerror:=false;
firstpassnode(p);
do_firstpassnode:=codegenerror;
end;
end.
{
$Log$
Revision 1.1 2000-07-13 06:30:08 michael
+ Initial import
Revision 1.7 2000/01/07 01:14:54 peter
* updated copyright to 2000
Revision 1.6 1999/10/12 21:20:47 florian
* new codegenerator compiles again
Revision 1.5 1999/08/04 00:23:57 florian
* renamed i386asm and i386base to cpuasm and cpubase
Revision 1.4 1999/08/01 18:22:36 florian
* made it again compilable
Revision 1.3 1999/01/23 23:29:48 florian
* first running version of the new code generator
* when compiling exceptions under Linux fixed
Revision 1.2 1999/01/13 22:52:37 florian
+ YES, finally the new code generator is compilable, but it doesn't run yet :(
Revision 1.1 1998/12/26 15:20:31 florian
+ more changes for the new version
}