mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 02:31:12 +02:00
889 lines
28 KiB
ObjectPascal
889 lines
28 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,objects,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'));
|
|
{$ifdef UseLongString}
|
|
clongstringdef:=pstringdef(globaldef('longstring'));
|
|
{$endif UseLongString}
|
|
{$ifdef UseAnsiString}
|
|
cansistringdef:=pstringdef(globaldef('ansistring'));
|
|
{$endif UseAnsiString}
|
|
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 }
|
|
parse_types:=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;
|
|
oldpattern : stringid;
|
|
|
|
oldpreprocstack : ppreprocstack;
|
|
oldorgpattern,oldprocprefix : string;
|
|
oldparse_types : boolean;
|
|
oldinputbuffer : pchar;
|
|
oldinputpointer : longint;
|
|
olds_point,oldparse_only : boolean;
|
|
oldc : char;
|
|
oldcomment_level : word;
|
|
|
|
oldimports,oldexports,oldresource,
|
|
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;
|
|
|
|
var
|
|
a : PAsmFile;
|
|
g : file;
|
|
ftime : longint;
|
|
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;
|
|
oldorgpattern:=orgpattern;
|
|
oldparse_types:=parse_types;
|
|
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;
|
|
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 }
|
|
token:=yylex;
|
|
|
|
{ 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);
|
|
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 caret overloading }
|
|
getsym('POWER',false);
|
|
if assigned(srsym) and (srsym^.typ=procsym) and
|
|
(overloaded_operators[CARET]=nil) then
|
|
overloaded_operators[CARET]:=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 ?? }
|
|
{$ifdef UseLongString}
|
|
clongstringdef:=new(pstringdef,longinit(-1));
|
|
{$endif UseLongString}
|
|
{$ifdef UseAnsiString}
|
|
cansistringdef:=new(pstringdef,ansiinit(-1));
|
|
{$endif UseAnsiString}
|
|
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;
|
|
|
|
a:=new(PAsmFile,Init(filename));
|
|
a^.WriteAsmSource;
|
|
a^.DoAssemble;
|
|
dispose(a,Done);
|
|
|
|
{ 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 }
|
|
{$ifdef disposetree}
|
|
dispose(datasegment,Done);
|
|
dispose(codesegment,Done);
|
|
dispose(bsssegment,Done);
|
|
dispose(debuglist,Done);
|
|
dispose(externals,Done);
|
|
dispose(internals,Done);
|
|
dispose(consts,Done);
|
|
{$endif}
|
|
|
|
{ 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;
|
|
orgpattern:=oldorgpattern;
|
|
parse_types:=oldparse_types;
|
|
|
|
{ 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;
|
|
|
|
reset_gdb_info;
|
|
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.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)
|
|
|
|
}
|
|
|