diff --git a/compiler/node.inc b/compiler/node.inc new file mode 100644 index 0000000000..be1f181de9 --- /dev/null +++ b/compiler/node.inc @@ -0,0 +1,301 @@ +{ + $Id$ + Copyright (c) 1999-2000 by Florian Klaempfl + + The declarations of the nodes for the new 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. + + **************************************************************************** +} + +{**************************************************************************** + TNODE + ****************************************************************************} + + constructor tnode.init; + + begin + inherited init; + treetype:=nothingn; + { this allows easier error tracing } + location.loc:=LOC_INVALID; + { save local info } + fileinfo:=aktfilepos; + localswitches:=aktlocalswitches; + resulttype:=nil; + registersint:=0; + registersfpu:=0; +{$ifdef SUPPORT_MMX} + registersmmx:=0; +{$endif SUPPORT_MMX} + flags:=[]; + end; + + destructor tnode.done; + + begin + { reference info } + if (location.loc in [LOC_MEM,LOC_REFERENCE]) and + assigned(location.reference.symbol) then + dispose(location.reference.symbol,done); +{$ifdef EXTDEBUG} + if firstpasscount>maxfirstpasscount then + maxfirstpasscount:=firstpasscount; +{$endif EXTDEBUG} + end; + + procedure tnode.pass_1; + + begin + if not(assigned(resulttype)) then + det_resulttype; + + det_temp; + end; + + procedure tnode.det_resulttype; + + begin + abstract; + end; + + procedure tnode.det_temp; + + begin + abstract; + end; + + procedure tnode.secondpass; + + begin + abstract; + end; + + procedure tnode.concattolist(l : plinkedlist); + + begin + l^.concat(@self); + end; + + function tnode.ischild(p : pnode) : boolean; + + begin + ischild:=false; + end; + +{$ifdef EXTDEBUG} + procedure tnode.dowrite; + + const treetype2str : array[ttreetyp] of string[20] = ( + 'addn', + 'muln', + 'subn', + 'divn', + 'symdifn', + 'modn', + 'assignn', + 'loadn', + 'rangen', + 'ltn', + 'lten', + 'gtn', + 'gten', + 'equaln', + 'unequaln', + 'inn', + 'orn', + 'xorn', + 'shrn', + 'shln', + 'slashn', + 'andn', + 'subscriptn', + 'derefn', + 'addrn', + 'doubleaddrn', + 'ordconstn', + 'typeconvn', + 'calln', + 'callparan', + 'realconstn', + 'fixconstn', + 'umminusn', + 'asmn', + 'vecn', + 'stringconstn', + 'funcretn', + 'selfn', + 'notn', + 'inlinen', + 'niln', + 'errorn', + 'typen', + 'hnewn', + 'hdisposen', + 'newn', + 'simpledisposen', + 'setelementn', + 'setconstn', + 'blockn', + 'statementn', + 'loopn', + 'ifn', + 'breakn', + 'continuen', + 'repeatn', + 'whilen', + 'forn', + 'exitn', + 'withn', + 'casen', + 'labeln', + 'goton', + 'simplenewn', + 'tryexceptn', + 'raisen', + 'switchesn', + 'tryfinallyn', + 'onn', + 'isn', + 'asn', + 'caretn', + 'failn', + 'starstarn', + 'procinlinen', + 'arrayconstructn', + 'arrayconstructrangen', + 'nothingn', + 'loadvmtn', + 'pointerconstn'); + + begin + write(indention,'(',treetype2str[treetype]); + end; +{$endif EXTDEBUG} + +{**************************************************************************** + TUNARYNODE + ****************************************************************************} + + constructor tunarynode.init(l : pnode); + + begin + inherited init; + left:=l; + end; + +{$ifdef extdebug} + procedure tunarynode.dowrite; + + begin + inherited dowrite; + writeln(','); + writenode(left); + writeln(')'); + dec(byte(indention[0]),2); + end; +{$endif} + + procedure tunarynode.concattolist(l : plinkedlist); + + begin + left^.parent:=@self; + left^.concattolist(l); + inherited concattolist(l); + end; + + function tunarynode.ischild(p : pnode) : boolean; + + begin + ischild:=p=left; + end; + + procedure tunarynode.det_resulttype; + + begin + left^.det_resulttype; + end; + + procedure tunarynode.det_temp; + + begin + left^.det_temp; + end; + +{**************************************************************************** + TBINARYNODE + ****************************************************************************} + + constructor tbinarynode.init(l,r : pnode); + + begin + inherited init(l); + right:=r + end; + + procedure tbinarynode.concattolist(l : plinkedlist); + + begin + { we could change that depending on the number of } + { required registers } + left^.parent:=@self; + left^.concattolist(l); + left^.parent:=@self; + left^.concattolist(l); + inherited concattolist(l); + end; + + function tbinarynode.ischild(p : pnode) : boolean; + + begin + ischild:=(p=right) or (p=right); + end; + + procedure tbinarynode.det_resulttype; + + begin + left^.det_resulttype; + right^.det_resulttype; + end; + + procedure tbinarynode.det_temp; + + begin + left^.det_temp; + right^.det_temp; + end; + +{**************************************************************************** + TBINOPYNODE + ****************************************************************************} + + constructor tbinopnode.init(l,r : pnode); + + begin + inherited init(l,r); + swaped:=false; + end; + +{ + $Log$ + Revision 1.1 2000-02-21 08:45:26 michael + Committed for Florian. + + Revision 1.1 2000/02/20 20:49:45 florian + * newcg is compiling + * fixed the dup id problem reported by Paul Y. + +} \ No newline at end of file