fpc/compiler/parser.pas
florian 3233d4aeb7 * handling of private and protected fixed
+ change_keywords_to_tp implemented to remove
    keywords which aren't supported by tp
  * break and continue are now symbols of the system unit
  + widestring, longstring and ansistring type released
1998-05-01 16:38:44 +00:00

947 lines
31 KiB
ObjectPascal

{
$Id$
Copyright (c) 1993-98 by Florian Klaempfl
This unit does the parsing process
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}
{$E+,N+,D+,F+}
{$endif}
unit parser;
interface
procedure compile(const filename:string;compile_system:boolean);
procedure initparser;
implementation
uses
dos,cobjects,globals,scanner,systems,symtable,tree,aasm,
types,strings,pass_1,hcodegen,files,verbose,script,import
{$ifdef i386}
,i386
,cgi386
,cgai386
,tgeni386
,aopt386
{$endif i386}
{$ifdef m68k}
,m68k
,cg68k
,tgen68k
,cga68k
{$endif m68k}
{ parser units }
,pbase,pmodules,pdecl,
{ assembling & linking }
assemble,
link;
{ dummy variable for search when calling exec }
var
file_found : boolean;
procedure readconstdefs;
begin
s32bitdef:=porddef(globaldef('longint'));
u32bitdef:=porddef(globaldef('ulong'));
cstringdef:=pstringdef(globaldef('string'));
clongstringdef:=pstringdef(globaldef('longstring'));
cansistringdef:=pstringdef(globaldef('ansistring'));
cwidestringdef:=pstringdef(globaldef('widestring'));
cchardef:=porddef(globaldef('char'));
{$ifdef i386}
c64floatdef:=pfloatdef(globaldef('s64real'));
{$endif}
{$ifdef m68k}
c64floatdef:=pfloatdef(globaldef('s32real'));
{$endif m68k}
s80floatdef:=pfloatdef(globaldef('s80real'));
s32fixeddef:=pfloatdef(globaldef('cs32fixed'));
voiddef:=porddef(globaldef('void'));
u8bitdef:=porddef(globaldef('byte'));
u16bitdef:=porddef(globaldef('word'));
booldef:=porddef(globaldef('boolean'));
voidpointerdef:=ppointerdef(globaldef('void_pointer'));
cfiledef:=pfiledef(globaldef('file'));
end;
procedure initparser;
begin
forwardsallowed:=false;
{ ^M means a string or a char, because we don't parse a }
{ type declaration }
block_type:=bt_general;
ignore_equal:=false;
{ we didn't parse a object or class declaration }
{ and no function header }
testcurobject:=0;
{ create error defintion }
generrordef:=new(perrordef,init);
symtablestack:=nil;
{ a long time, this was forgotten }
aktprocsym:=nil;
current_module:=nil;
loaded_units.init;
usedunits.init;
end;
{ moved out to save stack }
var
addparam : string;
procedure compile(const filename:string;compile_system:boolean);
var
hp : pmodule;
comp_unit : boolean;
{ some variables to save the compiler state }
oldtoken : ttoken;
{$ifdef UseTokenInfo}
oldtokeninfo : ptokeninfo;
{$endif UseTokenInfo}
oldpattern : stringid;
oldpreprocstack : ppreprocstack;
oldorgpattern,oldprocprefix : string;
old_block_type : tblock_type;
oldinputbuffer,
oldinputpointer : pchar;
olds_point,oldparse_only : boolean;
oldc : char;
oldcomment_level : word;
oldimports,oldexports,oldresource,oldrttilist,
oldbsssegment,olddatasegment,oldcodesegment,
oldexprasmlist,olddebuglist,
oldinternals,oldexternals,oldconsts : paasmoutput;
oldnextlabelnr : longint;
oldswitches : Tcswitches;
oldmacros,oldrefsymtable,oldsymtablestack : psymtable;
procedure def_macro(const s : string);
var
mac : pmacrosym;
begin
mac:=pmacrosym(macros^.search(s));
if mac=nil then
begin
mac:=new(pmacrosym,init(s));
Message1(parser_m_macro_defined,mac^.name);
macros^.insert(mac);
end;
mac^.defined:=true;
end;
procedure set_macro(const s : string;value : string);
var
mac : pmacrosym;
begin
mac:=pmacrosym(macros^.search(s));
if mac=nil then
begin
mac:=new(pmacrosym,init(s));
macros^.insert(mac);
end
else
begin
if assigned(mac^.buftext) then
freemem(mac^.buftext,mac^.buflen);
end;
Message2(parser_m_macro_set_to,mac^.name,value);
mac^.buflen:=length(value);
getmem(mac^.buftext,mac^.buflen);
move(value[1],mac^.buftext^,mac^.buflen);
mac^.defined:=true;
end;
procedure define_macros;
var
hp : pstring_item;
begin
hp:=pstring_item(commandlinedefines.first);
while assigned(hp) do
begin
def_macro(hp^.str^);
hp:=pstring_item(hp^.next);
end;
{ set macros for version checking }
set_macro('FPC_VERSION',version_nr);
set_macro('FPC_RELEASE',release_nr);
set_macro('FPC_PATCH',patch_nr);
end;
label
done;
begin {compile}
inc(compile_level);
{ save old state }
{ save symtable state }
oldsymtablestack:=symtablestack;
symtablestack:=nil;
oldrefsymtable:=refsymtable;
refsymtable:=nil;
oldprocprefix:=procprefix;
{ a long time, this was only in init_parser
but it should be reset to zero for each module }
aktprocsym:=nil;
{ first, we assume a program }
if not(assigned(current_module)) then
begin
{!!!}
current_module:=new(pmodule,init(filename,false));
main_module:=current_module;
end;
{ reset flags }
current_module^.flags:=0;
{ ... and crc }
current_module^.crc:=0;
{ save scanner state }
oldmacros:=macros;
oldpattern:=pattern;
oldtoken:=token;
{$ifdef UseTokenInfo}
oldtokeninfo:=tokeninfo;
{$endif UseTokenInfo}
oldorgpattern:=orgpattern;
old_block_type:=block_type;
oldpreprocstack:=preprocstack;
oldinputbuffer:=inputbuffer;
oldinputpointer:=inputpointer;
olds_point:=s_point;
oldc:=c;
oldcomment_level:=comment_level;
oldparse_only:=parse_only;
{ save assembler lists }
olddatasegment:=datasegment;
oldbsssegment:=bsssegment;
oldcodesegment:=codesegment;
olddebuglist:=debuglist;
oldexternals:=externals;
oldinternals:=internals;
oldconsts:=consts;
oldrttilist:=rttilist;
oldexprasmlist:=exprasmlist;
oldimports:=importssection;
oldexports:=exportssection;
oldresource:=resourcesection;
oldswitches:=aktswitches;
oldnextlabelnr:=nextlabelnr;
Message1(parser_i_compiling,filename);
InitScanner(filename);
aktswitches:=initswitches;
{ we need this to make the system unit }
if compile_system then
aktswitches:=aktswitches+[cs_compilesystem];
aktpackrecords:=initpackrecords;
{ init code generator for a new module }
codegen_newmodule;
macros:=new(psymtable,init(macrosymtable));
define_macros;
{ startup scanner }
{$ifndef UseTokenInfo}
token:=yylex;
{$else UseTokenInfo}
tokeninfo:=yylex;
token:=tokeninfo^.token;
{$endif UseTokenInfo}
reset_gdb_info;
{ init asm writing }
datasegment:=new(paasmoutput,init);
codesegment:=new(paasmoutput,init);
bsssegment:=new(paasmoutput,init);
debuglist:=new(paasmoutput,init);
externals:=new(paasmoutput,init);
internals:=new(paasmoutput,init);
consts:=new(paasmoutput,init);
rttilist:=new(paasmoutput,init);
importssection:=nil;
exportssection:=nil;
resourcesection:=nil;
{ global switches are read, so further changes aren't allowed }
current_module^.in_main:=true;
{ open assembler response }
if (compile_level=1) then
AsmRes.Init('ppas');
{ if the current file isn't a system unit }
{ the the system unit will be loaded }
if not(cs_compilesystem in aktswitches) then
begin
{ should be done in unit system (changing the field system_unit)
FK
}
hp:=loadunit(upper(target_info.system_unit),true,true);
systemunit:=hp^.symtable;
readconstdefs;
{ we could try to overload caret by default }
symtablestack:=systemunit;
{ if POWER is defined in the RTL then use it for starstar overloading }
getsym('POWER',false);
if assigned(srsym) and (srsym^.typ=procsym) and
(overloaded_operators[STARSTAR]=nil) then
overloaded_operators[STARSTAR]:=pprocsym(srsym);
end
else
begin
{ create definitions for constants }
registerdef:=false;
s32bitdef:=new(porddef,init(s32bit,$80000000,$7fffffff));
u32bitdef:=new(porddef,init(u32bit,0,$ffffffff));
cstringdef:=new(pstringdef,init(255));
{ should we give a length to the default long and ansi string definition ?? }
clongstringdef:=new(pstringdef,longinit(-1));
cansistringdef:=new(pstringdef,ansiinit(-1));
cwidestringdef:=new(pstringdef,wideinit(-1));
cchardef:=new(porddef,init(uchar,0,255));
{$ifdef i386}
c64floatdef:=new(pfloatdef,init(s64real));
s80floatdef:=new(pfloatdef,init(s80real));
{$endif}
{$ifdef m68k}
c64floatdef:=new(pfloatdef,init(s32real));
if (cs_fp_emulation in aktswitches) then
s80floatdef:=new(pfloatdef,init(s32real))
else
s80floatdef:=new(pfloatdef,init(s80real));
{$endif}
s32fixeddef:=new(pfloatdef,init(f32bit));
{ some other definitions }
voiddef:=new(porddef,init(uvoid,0,0));
u8bitdef:=new(porddef,init(u8bit,0,255));
u16bitdef:=new(porddef,init(u16bit,0,65535));
booldef:=new(porddef,init(bool8bit,0,1));
voidpointerdef:=new(ppointerdef,init(voiddef));
cfiledef:=new(pfiledef,init(ft_untyped,nil));
systemunit:=nil;
end;
registerdef:=true;
{ current return type is void }
procinfo.retdef:=voiddef;
{ reset lexical level }
lexlevel:=0;
{ parse source }
{***BUGFIX}
if (token=_UNIT) or (compile_level>1) then
begin
{If the compile level > 1 we get a nice "unit expected" error
message if we are trying to use a program as unit.}
proc_unit;
if current_module^.compiled then
goto done;
comp_unit:=true;
end
else
begin
proc_program(token=_LIBRARY);
comp_unit:=false;
end;
{ Why? The definition of Pascal requires that everything
after 'end.' is ignored!
if not(cs_tp_compatible in aktswitches) then
consume(_EOF); }
if errorcount=0 then
begin
if current_module^.uses_imports then
importlib^.generatelib;
GenerateAsm(filename);
{ Check linking => we are at first level in compile }
if (compile_level=1) then
begin
if Linker.ExeName='' then
Linker.SetFileName(FileName);
if (comp_unit) then
begin
Linker.Make_Library;
end
else
begin
if (cs_no_linking in initswitches) then
externlink:=true;
Linker.Link;
end;
end;
end
else
begin
Message1(unit_e_total_errors,tostr(errorcount));
Message(unit_f_errors_in_unit);
end;
{ clear memory }
{$ifdef Splitheap}
if testsplit then
begin
{ temp heap should be empty after that !!!}
codegen_donemodule;
Releasetempheap;
end;
{else
codegen_donemodule;}
{$endif Splitheap}
{ restore old state }
{ if already compiled jumps directly here }
done:
{ close trees }
if dispose_asm_lists then
begin
dispose(datasegment,Done);
dispose(codesegment,Done);
dispose(bsssegment,Done);
dispose(debuglist,Done);
dispose(externals,Done);
dispose(internals,Done);
dispose(consts,Done);
end;
reset_gdb_info;
{ restore symtable state }
{$ifdef UseBrowser}
if (compile_level>1) then
{ we want to keep the current symtablestack }
{$endif UseBrowser}
begin
refsymtable:=oldrefsymtable;
symtablestack:=oldsymtablestack;
end;
procprefix:=oldprocprefix;
{ close the inputfiles }
{$ifndef UseBrowser}
{ but not if we want the names for the browser ! }
current_module^.sourcefiles.done;
{$endif not UseBrowser}
{ restore scanner state }
pattern:=oldpattern;
token:=oldtoken;
{$ifdef UseTokenInfo}
tokeninfo:=oldtokeninfo;
{$endif UseTokenInfo}
orgpattern:=oldorgpattern;
block_type:=old_block_type;
{ call donescanner before restoring preprocstack, because }
{ donescanner tests for a empty preprocstack }
{ and can also check for unused macros }
donescanner(current_module^.compiled);
dispose(macros,done);
macros:=oldmacros;
preprocstack:=oldpreprocstack;
aktswitches:=oldswitches;
inputbuffer:=oldinputbuffer;
inputpointer:=oldinputpointer;
s_point:=olds_point;
c:=oldc;
comment_level:=oldcomment_level;
parse_only:=oldparse_only;
{ restore asmlists }
datasegment:=olddatasegment;
bsssegment:=oldbsssegment;
codesegment:=oldcodesegment;
debuglist:=olddebuglist;
externals:=oldexternals;
internals:=oldinternals;
importssection:=oldimports;
exportssection:=oldexports;
resourcesection:=oldresource;
nextlabelnr:=oldnextlabelnr;
exprasmlist:=oldexprasmlist;
consts:=oldconsts;
nextlabelnr:=oldnextlabelnr;
if (compile_level=1) then
begin
if (not AsmRes.Empty) then
begin
Message1(exec_i_closing_script,AsmRes.Fn);
AsmRes.WriteToDisk;
end;
end;
dec(compile_level);
end;
end.
{
$Log$
Revision 1.11 1998-05-01 16:38:45 florian
* handling of private and protected fixed
+ change_keywords_to_tp implemented to remove
keywords which aren't supported by tp
* break and continue are now symbols of the system unit
+ widestring, longstring and ansistring type released
Revision 1.10 1998/05/01 07:43:56 florian
+ basics for rtti implemented
+ switch $m (generate rtti for published sections)
Revision 1.9 1998/04/30 15:59:40 pierre
* GDB works again better :
correct type info in one pass
+ UseTokenInfo for better source position
* fixed one remaining bug in scanner for line counts
* several little fixes
Revision 1.8 1998/04/29 10:33:55 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.7 1998/04/27 23:10:28 peter
+ new scanner
* $makelib -> if smartlink
* small filename fixes pmodule.setfilename
* moved import from files.pas -> import.pas
Revision 1.6 1998/04/21 10:16:48 peter
* patches from strasbourg
* objects is not used anymore in the fpc compiled version
Revision 1.5 1998/04/10 14:41:43 peter
* removed some Hints
* small speed optimization for AsmLn
Revision 1.4 1998/04/08 16:58:03 pierre
* several bugfixes
ADD ADC and AND are also sign extended
nasm output OK (program still crashes at end
and creates wrong assembler files !!)
procsym types sym in tdef removed !!
Revision 1.3 1998/04/07 22:45:04 florian
* bug0092, bug0115 and bug0121 fixed
+ packed object/class/array
Revision 1.2 1998/03/26 11:18:30 florian
- switch -Sa removed
- support of a:=b:=0 removed
Revision 1.1.1.1 1998/03/25 11:18:12 root
* Restored version
Revision 1.60 1998/03/24 21:48:32 florian
* just a couple of fixes applied:
- problem with fixed16 solved
- internalerror 10005 problem fixed
- patch for assembler reading
- small optimizer fix
- mem is now supported
Revision 1.59 1998/03/20 23:31:33 florian
* bug0113 fixed
* problem with interdepened units fixed ("options.pas problem")
* two small extensions for future AMD 3D support
Revision 1.58 1998/03/13 22:45:58 florian
* small bug fixes applied
Revision 1.57 1998/03/10 17:19:29 peter
* fixed bug0108
* better linebreak scanning (concentrated in nextchar(), it supports
#10, #13, #10#13, #13#10
Revision 1.56 1998/03/10 16:27:40 pierre
* better line info in stabs debug
* symtabletype and lexlevel separated into two fields of tsymtable
+ ifdef MAKELIB for direct library output, not complete
+ ifdef CHAINPROCSYMS for overloaded seach across units, not fully
working
+ ifdef TESTFUNCRET for setting func result in underfunction, not
working
Revision 1.55 1998/03/10 12:54:06 peter
* def_symbol renamed to def_macro and use it in defines_macros
Revision 1.54 1998/03/10 01:17:22 peter
* all files have the same header
* messages are fully implemented, EXTDEBUG uses Comment()
+ AG... files for the Assembler generation
Revision 1.53 1998/03/06 00:52:34 peter
* replaced all old messages from errore.msg, only ExtDebug and some
Comment() calls are left
* fixed options.pas
Revision 1.52 1998/03/02 16:00:37 peter
* -Ch works again
Revision 1.51 1998/03/02 13:38:44 peter
+ importlib object
* doesn't crash on a systemunit anymore
* updated makefile and depend
Revision 1.49 1998/02/28 00:20:31 florian
* more changes to get import libs for Win32 working
Revision 1.48 1998/02/27 22:27:56 florian
+ win_targ unit
+ support of sections
+ new asmlists: sections, exports and resource
Revision 1.47 1998/02/24 10:29:17 peter
* -a works again
Revision 1.46 1998/02/24 00:19:14 peter
* makefile works again (btw. linux does like any char after a \ )
* removed circular unit with assemble and files
* fixed a sigsegv in pexpr
* pmodule init unit/program is the almost the same, merged them
Revision 1.45 1998/02/22 23:03:25 peter
* renamed msource->mainsource and name->unitname
* optimized filename handling, filename is not seperate anymore with
path+name+ext, this saves stackspace and a lot of fsplit()'s
* recompiling of some units in libraries fixed
* shared libraries are working again
+ $LINKLIB <lib> to support automatic linking to libraries
+ libraries are saved/read from the ppufile, also allows more libraries
per ppufile
Revision 1.44 1998/02/19 00:11:04 peter
* fixed -g to work again
* fixed some typos with the scriptobject
Revision 1.43 1998/02/18 13:48:12 michael
+ Implemented an OS independent AsmRes object.
Revision 1.42 1998/02/17 21:20:54 peter
+ Script unit
+ __EXIT is called again to exit a program
- target_info.link/assembler calls
* linking works again for dos
* optimized a few filehandling functions
* fixed stabs generation for procedures
Revision 1.41 1998/02/16 12:51:35 michael
+ Implemented linker object
Revision 1.40 1998/02/15 21:16:25 peter
* all assembler outputs supported by assemblerobject
* cleanup with assembleroutputs, better .ascii generation
* help_constructor/destructor are now added to the externals
- generation of asmresponse is not outputformat depended
Revision 1.39 1998/02/14 01:45:26 peter
* more fixes
- pmode target is removed
- search_as_ld is removed, this is done in the link.pas/assemble.pas
+ findexe() to search for an executable (linker,assembler,binder)
Revision 1.38 1998/02/13 22:26:33 peter
* fixed a few SigSegv's
* INIT$$ was not written for linux!
* assembling and linking works again for linux and dos
+ assembler object, only attasmi3 supported yet
* restore pp.pas with AddPath etc.
Revision 1.37 1998/02/13 10:35:17 daniel
* Made Motorola version compilable.
* Fixed optimizer
Revision 1.36 1998/02/12 17:19:12 florian
* fixed to get remake3 work, but needs additional fixes (output, I don't like
also that aktswitches isn't a pointer)
Revision 1.35 1998/02/12 11:50:16 daniel
Yes! Finally! After three retries, my patch!
Changes:
Complete rewrite of psub.pas.
Added support for DLL's.
Compiler requires less memory.
Platform units for each platform.
Revision 1.34 1998/02/02 11:47:36 pierre
+ compilation stops at unit with error
Revision 1.33 1998/02/01 22:41:08 florian
* clean up
+ system.assigned([class])
+ system.assigned([class of xxxx])
* first fixes of as and is-operator
Revision 1.32 1998/01/30 17:31:23 pierre
* bug of cyclic symtablestack fixed
Revision 1.31 1998/01/29 12:13:21 michael
* fixed Typos for library making
Revision 1.30 1998/01/28 13:48:45 michael
+ Initial implementation for making libs from within FPC. Not tested, as compiler does not run
Revision 1.29 1998/01/25 18:45:47 peter
+ Search for as and ld at startup
+ source_info works the same as target_info
+ externlink allows only external linking
Revision 1.28 1998/01/23 21:14:59 carl
* RunError 105 (file not open) with -Agas switch fix
Revision 1.27 1998/01/23 17:55:11 michael
+ Moved linking stage to it's own unit (link.pas)
Incorporated Pierres changes, but removed -E switch
switch for not linking is now -Cn instead of -E
Revision 1.26 1998/01/23 17:12:15 pierre
* added some improvements for as and ld :
- doserror and dosexitcode treated separately
- PATH searched if doserror=2
+ start of long and ansi string (far from complete)
in conditionnal UseLongString and UseAnsiString
* options.pas cleaned (some variables shifted to globals)gl
Revision 1.25 1998/01/22 14:47:16 michael
+ Reinstated linker options as -k option. How did they dissapear ?
Revision 1.24 1998/01/17 01:57:36 michael
+ Start of shared library support. First working version.
Revision 1.23 1998/01/16 22:34:37 michael
* Changed 'conversation' to 'conversion'. Waayyy too much chatting going on
in this compiler :)
Revision 1.22 1998/01/14 12:52:04 michael
- Removed the 'Assembled' line and replaced 'Calling Linker/assembler...'
with 'Assembling/linking...'. Too much verbosity when V_info is on.
Revision 1.21 1998/01/13 16:15:56 pierre
* bug in interdependent units handling
- primary unit was not in loaded_units list
- current_module^.symtable was assigned too early
- donescanner must not call error if the compilation
of the unit was done at a higher level.
Revision 1.20 1998/01/11 10:54:22 florian
+ generic library support
Revision 1.19 1998/01/11 04:17:11 carl
+ correct heap and memory variables for m68k targets
Revision 1.18 1998/01/08 23:56:39 florian
* parser unit divided into several smaller units
Revision 1.17 1998/01/08 17:10:12 florian
* the name of the initialization part of a unit was sometimes written
in lower case
Revision 1.16 1998/01/07 00:16:56 michael
Restored released version (plus fixes) as current
Revision 1.13 1997/12/14 22:43:21 florian
+ command line switch -Xs for DOS (passes -s to the linker to strip symbols from
executable)
* some changes of Carl-Eric implemented
Revision 1.12 1997/12/12 13:28:31 florian
+ version 0.99.0
* all WASM options changed into MASM
+ -O2 for Pentium II optimizations
Revision 1.11 1997/12/10 23:07:21 florian
* bugs fixed: 12,38 (also m68k),39,40,41
+ warning if a system unit is without -Us compiled
+ warning if a method is virtual and private (was an error)
* some indentions changed
+ factor does a better error recovering (omit some crashes)
+ problem with @type(x) removed (crashed the compiler)
Revision 1.10 1997/12/09 13:50:36 carl
* bugfix of possible alignment problems with m68k
* bugfix of circular unit use -- could still give a stack overflow,
so changed to fatalerror instead.
* bugfix of nil procedural variables, fpc = @nil is illogical!
(if was reversed!)
Revision 1.9 1997/12/08 13:31:31 daniel
* File was in DOS format. Translated to Unix.
Revision 1.8 1997/12/08 10:01:08 pierre
* nil for a procvar const was not allowed (os2_targ.pas not compilable)
* bug in loadunit for units in implementation part already loaded
(crashed on dos_targ.pas, thanks to Daniel who permitted me
to find this bug out)
Revision 1.7 1997/12/04 17:47:50 carl
+ renamed m68k units and refs to these units according to cpu rules.
Revision 1.6 1997/12/02 15:56:13 carl
* bugfix of postfixoperator with pd =nil
* bugfix of motorola instructions types for exit code.
Revision 1.5 1997/12/01 18:14:33 pierre
* fixes a bug in nasm output due to my previous changes
Revision 1.3 1997/11/28 18:14:40 pierre
working version with several bug fixes
Revision 1.2 1997/11/27 17:59:46 carl
* made it compile under BP (line too long errors)
Revision 1.1.1.1 1997/11/27 08:32:57 michael
FPC Compiler CVS start
Pre-CVS log:
CEC Carl-Eric Codere
FK Florian Klaempfl
PM Pierre Muller
+ feature added
- removed
* bug fixed or changed
History (started with version 0.9.0):
5th november 1996:
* adapted to 0.9.0
25th november 1996:
* more stuff adapted
9th december 1996:
+ support for different inline assemblers added (FK)
22th september:
+ support for PACKED RECORD implemented (FK)
24th september:
+ internal support of system.seg added (FK)
* system.ofs bug fixed (FK)
* problem with compiler switches solved (see also pass_1.pas) (FK)
* all aktswitch memory is now recoverd (see also scanner.pas) (FK)
24th september 1997:
* bug in ESI offset, pushed only if not nested, changed in cgi386.pas in v93 by (FK)
but forgotten here (PM)
25th september:
+ parsing of open arrays implemented (FK)
+ parsing of high and low implemented (FK)
+ open array support also for proc vars added (FK)
1th october:
* in typed constants is now the conversion int -> real
automatically done (FK)
3rd october 1997:
+ started conversion to motorola 68000 - ifdef m68k to find
changes (this makes the code look horrible, may later separate
in includes?) - look for all ifdef i386 and ifdef m68k to see
changes. (CEC)
- commented out regnames (was unused) (CEC)
+ peepholeopt put in i386 define (not yet available for motorola
68000) (CEC)
+ i386 defines around a_att, in a_o and around a_wasm, a_nasm (CEC).
+ code for in_ord_x (PM)
4th october 1997:
+ checking for double definitions of function/procedure
with same parameters in interface (PM)
+ enums with jumps set the boolean has_jumps and
disable the succ and pred use (PM)
9th october 1997:
* Fixed problem with 80float on the 68000 output, caused a GPF (CEC).
13th october 1997:
+ Added support for Motorola Standard assembler. (CEC)
15th october 1997:
+ added code for static modifier for objects variables and methods
controlled by -St switch at command line (PM)
17th october 1997:
+ Added support for Motorola inline assembler (CEC)
* Bugfix with .align 4,0x90, this is NOT allowed in TASM/MASM/WASM (CEC).
+ procedure set_macro and setting of fpc_* macros (FK)
19th october 1997:
* Bugfix of RTS on 68000 target. PC Counter would become corrupt
with paramsize (CEC).
23th october 1997:
* Small bugfixes concerning SUBI #const,address_reg (CEC).
24th october 1997:
* array[boolean] works now (FK)
25th october 1997:
+ CDECL and STDCALL (FK)
* ASSEMBLER isn't a keyword anymore (FK)
3rd november 1997:
+ added symdif for sets (PM)
5th november 1997:
* changed all while token<>ATOKEN do consume(token);
by a procedure call consume_all_untill(ATOKEN)
to test for _EOF (PM)
* aktobjectname was not reset to '' at the end of objectcomponenten (PM)
14th november 1997:
* removed bug for procvar where the type was not allways set correctly (PM)
+ integer const not in longint range converted to real constant (PM)
25th november 1997:
* removed bugs due to wrong current_module references in compile procedure (PM)
}