* new codegenerator compiles again

This commit is contained in:
florian 1999-10-12 21:20:41 +00:00
parent c9c758e318
commit 8b9633266b
16 changed files with 361 additions and 289 deletions

View File

@ -289,7 +289,9 @@ begin
{$ifdef FPC} {$ifdef FPC}
Writeln('Memory Lost = '+tostr(system.HeapSize-MemAvail-EntryMemUsed)); Writeln('Memory Lost = '+tostr(system.HeapSize-MemAvail-EntryMemUsed));
{$endif FPC} {$endif FPC}
{$ifndef newcg}
Writeln('Repetitive firstpass = '+tostr(firstpass_several)+'/'+tostr(total_of_firstpass)); Writeln('Repetitive firstpass = '+tostr(firstpass_several)+'/'+tostr(total_of_firstpass));
{$endif newcg}
{$endif EXTDEBUG} {$endif EXTDEBUG}
end; end;
@ -298,7 +300,10 @@ end;
end. end.
{ {
$Log$ $Log$
Revision 1.35 1999-09-28 19:48:45 florian Revision 1.36 1999-10-12 21:20:41 florian
* new codegenerator compiles again
Revision 1.35 1999/09/28 19:48:45 florian
* bug 617 fixed * bug 617 fixed
Revision 1.34 1999/09/16 23:05:52 florian Revision 1.34 1999/09/16 23:05:52 florian

View File

@ -307,6 +307,7 @@ type tmsgconst=(
cg_e_unable_inline_object_methods, cg_e_unable_inline_object_methods,
cg_e_unable_inline_procvar, cg_e_unable_inline_procvar,
cg_e_no_code_for_inline_stored, cg_e_no_code_for_inline_stored,
cg_e_no_call_to_interrupt,
cg_e_can_access_element_zero, cg_e_can_access_element_zero,
cg_e_include_not_implemented, cg_e_include_not_implemented,
cg_e_cannot_call_cons_dest_inside_with, cg_e_cannot_call_cons_dest_inside_with,

View File

@ -1,7 +1,7 @@
{$ifdef Delphi} {$ifdef Delphi}
const msgtxt : array[0..000102] of string[240]=( const msgtxt : array[0..000103] of string[240]=(
{$else Delphi} {$else Delphi}
const msgtxt : array[0..000102,1..240] of char=( const msgtxt : array[0..000103,1..240] of char=(
{$endif Delphi} {$endif Delphi}
'T_Compiler: $1'#000+ 'T_Compiler: $1'#000+
'D_Compiler OS: $1'#000+ 'D_Compiler OS: $1'#000+
@ -326,196 +326,197 @@ const msgtxt : array[0..000102,1..240] of char=(
'E_Object or class me','thods can'#039't be inline.'#000+ 'E_Object or class me','thods can'#039't be inline.'#000+
'E_Procvar calls can'#039't be inline.'#000+ 'E_Procvar calls can'#039't be inline.'#000+
'E_No code for inline procedure stored'#000+ 'E_No code for inline procedure stored'#000+
'E_Direct call of interrupt procedure $1 is not possible'#000+
'E_Element zero of an ansi/wide- or longstring can'#039't be accessed, u'+ 'E_Element zero of an ansi/wide- or longstring can'#039't be accessed, u'+
'se (set)length instead'#000+ 'se (set)length instead'#000+
'E_Include and exclude not implemented in this case'#000+ 'E','_Include and exclude not implemented in this case'#000+
'E_Cons','tructors or destructors can not be called inside a '#039'with'#039+ 'E_Constructors or destructors can not be called inside a '#039'with'#039+
' clause'#000+ ' clause'#000+
'E_Cannot call message handler method directly'#000+ 'E_Cannot call message handler method directly'#000+
'D_Starting $1 styled assembler parsing'#000+ 'D_Starting $1 styled assembler parsing'#000+
'D_Finished $1 styled assembler parsing'#000+ 'D_Finished $1 styled assembler par','sing'#000+
'E_Non-label pattern contains @'#000+ 'E_Non-label pattern contains @'#000+
'W_Override operator ','not supported'#000+ 'W_Override operator not supported'#000+
'E_Error building record offset'#000+ 'E_Error building record offset'#000+
'E_OFFSET used without identifier'#000+ 'E_OFFSET used without identifier'#000+
'E_TYPE used without identifier'#000+ 'E_TYPE used without identifier'#000+
'E_Cannot use local variable or parameters here'#000+ 'E_Cannot use local variable or parameters here'#000+
'E_need to use OFFSET here'#000+ 'E_need to use OFFSET here'#000+
'E_Cannot use multiple relocatable symbols'#000+ 'E_','Cannot use multiple relocatable symbols'#000+
'E_Relocatable sy','mbol can only be added'#000+ 'E_Relocatable symbol can only be added'#000+
'E_Invalid constant expression'#000+ 'E_Invalid constant expression'#000+
'E_Relocatable symbol is not allowed'#000+ 'E_Relocatable symbol is not allowed'#000+
'E_Invalid reference syntax'#000+ 'E_Invalid reference syntax'#000+
'E_Local symbols/labels aren'#039't allowed as references'#000+ 'E_Local symbols/labels aren'#039't allowed as references'#000+
'E_Invalid base and index register usage'#000+ 'E_Invalid base a','nd index register usage'#000+
'E_Wrong scale factor specified'#000+ 'E_Wrong scale factor specified'#000+
'E','_Multiple index register usage'#000+ 'E_Multiple index register usage'#000+
'E_Invalid operand type'#000+ 'E_Invalid operand type'#000+
'E_Invalid string as opcode operand: $1'#000+ 'E_Invalid string as opcode operand: $1'#000+
'W_@CODE and @DATA not supported'#000+ 'W_@CODE and @DATA not supported'#000+
'E_Null label references are not allowed'#000+ 'E_Null label references are not allowed'#000+
'F_Divide by zero in asm evaluator'#000+ 'F_Divide by zero in',' asm evaluator'#000+
'F_Evaluator stack overflow'#000+ 'F_Evaluator stack overflow'#000+
'F_Evaluator st','ack underflow'#000+ 'F_Evaluator stack underflow'#000+
'F_Invalid numeric format in asm evaluator'#000+ 'F_Invalid numeric format in asm evaluator'#000+
'F_Invalid Operator in asm evaluator'#000+ 'F_Invalid Operator in asm evaluator'#000+
'E_escape sequence ignored: $1'#000+ 'E_escape sequence ignored: $1'#000+
'E_Invalid symbol reference'#000+ 'E_Invalid symbol reference'#000+
'W_Fwait can cause emulation problems with emu387'#000+ 'W_Fwait can cause emulation problem','s with emu387'#000+
'W_Calling an overload function in assemble','r'#000+ 'W_Calling an overload function in assembler'#000+
'E_Unsupported symbol type for operand'#000+ 'E_Unsupported symbol type for operand'#000+
'E_Constant value out of bounds'#000+ 'E_Constant value out of bounds'#000+
'E_Error converting decimal $1'#000+ 'E_Error converting decimal $1'#000+
'E_Error converting octal $1'#000+ 'E_Error converting octal $1'#000+
'E_Error converting binary $1'#000+ 'E_Error converting binary $1'#000+
'E_Error converting hexadecimal $1'#000+ 'E_Error converting hexadec','imal $1'#000+
'H_$1 translated to $2'#000+ 'H_$1 translated to $2'#000+
'W_$1 is associated to an o','verloaded function'#000+ 'W_$1 is associated to an overloaded function'#000+
'E_Cannot use SELF outside a method'#000+ 'E_Cannot use SELF outside a method'#000+
'E_Cannot use OLDEBP outside a nested procedure'#000+ 'E_Cannot use OLDEBP outside a nested procedure'#000+
'W_Functions with void return value can'#039't return any value in asm c'+ 'W_Functions with void return value can'#039't return any value in asm c'+
'ode'#000+ 'ode'#000+
'E_SEG not supported'#000+ 'E_SEG not sup','ported'#000+
'E_Size suffix and destination or source size do n','ot match'#000+ 'E_Size suffix and destination or source size do not match'#000+
'W_Size suffix and destination or source size do not match'#000+ 'W_Size suffix and destination or source size do not match'#000+
'E_Assembler syntax error'#000+ 'E_Assembler syntax error'#000+
'E_Invalid combination of opcode and operands'#000+ 'E_Invalid combination of opcode and operands'#000+
'E_Assemler syntax error in operand'#000+ 'E_Assemler syntax error in operand'#000+
'E_Assemler syntax error in constant'#000+ 'E_Assemler s','yntax error in constant'#000+
'E_Invalid String expression'#000+ 'E_Invalid String expression'#000+
'32bi','t constant created for address'#000+ '32bit constant created for address'#000+
'E_Invalid or missing opcode'#000+ 'E_Invalid or missing opcode'#000+
'E_Invalid combination of prefix and opcode: $1'#000+ 'E_Invalid combination of prefix and opcode: $1'#000+
'E_Invalid combination of override and opcode: $1'#000+ 'E_Invalid combination of override and opcode: $1'#000+
'E_Too many operands on line'#000+ 'E_Too many operands on line'#000+
'W_NEAR ignored'#000+ 'W','_NEAR ignored'#000+
'W_FAR ignored'#000+ 'W_FAR ignored'#000+
'E_Duplicate local symbol $1'#000, 'E_Duplicate local symbol $1'#000+
'E_Undefined local symbol $1'#000+ 'E_Undefined local symbol $1'#000+
'E_Unknown label identifier $1'#000+ 'E_Unknown label identifier $1'#000+
'E_Invalid floating point register name'#000+ 'E_Invalid floating point register name'#000+
'E_NOR not supported'#000+ 'E_NOR not supported'#000+
'W_Modulo not supported'#000+ 'W_Modulo not supported'#000+
'E_Invalid floating point constant $1'#000+ 'E_Invalid floating point constant $1'#000+
'E_Invalid floating point expression'#000+ 'E_Inval','id floating point expression'#000+
'E_Wrong symbol type'#000+ 'E_Wrong symbol type'#000+
'E_Canno','t index a local var or parameter with a register'#000+ 'E_Cannot index a local var or parameter with a register'#000+
'E_Invalid segment override expression'#000+ 'E_Invalid segment override expression'#000+
'W_Identifier $1 supposed external'#000+ 'W_Identifier $1 supposed external'#000+
'E_Strings not allowed as constants'#000+ 'E_Strings not allowed as constants'#000+
'No type of variable specified'#000+ 'No type of variable specifie','d'#000+
'E_assembler code not returned to text section'#000+ 'E_assembler code not returned to text section'#000+
'E_Not a ','directive or local symbol $1'#000+ 'E_Not a directive or local symbol $1'#000+
'E_Using a defined name as a local label'#000+ 'E_Using a defined name as a local label'#000+
'E_Dollar token is used without an identifier'#000+ 'E_Dollar token is used without an identifier'#000+
'W_32bit constant created for address'#000+ 'W_32bit constant created for address'#000+
'N_.align is target specific, use .balign or .p2align'#000+ 'N_.align is target specific, use ','.balign or .p2align'#000+
'E_Can'#039't access fields directly for p','arameters'#000+ 'E_Can'#039't access fields directly for parameters'#000+
'E_Can'#039't access fields of objects/classes directly'#000+ 'E_Can'#039't access fields of objects/classes directly'#000+
'F_Too many assembler files'#000+ 'F_Too many assembler files'#000+
'F_Selected assembler output not supported'#000+ 'F_Selected assembler output not supported'#000+
'F_Comp not supported'#000+ 'F_Comp not supported'#000+
'F_Direct not support for binary writers'#000+ 'F_Direct not support for binary wr','iters'#000+
'E_Allocating of data is only allowed in bss sectio','n'#000+ 'E_Allocating of data is only allowed in bss section'#000+
'F_No binary writer selected'#000+ 'F_No binary writer selected'#000+
'E_Asm: Opcode $1 not in table'#000+ 'E_Asm: Opcode $1 not in table'#000+
'E_Asm: $1 invalid combination of opcode and operands'#000+ 'E_Asm: $1 invalid combination of opcode and operands'#000+
'E_Asm: 16 Bit references not supported'#000+ 'E_Asm: 16 Bit references not supported'#000+
'E_Asm: Invalid effective address'#000+ 'E_Asm: Invalid effective address',#000+
'E_Asm: Immediate or reference expected'#000+ 'E_Asm: Immediate or reference expected'#000+
'E_Asm: $1 value ','exceeds bounds $2'#000+ 'E_Asm: $1 value exceeds bounds $2'#000+
'E_Asm: Short jump is out of range $1'#000+ 'E_Asm: Short jump is out of range $1'#000+
'W_Source operating system redefined'#000+ 'W_Source operating system redefined'#000+
'I_Assembling (pipe) $1'#000+ 'I_Assembling (pipe) $1'#000+
'E_Can'#039't create assember file $1'#000+ 'E_Can'#039't create assember file $1'#000+
'W_Assembler $1 not found, switching to external assembling'#000+ 'W_Assembler $1 not found, switching to',' external assembling'#000+
'T_Using assembler: $1'#000+ 'T_Using assembler: $1'#000+
'W_Error while',' assembling exitcode $1'#000+ 'W_Error while assembling exitcode $1'#000+
'W_Can'#039't call the assembler, error $1 switching to external assembl'+ 'W_Can'#039't call the assembler, error $1 switching to external assembl'+
'ing'#000+ 'ing'#000+
'I_Assembling $1'#000+ 'I_Assembling $1'#000+
'I_Assembling smartlink $1'#000+ 'I_Assembling smartlink $1'#000+
'W_Linker $1 not found, switching to external linking'#000+ 'W_Linker $1 not found, switching to external lin','king'#000+
'T_Using linker: $1'#000+ 'T_Using linker: $1'#000+
'W_Object $1 not found, Linking m','ay fail !'#000+ 'W_Object $1 not found, Linking may fail !'#000+
'W_Library $1 not found, Linking may fail !'#000+ 'W_Library $1 not found, Linking may fail !'#000+
'W_Error while linking'#000+ 'W_Error while linking'#000+
'W_Can'#039't call the linker, switching to external linking'#000+ 'W_Can'#039't call the linker, switching to external linking'#000+
'I_Linking $1'#000+ 'I_Linking $1'#000+
'W_binder not found, switching to external binding'#000+ 'W_binder not found, switching to external',' binding'#000+
'W_ar not found, switching to external ar'#000+ 'W_ar not found, switching to external ar'#000+
'E_Dyna','mic Libraries not supported'#000+ 'E_Dynamic Libraries not supported'#000+
'I_Closing script $1'#000+ 'I_Closing script $1'#000+
'W_resource compiler not found, switching to external mode'#000+ 'W_resource compiler not found, switching to external mode'#000+
'I_Compiling resource $1'#000+ 'I_Compiling resource $1'#000+
'F_Can'#039't post process executable $1'#000+ 'F_Can'#039't post process executable $1'#000+
'F_Can'#039't open executable $1'#000+ 'F_Can'#039't open execut','able $1'#000+
'X_Size of Code: $1 bytes'#000+ 'X_Size of Code: $1 bytes'#000+
'X_Size of initialized d','ata: $1 bytes'#000+ 'X_Size of initialized data: $1 bytes'#000+
'X_Size of uninitialized data: $1 bytes'#000+ 'X_Size of uninitialized data: $1 bytes'#000+
'X_Stack space reserved: $1 bytes'#000+ 'X_Stack space reserved: $1 bytes'#000+
'X_Stack space commited: $1 bytes'#000+ 'X_Stack space commited: $1 bytes'#000+
'T_Unitsearch: $1'#000+ 'T_Unitsearch: $1'#000+
'T_PPU Loading $1'#000+ 'T_PPU Loading $1'#000+
'U_PPU Name: $1'#000+ 'U_PPU Name: $1'#000+
'U_PPU Flags: $1'#000+ 'U_PPU Flags: $1'#000,
'U_PPU Crc: $1'#000+ 'U_PPU Crc: $1'#000+
'U_PPU Time: $1'#000+ 'U_PPU Time: $1'#000+
'U_PPU File too short'#000+ 'U_PPU File too short'#000+
'U_PPU ','Invalid Header (no PPU at the begin)'#000+ 'U_PPU Invalid Header (no PPU at the begin)'#000+
'U_PPU Invalid Version $1'#000+ 'U_PPU Invalid Version $1'#000+
'U_PPU is compiled for an other processor'#000+ 'U_PPU is compiled for an other processor'#000+
'U_PPU is compiled for an other target'#000+ 'U_PPU is compiled for an other target'#000+
'U_PPU Source: $1'#000+ 'U_PPU Source: $1'#000+
'U_Writing $1'#000+ 'U_Writing $1'#000+
'F_Can'#039't Write PPU-File'#000+ 'F_Can'#039't Write',' PPU-File'#000+
'F_reading PPU-File'#000+ 'F_reading PPU-File'#000+
'F_unexpected end of PPU-Fil','e'#000+ 'F_unexpected end of PPU-File'#000+
'F_Invalid PPU-File entry: $1'#000+ 'F_Invalid PPU-File entry: $1'#000+
'F_PPU Dbx count problem'#000+ 'F_PPU Dbx count problem'#000+
'E_Illegal unit name: $1'#000+ 'E_Illegal unit name: $1'#000+
'F_Too much units'#000+ 'F_Too much units'#000+
'F_Circular unit reference between $1 and $2'#000+ 'F_Circular unit reference between $1 and $2'#000+
'F_Can'#039't compile unit $1, no sources available'#000+ 'F_Can'#039't compile unit $1, no sources availabl','e'#000+
'F_Can'#039't find unit $1'#000+ 'F_Can'#039't find unit $1'#000+
'W_Unit $1 was not found but $2 ex','ists'#000+ 'W_Unit $1 was not found but $2 exists'#000+
'F_Unit $1 searched but $2 found'#000+ 'F_Unit $1 searched but $2 found'#000+
'W_Compiling the system unit requires the -Us switch'#000+ 'W_Compiling the system unit requires the -Us switch'#000+
'F_There were $1 errors compiling module, stopping'#000+ 'F_There were $1 errors compiling module, stopping'#000+
'U_Load from $1 ($2) unit $3'#000+ 'U_Load from $1 ($2) unit $3'#000+
'U_Recompiling $1, checksum changed for $2'#000+ 'U_Recompiling $1,',' checksum changed for $2'#000+
'U_Recompiling $1, source found ','only'#000+ 'U_Recompiling $1, source found only'#000+
'U_Recompiling unit, static lib is older than ppufile'#000+ 'U_Recompiling unit, static lib is older than ppufile'#000+
'U_Recompiling unit, shared lib is older than ppufile'#000+ 'U_Recompiling unit, shared lib is older than ppufile'#000+
'U_Recompiling unit, obj and asm are older than ppufile'#000+ 'U_Recompiling unit, obj and asm are older than ppufile'#000+
'U_Recompiling unit, obj is older than asm'#000+ 'U_Recompiling unit',', obj is older than asm'#000+
'U_Parsing interface of $1'#000+ 'U_Parsing interface of $1'#000+
'U_Pars','ing implementation of $1'#000+ 'U_Parsing implementation of $1'#000+
'U_Second load for unit $1'#000+ 'U_Second load for unit $1'#000+
'U_PPU Check file $1 time $2'#000+ 'U_PPU Check file $1 time $2'#000+
'$1 [options] <inputfile> [options]'#000+ '$1 [options] <inputfile> [options]'#000+
'W_Only one source file supported'#000+ 'W_Only one source file supported'#000+
'W_DEF file can be created only for OS/2'#000+ 'W_DEF file can be created only for OS','/2'#000+
'E_nested response files are not supported'#000+ 'E_nested response files are not supported'#000+
'F_No source',' file name in command line'#000+ 'F_No source file name in command line'#000+
'E_Illegal parameter: $1'#000+ 'E_Illegal parameter: $1'#000+
'H_-? writes help pages'#000+ 'H_-? writes help pages'#000+
'F_Too many config files nested'#000+ 'F_Too many config files nested'#000+
'F_Unable to open file $1'#000+ 'F_Unable to open file $1'#000+
'N_Reading further options from $1'#000+ 'N_Reading further options from $1'#000+
'W_Target is already set to: $1'#000+ 'W_Target is already ','set to: $1'#000+
'W_Shared libs not supported on DOS platform, ','reverting to static'#000+ 'W_Shared libs not supported on DOS platform, reverting to static'#000+
'F_too many IF(N)DEFs'#000+ 'F_too many IF(N)DEFs'#000+
'F_too many ENDIFs'#000+ 'F_too many ENDIFs'#000+
'F_open conditional at the end of the file'#000+ 'F_open conditional at the end of the file'#000+
'W_Debug information generation is not supported by this executable'#000+ 'W_Debug information generation is not supported by this executable'#000+
'H_Try recompiling with -dGDB'#000+ 'H_Try recompilin','g with -dGDB'#000+
'E_You are using the obsolete switch $1'#000+ 'E_You are using the obsolete switch $1'#000+
'E_Yo','u are using the obsolete switch $1, please use $2'#000+ 'E_You are using the obsolete switch $1, please use $2'#000+
'N_Switching assembler to default source writing assembler'#000+ 'N_Switching assembler to default source writing assembler'#000+
'Free Pascal Compiler version $FPCVER [$FPCDATE] for $FPCTARGET'#000+ 'Free Pascal Compiler version $FPCVER [$FPCDATE] for $FPCTARGET'#000+
'Copyright (c) 1993-1999 by Florian Klaempfl'#000+ 'Copyright (c)',' 1993-1999 by Florian Klaempfl'#000+
'Free Pascal Compiler vers','ion $FPCVER'#000+ 'Free Pascal Compiler version $FPCVER'#000+
#000+ #000+
'Compiler Date : $FPCDATE'#000+ 'Compiler Date : $FPCDATE'#000+
'Compiler Target: $FPCTARGET'#000+ 'Compiler Target: $FPCTARGET'#000+
@ -523,130 +524,130 @@ const msgtxt : array[0..000102,1..240] of char=(
'This program comes under the GNU General Public Licence'#000+ 'This program comes under the GNU General Public Licence'#000+
'For more information read COPYING.FPC'#000+ 'For more information read COPYING.FPC'#000+
#000+ #000+
'Report bugs,suggestions etc to:'#000+ 'Report bugs,suggestio','ns etc to:'#000+
' fpc-devel@vekoll.saturnus.ve','in.hu'#000+ ' fpc-devel@vekoll.saturnus.vein.hu'#000+
'**0*_put + after a boolean switch option to enable it, - to disable it'+ '**0*_put + after a boolean switch option to enable it, - to disable it'+
#000+ #000+
'**1a_the compiler doesn'#039't delete the generated assembler file'#000+ '**1a_the compiler doesn'#039't delete the generated assembler file'#000+
'**2al_list sourcecode lines in assembler file'#000+ '**2al_list sourcecode lines in assembler file',#000+
'**2ar_list register allocation/release info in assemble','r file'#000+ '**2ar_list register allocation/release info in assembler file'#000+
'**2at_list temp allocation/release info in assembler file'#000+ '**2at_list temp allocation/release info in assembler file'#000+
'**1b_generate browser info'#000+ '**1b_generate browser info'#000+
'**2bl_generate local symbol info'#000+ '**2bl_generate local symbol info'#000+
'**1B_build all modules'#000+ '**1B_build all modules'#000+
'**1C<x>_code generation options:'#000+ '**1C<x>_code generation options:'#000+
'3*2CD_create dynamic library'#000+ '3*2','CD_create dynamic library'#000+
'**2Ch<n>_<n> bytes heap (betwe','en 1023 and 67107840)'#000+ '**2Ch<n>_<n> bytes heap (between 1023 and 67107840)'#000+
'**2Ci_IO-checking'#000+ '**2Ci_IO-checking'#000+
'**2Cn_omit linking stage'#000+ '**2Cn_omit linking stage'#000+
'**2Co_check overflow of integer operations'#000+ '**2Co_check overflow of integer operations'#000+
'**2Cr_range checking'#000+ '**2Cr_range checking'#000+
'**2Cs<n>_set stack size to <n>'#000+ '**2Cs<n>_set stack size to <n>'#000+
'**2Ct_stack checking'#000+ '**2Ct_stack checking'#000+
'**2CD_create also dynamic library (* doesn'#039't work yet *)'#000+ '**2','CD_create also dynamic library (* doesn'#039't work yet *)'#000+
'**','2CX_create also smartlinked library'#000+ '**2CX_create also smartlinked library'#000+
'**1d<x>_defines the symbol <x>'#000+ '**1d<x>_defines the symbol <x>'#000+
'*O1D_generate a DEF file'#000+ '*O1D_generate a DEF file'#000+
'*O2Dd<x>_set description to <x>'#000+ '*O2Dd<x>_set description to <x>'#000+
'*O2Dw_PM application'#000+ '*O2Dw_PM application'#000+
'**1e<x>_set path to executable'#000+ '**1e<x>_set path to executable'#000+
'**1E_same as -Cn'#000+ '**1E_sam','e as -Cn'#000+
'**1F<x>_set file names and paths:'#000+ '**1F<x>_set file names and paths:'#000+
'**2FD<x>_sets',' the directory where to search for compiler utilities'#000+ '**2FD<x>_sets the directory where to search for compiler utilities'#000+
'**2Fe<x>_redirect error output to <x>'#000+ '**2Fe<x>_redirect error output to <x>'#000+
'**2FE<x>_set exe/unit output path to <x>'#000+ '**2FE<x>_set exe/unit output path to <x>'#000+
'**2Fi<x>_adds <x> to include path'#000+ '**2Fi<x>_adds <x> to include path'#000+
'**2Fl<x>_adds <x> to library path'#000+ '**2Fl<x>_adds <x>',' to library path'#000+
'*L2FL<x>_uses <x> as dynamic linker'#000+ '*L2FL<x>_uses <x> as dynamic linker'#000+
'**2','Fo<x>_adds <x> to object path'#000+ '**2Fo<x>_adds <x> to object path'#000+
'**2Fr<x>_load error message file <x>'#000+ '**2Fr<x>_load error message file <x>'#000+
'**2Fu<x>_adds <x> to unit path'#000+ '**2Fu<x>_adds <x> to unit path'#000+
'**2FU<x>_set unit output path to <x>, overrides -FE'#000+ '**2FU<x>_set unit output path to <x>, overrides -FE'#000+
'*g1g<x>_generate debugger information:'#000+ '*g1g<x>_generate debugger informat','ion:'#000+
'*g2gg_use gsym'#000+ '*g2gg_use gsym'#000+
'*g2gd_use dbx'#000+ '*g2gd_use dbx'#000+
'*g2gh_use heap trace u','nit'#000+ '*g2gh_use heap trace unit'#000+
'*g2gc_generate checks for pointers'#000+ '*g2gc_generate checks for pointers'#000+
'**1i_information'#000+ '**1i_information'#000+
'**2iD_return compiler date'#000+ '**2iD_return compiler date'#000+
'**2iV_return compiler version'#000+ '**2iV_return compiler version'#000+
'**2iSO_return compiler OS'#000+ '**2iSO_return compiler OS'#000+
'**2iSP_return compiler processor'#000+ '**2iSP_return compiler processor'#000+
'**2iTO_return target OS'#000+ '**2iTO_retur','n target OS'#000+
'**2iTP_return target processor'#000+ '**2iTP_return target processor'#000+
'**1I<x>_adds ','<x> to include path'#000+ '**1I<x>_adds <x> to include path'#000+
'**1k<x>_Pass <x> to the linker'#000+ '**1k<x>_Pass <x> to the linker'#000+
'**1l_write logo'#000+ '**1l_write logo'#000+
'**1n_don'#039't read the default config file'#000+ '**1n_don'#039't read the default config file'#000+
'**1o<x>_change the name of the executable produced to <x>'#000+ '**1o<x>_change the name of the executable produced to <x>'#000+
'**1pg_generate profile code for gprof (defines FPC_PROFILE)'#000+ '**1pg_generate prof','ile code for gprof (defines FPC_PROFILE)'#000+
'*L1P_use pipes ','instead of creating temporary assembler files'#000+ '*L1P_use pipes instead of creating temporary assembler files'#000+
'**1S<x>_syntax options:'#000+ '**1S<x>_syntax options:'#000+
'**2S2_switch some Delphi 2 extensions on'#000+ '**2S2_switch some Delphi 2 extensions on'#000+
'**2Sc_supports operators like C (*=,+=,/= and -=)'#000+ '**2Sc_supports operators like C (*=,+=,/= and -=)'#000+
'**2Sd_tries to be Delphi compatible'#000+ '**2Sd_tries to be Delph','i compatible'#000+
'**2Se<x>_compiler stops after the <x> error','s (default is 1)'#000+ '**2Se<x>_compiler stops after the <x> errors (default is 1)'#000+
'**2Sg_allow LABEL and GOTO'#000+ '**2Sg_allow LABEL and GOTO'#000+
'**2Sh_Use ansistrings'#000+ '**2Sh_Use ansistrings'#000+
'**2Si_support C++ styled INLINE'#000+ '**2Si_support C++ styled INLINE'#000+
'**2Sm_support macros like C (global)'#000+ '**2Sm_support macros like C (global)'#000+
'**2So_tries to be TP/BP 7.0 compatible'#000+ '**2So_tries to be TP/BP 7.0 compatible'#000+
'**2Sp_tries to be gpc compatible'#000+ '**2Sp_trie','s to be gpc compatible'#000+
'**2Ss_constructor name must be in','it (destructor must be done)'#000+ '**2Ss_constructor name must be init (destructor must be done)'#000+
'**2St_allow static keyword in objects'#000+ '**2St_allow static keyword in objects'#000+
'**1s_don'#039't call assembler and linker (only with -a)'#000+ '**1s_don'#039't call assembler and linker (only with -a)'#000+
'**1u<x>_undefines the symbol <x>'#000+ '**1u<x>_undefines the symbol <x>'#000+
'**1U_unit options:'#000+ '**1U_unit options:'#000+
'**2Un_don'#039't check the unit name'#000+ '**2Un_don'#039't c','heck the unit name'#000+
'**2Us_compile a system unit'#000+ '**2Us_compile a system unit'#000+
'**1v<x>_B','e verbose. <x> is a combination of the following letters:'#000+ '**1v<x>_Be verbose. <x> is a combination of the following letters:'#000+
'**2*_e : Show errors (default) d : Show debug info'#000+ '**2*_e : Show errors (default) d : Show debug info'#000+
'**2*_w : Show warnings u : Show unit info'#000+ '**2*_w : Show warnings u : Show unit info'#000+
'**2*_n : Show notes t : Show tried/used files'#000+ '**2*_n : Show',' notes t : Show tried/used files'#000+
'**2*_h',' : Show hints m : Show defined macros'#000+ '**2*_h : Show hints m : Show defined macros'#000+
'**2*_i : Show general info p : Show compiled procedures'#000+ '**2*_i : Show general info p : Show compiled procedures'#000+
'**2*_l : Show linenumbers c : Show conditionals'#000+ '**2*_l : Show linenumbers c : Show conditionals'#000+
'**2*_a : Show everything 0 : Show nothing (excep','t errors'+ '**2*','_a : Show everything 0 : Show nothing (except errors'+
')'#000+ ')'#000+
'**2*_b : Show all procedure r : Rhide/GCC compatibility mode'#000+ '**2*_b : Show all procedure r : Rhide/GCC compatibility mode'#000+
'**2*_ declarations if an error x : Executable info (Win32 only)'#000+ '**2*_ declarations if an error x : Executable info (Win32 only)'#000+
'**2*_ occurs'#000+ '**2*_ occurs'#000+
'**1X_executable options:'#000+ '**1X_executable op','tions:'#000+
'*L2Xc_link with the c library'#000+ '*L2Xc_link with the c library'#000+
'**2Xs_strip all sym','bols from executable'#000+ '**2Xs_strip all symbols from executable'#000+
'**2XD_try to link dynamic (defines FPC_LINK_DYNAMIC)'#000+ '**2XD_try to link dynamic (defines FPC_LINK_DYNAMIC)'#000+
'**2XS_try to link static (default) (defines FPC_LINK_STATIC)'#000+ '**2XS_try to link static (default) (defines FPC_LINK_STATIC)'#000+
'**2XX_try to link smart (defines FPC_LINK_SMART)'#000+ '**2XX_try to link smart (defi','nes FPC_LINK_SMART)'#000+
'**0*_Processor specific options:'#000+ '**0*_Processor specific options:'#000+
'3*1','A<x>_output format:'#000+ '3*1A<x>_output format:'#000+
'3*2Aas_assemble using GNU AS'#000+ '3*2Aas_assemble using GNU AS'#000+
'3*2Aasaout_assemble using GNU AS for aout (Go32v1)'#000+ '3*2Aasaout_assemble using GNU AS for aout (Go32v1)'#000+
'3*2Anasmcoff_coff (Go32v2) file using Nasm'#000+ '3*2Anasmcoff_coff (Go32v2) file using Nasm'#000+
'3*2Anasmelf_elf32 (Linux) file using Nasm'#000+ '3*2Anasmelf_elf32 (Linux) file using Nasm',#000+
'3*2Anasmobj_obj file using Nasm'#000+ '3*2Anasmobj_obj file using Nasm'#000+
'3*2Amasm_obj file using',' Masm (Microsoft)'#000+ '3*2Amasm_obj file using Masm (Microsoft)'#000+
'3*2Atasm_obj file using Tasm (Borland)'#000+ '3*2Atasm_obj file using Tasm (Borland)'#000+
'3*2Acoff_coff (Go32v2) using internal writer'#000+ '3*2Acoff_coff (Go32v2) using internal writer'#000+
'3*2Apecoff_pecoff (Win32) using internal writer'#000+ '3*2Apecoff_pecoff (Win32) using internal writer'#000+
'3*1R<x>_assembler reading style:'#000+ '3*1R<x>_assembler reading style:'#000+
'3*2Ratt_read AT&T style assembler'#000+ '3','*2Ratt_read AT&T style assembler'#000+
'3*2Rintel_read Intel st','yle assembler'#000+ '3*2Rintel_read Intel style assembler'#000+
'3*2Rdirect_copy assembler text directly to assembler file'#000+ '3*2Rdirect_copy assembler text directly to assembler file'#000+
'3*1O<x>_optimizations:'#000+ '3*1O<x>_optimizations:'#000+
'3*2Og_generate smaller code'#000+ '3*2Og_generate smaller code'#000+
'3*2OG_generate faster code (default)'#000+ '3*2OG_generate faster code (default)'#000+
'3*2Or_keep certain variables in registers (still BUGGY!!!)'#000+ '3*2Or_keep certain varia','bles in registers (still BUGGY!!!)'#000+
'3*2Ou_enable uncertai','n optimizations (see docs)'#000+ '3*2Ou_enable uncertain optimizations (see docs)'#000+
'3*2O1_level 1 optimizations (quick optimizations)'#000+ '3*2O1_level 1 optimizations (quick optimizations)'#000+
'3*2O2_level 2 optimizations (-O1 + slower optimizations)'#000+ '3*2O2_level 2 optimizations (-O1 + slower optimizations)'#000+
'3*2O3_level 3 optimizations (same as -O2u)'#000+ '3*2O3_level 3 optimizations (same as -O2u)'#000+
'3*2Op<x>_target processor:'#000+ '3*2Op<x','>_target processor:'#000+
'3*3Op1_set target processor to 386/4','86'#000+ '3*3Op1_set target processor to 386/486'#000+
'3*3Op2_set target processor to Pentium/PentiumMMX (tm)'#000+ '3*3Op2_set target processor to Pentium/PentiumMMX (tm)'#000+
'3*3Op3_set target processor to PPro/PII/c6x86/K6 (tm)'#000+ '3*3Op3_set target processor to PPro/PII/c6x86/K6 (tm)'#000+
'3*1T<x>_Target operating system:'#000+ '3*1T<x>_Target operating system:'#000+
'3*2TGO32V1_version 1 of DJ Delorie DOS extender'#000+ '3*2TGO32V1_version 1 of DJ Delorie DOS ','extender'#000+
'3*2TGO32V2_version 2 of DJ Delorie DOS extender',#000+ '3*2TGO32V2_version 2 of DJ Delorie DOS extender'#000+
'3*2TLINUX_Linux'#000+ '3*2TLINUX_Linux'#000+
'3*2TOS2_OS/2 2.x'#000+ '3*2TOS2_OS/2 2.x'#000+
'3*2TWin32_Windows 32 Bit'#000+ '3*2TWin32_Windows 32 Bit'#000+
@ -654,21 +655,21 @@ const msgtxt : array[0..000102,1..240] of char=(
'6*2Aas_Unix o-file using GNU AS'#000+ '6*2Aas_Unix o-file using GNU AS'#000+
'6*2Agas_GNU Motorola assembler'#000+ '6*2Agas_GNU Motorola assembler'#000+
'6*2Amit_MIT Syntax (old GAS)'#000+ '6*2Amit_MIT Syntax (old GAS)'#000+
'6*2Amot_Standard Motorola assembler'#000+ '6*2Amot_Sta','ndard Motorola assembler'#000+
'6*1O_optimizations:'#000+ '6*1O_optimizations:'#000+
'6*2Oa_turn ','on the optimizer'#000+ '6*2Oa_turn on the optimizer'#000+
'6*2Og_generate smaller code'#000+ '6*2Og_generate smaller code'#000+
'6*2OG_generate faster code (default)'#000+ '6*2OG_generate faster code (default)'#000+
'6*2Ox_optimize maximum (still BUGGY!!!)'#000+ '6*2Ox_optimize maximum (still BUGGY!!!)'#000+
'6*2O2_set target processor to a MC68020+'#000+ '6*2O2_set target processor to a MC68020+'#000+
'6*1R<x>_assembler reading style:'#000+ '6*1R<x>_assembler rea','ding style:'#000+
'6*2RMOT_read motorola style assembler'#000+ '6*2RMOT_read motorola style assembler'#000+
'6*1T<x','>_Target operating system:'#000+ '6*1T<x>_Target operating system:'#000+
'6*2TAMIGA_Commodore Amiga'#000+ '6*2TAMIGA_Commodore Amiga'#000+
'6*2TATARI_Atari ST/STe/TT'#000+ '6*2TATARI_Atari ST/STe/TT'#000+
'6*2TMACOS_Macintosh m68k'#000+ '6*2TMACOS_Macintosh m68k'#000+
'6*2TLINUX_Linux-68k'#000+ '6*2TLINUX_Linux-68k'#000+
'**1*_'#000+ '**1*_'#000+
'**1?_shows this help'#000+ '**1?_shows this help'#000+
'**1h_shows this help without waiting'#000 '**1h_shows this help without wait','ing'#000
); );

View File

@ -136,7 +136,7 @@ ifneq ($(findstring -di386,$(COMPILER)),)
override COMPILER+=-dSUPPORT_MMX override COMPILER+=-dSUPPORT_MMX
endif endif
override COMPILER+=$(LOCALOPT) -Fu$(CPU) override COMPILER+=-Fu$(CPU) $(LOCALOPT)
ifneq (,$(findstring -s ,$(LOCALOPT))) ifneq (,$(findstring -s ,$(LOCALOPT)))
override EXECPPAS=@$(PPAS) override EXECPPAS=@$(PPAS)
@ -175,6 +175,12 @@ endif
PPEXENAME=pp$(EXEEXT) PPEXENAME=pp$(EXEEXT)
EXENAME=ppc386$(EXEEXT) EXENAME=ppc386$(EXEEXT)
ifeq ($(CPU),powerpc)
EXENAME=ppcppc$(EXEEXT)
endif
ifeq ($(CPU),alpha)
EXENAME=ppcalpha$(EXEEXT)
endif
M68KEXENAME=ppc68k$(EXEEXT) M68KEXENAME=ppc68k$(EXEEXT)
TEMPNAME=ppc$(EXEEXT) TEMPNAME=ppc$(EXEEXT)
TEMPNAME1=ppc1$(EXEEXT) TEMPNAME1=ppc1$(EXEEXT)
@ -394,7 +400,10 @@ $(M68KEXENAME): $(PASFILES) $(INCFILES)
# #
# $Log$ # $Log$
# Revision 1.2 1999-08-02 17:16:41 michael # Revision 1.3 1999-10-12 21:20:46 florian
# * new codegenerator compiles again
#
# Revision 1.2 1999/08/02 17:16:41 michael
# + Changes for alpha # + Changes for alpha
# #
# Revision 1.1 1999/08/01 23:19:58 florian # Revision 1.1 1999/08/01 23:19:58 florian

View File

@ -130,7 +130,7 @@ unit cgbase;
var var
{ info about the current sub routine } { info about the current sub routine }
procinfo : tprocinfo; procinfo : pprocinfo;
{ labels for BREAK and CONTINUE } { labels for BREAK and CONTINUE }
aktbreaklabel,aktcontinuelabel : pasmlabel; aktbreaklabel,aktcontinuelabel : pasmlabel;
@ -145,7 +145,7 @@ unit cgbase;
aktexit2label : pasmlabel; aktexit2label : pasmlabel;
{ only used in constructor for fail or if getmem fails } { only used in constructor for fail or if getmem fails }
quickexitlabel : pasmlabel; faillabel,quickexitlabel : pasmlabel;
{ Boolean, wenn eine loadn kein Assembler erzeugt hat } { Boolean, wenn eine loadn kein Assembler erzeugt hat }
simple_loadn : boolean; simple_loadn : boolean;
@ -262,25 +262,27 @@ unit cgbase;
begin begin
aktbreaklabel:=nil; aktbreaklabel:=nil;
aktcontinuelabel:=nil; aktcontinuelabel:=nil;
new(procinfo);
{ aktexitlabel:=0; is store in oldaktexitlabel { aktexitlabel:=0; is store in oldaktexitlabel
so it must not be reset to zero before this storage !} so it must not be reset to zero before this storage !}
{ the type of this lists isn't important } { the type of this lists isn't important }
{ because the code of this lists is } { because the code of this lists is }
{ copied to the code segment } { copied to the code segment }
procinfo.aktentrycode:=new(paasmoutput,init); procinfo^.aktentrycode:=new(paasmoutput,init);
procinfo.aktexitcode:=new(paasmoutput,init); procinfo^.aktexitcode:=new(paasmoutput,init);
procinfo.aktproccode:=new(paasmoutput,init); procinfo^.aktproccode:=new(paasmoutput,init);
procinfo.aktlocaldata:=new(paasmoutput,init); procinfo^.aktlocaldata:=new(paasmoutput,init);
end; end;
procedure codegen_doneprocedure; procedure codegen_doneprocedure;
begin begin
dispose(procinfo.aktentrycode,done); dispose(procinfo^.aktentrycode,done);
dispose(procinfo.aktexitcode,done); dispose(procinfo^.aktexitcode,done);
dispose(procinfo.aktproccode,done); dispose(procinfo^.aktproccode,done);
dispose(procinfo.aktlocaldata,done); dispose(procinfo^.aktlocaldata,done);
dispose(procinfo);
end; end;
@ -425,7 +427,10 @@ unit cgbase;
end. end.
{ {
$Log$ $Log$
Revision 1.9 1999-09-10 18:48:11 florian Revision 1.10 1999-10-12 21:20:46 florian
* new codegenerator compiles again
Revision 1.9 1999/09/10 18:48:11 florian
* some bug fixes (e.g. must_be_valid and procinfo.funcret_is_valid) * some bug fixes (e.g. must_be_valid and procinfo.funcret_is_valid)
* most things for stored properties fixed * most things for stored properties fixed

View File

@ -448,11 +448,11 @@ unit cgobj;
pobjectdef(pvarsym(p)^.definition)^.is_class) and pobjectdef(pvarsym(p)^.definition)^.is_class) and
pvarsym(p)^.definition^.needs_inittable then pvarsym(p)^.definition^.needs_inittable then
begin begin
procinfo.flags:=procinfo.flags or pi_needs_implicit_finally; procinfo^.flags:=procinfo^.flags or pi_needs_implicit_finally;
reset_reference(hr); reset_reference(hr);
if psym(p)^.owner^.symtabletype=localsymtable then if psym(p)^.owner^.symtabletype=localsymtable then
begin begin
hr.base:=procinfo.framepointer; hr.base:=procinfo^.framepointer;
hr.offset:=-pvarsym(p)^.address; hr.offset:=-pvarsym(p)^.address;
end end
else else
@ -477,13 +477,13 @@ unit cgobj;
pvarsym(p)^.definition^.needs_inittable and pvarsym(p)^.definition^.needs_inittable and
((pvarsym(p)^.varspez=vs_value)) then ((pvarsym(p)^.varspez=vs_value)) then
begin begin
procinfo.flags:=procinfo.flags or pi_needs_implicit_finally; procinfo^.flags:=procinfo^.flags or pi_needs_implicit_finally;
reset_reference(hr); reset_reference(hr);
hr.symbol:=pvarsym(p)^.definition^.get_inittable_label; hr.symbol:=pvarsym(p)^.definition^.get_inittable_label;
a_param_ref_addr(list,hr,2); a_param_ref_addr(list,hr,2);
reset_reference(hr); reset_reference(hr);
hr.base:=procinfo.framepointer; hr.base:=procinfo^.framepointer;
hr.offset:=pvarsym(p)^.address+procinfo.call_offset; hr.offset:=pvarsym(p)^.address+procinfo^.call_offset;
a_param_ref_addr(list,hr,1); a_param_ref_addr(list,hr,1);
reset_reference(hr); reset_reference(hr);
a_call_name(list,'FPC_ADDREF',0); a_call_name(list,'FPC_ADDREF',0);
@ -510,18 +510,18 @@ unit cgobj;
(pvarsym(p)^.varspez=vs_const) { and (pvarsym(p)^.varspez=vs_const) { and
(dont_copy_const_param(pvarsym(p)^.definition)) } ) then (dont_copy_const_param(pvarsym(p)^.definition)) } ) then
exit; exit;
procinfo.flags:=procinfo.flags or pi_needs_implicit_finally; procinfo^.flags:=procinfo^.flags or pi_needs_implicit_finally;
reset_reference(hr); reset_reference(hr);
case psym(p)^.owner^.symtabletype of case psym(p)^.owner^.symtabletype of
localsymtable: localsymtable:
begin begin
hr.base:=procinfo.framepointer; hr.base:=procinfo^.framepointer;
hr.offset:=-pvarsym(p)^.address; hr.offset:=-pvarsym(p)^.address;
end; end;
parasymtable: parasymtable:
begin begin
hr.base:=procinfo.framepointer; hr.base:=procinfo^.framepointer;
hr.offset:=pvarsym(p)^.address+procinfo.call_offset; hr.offset:=pvarsym(p)^.address+procinfo^.call_offset;
end; end;
else else
hr.symbol:=newasmsymbol(pvarsym(p)^.mangledname); hr.symbol:=newasmsymbol(pvarsym(p)^.mangledname);
@ -561,9 +561,9 @@ unit cgobj;
begin begin
if hp^.temptype in [tt_ansistring,tt_freeansistring] then if hp^.temptype in [tt_ansistring,tt_freeansistring] then
begin begin
procinfo.flags:=procinfo.flags or pi_needs_implicit_finally; procinfo^.flags:=procinfo^.flags or pi_needs_implicit_finally;
reset_reference(hr); reset_reference(hr);
hr.base:=procinfo.framepointer; hr.base:=procinfo^.framepointer;
hr.offset:=hp^.pos; hr.offset:=hp^.pos;
a_param_ref_addr(list,hr,1); a_param_ref_addr(list,hr,1);
a_call_name(list,'FPC_ANSISTR_DECR_REF',0); a_call_name(list,'FPC_ANSISTR_DECR_REF',0);
@ -635,21 +635,21 @@ unit cgobj;
end; end;
{ omit stack frame ? } { omit stack frame ? }
if not inlined then if not inlined then
if procinfo.framepointer=stack_pointer then if procinfo^.framepointer=stack_pointer then
begin begin
CGMessage(cg_d_stackframe_omited); CGMessage(cg_d_stackframe_omited);
nostackframe:=true; nostackframe:=true;
if (aktprocsym^.definition^.proctypeoption in [potype_unitinit,potype_proginit,potype_unitfinalize]) then if (aktprocsym^.definition^.proctypeoption in [potype_unitinit,potype_proginit,potype_unitfinalize]) then
parasize:=0 parasize:=0
else else
parasize:=aktprocsym^.definition^.parast^.datasize+procinfo.call_offset-pointersize; parasize:=aktprocsym^.definition^.parast^.datasize+procinfo^.call_offset-pointersize;
end end
else else
begin begin
if (aktprocsym^.definition^.proctypeoption in [potype_unitinit,potype_proginit,potype_unitfinalize]) then if (aktprocsym^.definition^.proctypeoption in [potype_unitinit,potype_proginit,potype_unitfinalize]) then
parasize:=0 parasize:=0
else else
parasize:=aktprocsym^.definition^.parast^.datasize+procinfo.call_offset-pointersize*2; parasize:=aktprocsym^.definition^.parast^.datasize+procinfo^.call_offset-pointersize*2;
nostackframe:=false; nostackframe:=false;
if (po_interrupt in aktprocsym^.definition^.procoptions) then if (po_interrupt in aktprocsym^.definition^.procoptions) then
@ -693,7 +693,7 @@ unit cgobj;
{ a constructor needs a help procedure } { a constructor needs a help procedure }
if (aktprocsym^.definition^.options and poconstructor)<>0 then if (aktprocsym^.definition^.options and poconstructor)<>0 then
begin begin
if procinfo._class^.isclass then if procinfo^._class^.isclass then
begin begin
list^.concat(new(paicpu,op_sym(A_CALL,S_NO,newasmsymbol('FPC_NEW_CLASS')))); list^.concat(new(paicpu,op_sym(A_CALL,S_NO,newasmsymbol('FPC_NEW_CLASS'))));
list^.concat(new(paicpu,op_cond_sym(A_Jcc,C_Z,S_NO,quickexitlabel))); list^.concat(new(paicpu,op_cond_sym(A_Jcc,C_Z,S_NO,quickexitlabel)));
@ -704,7 +704,7 @@ unit cgobj;
list^.insert(new(pai_labeled,init(A_JZ,quickexitlabel))); list^.insert(new(pai_labeled,init(A_JZ,quickexitlabel)));
list^.insert(new(paicpu,op_csymbol(A_CALL,S_NO, list^.insert(new(paicpu,op_csymbol(A_CALL,S_NO,
newcsymbol('FPC_HELP_CONSTRUCTOR',0)))); newcsymbol('FPC_HELP_CONSTRUCTOR',0))));
list^.insert(new(paicpu,op_const_reg(A_MOV,S_L,procinfo._class^.vmt_offset,R_EDI))); list^.insert(new(paicpu,op_const_reg(A_MOV,S_L,procinfo^._class^.vmt_offset,R_EDI)));
concat_external('FPC_HELP_CONSTRUCTOR',EXT_NEAR); concat_external('FPC_HELP_CONSTRUCTOR',EXT_NEAR);
} }
end; end;
@ -716,12 +716,13 @@ unit cgobj;
{$endif GDB} {$endif GDB}
{ initialize return value } { initialize return value }
if is_ansistring(procinfo.retdef) or if assigned(procinfo^.retdef) and
is_widestring(procinfo.retdef) then is_ansistring(procinfo^.retdef) or
is_widestring(procinfo^.retdef) then
begin begin
reset_reference(hr); reset_reference(hr);
hr.offset:=procinfo.retoffset; hr.offset:=procinfo^.retoffset;
hr.base:=procinfo.framepointer; hr.base:=procinfo^.framepointer;
a_load_const_ref(list,OS_32,0,hr); a_load_const_ref(list,OS_32,0,hr);
end; end;
@ -737,7 +738,7 @@ unit cgobj;
if (cs_profile in aktmoduleswitches) or if (cs_profile in aktmoduleswitches) or
(aktprocsym^.definition^.owner^.symtabletype=globalsymtable) or (aktprocsym^.definition^.owner^.symtabletype=globalsymtable) or
(assigned(procinfo._class) and (procinfo._class^.owner^.symtabletype=globalsymtable)) then (assigned(procinfo^._class) and (procinfo^._class^.owner^.symtabletype=globalsymtable)) then
make_global:=true; make_global:=true;
if not inlined then if not inlined then
begin begin
@ -773,7 +774,7 @@ unit cgobj;
begin begin
if target_os.use_function_relative_addresses then if target_os.use_function_relative_addresses then
list^.insert(stab_function_name); list^.insert(stab_function_name);
if make_global or ((procinfo.flags and pi_is_global) <> 0) then if make_global or ((procinfo^.flags and pi_is_global) <> 0) then
aktprocsym^.is_global := True; aktprocsym^.is_global := True;
list^.insert(new(pai_stabs,init(aktprocsym^.stabstring))); list^.insert(new(pai_stabs,init(aktprocsym^.stabstring)));
aktprocsym^.isstabwritten:=true; aktprocsym^.isstabwritten:=true;
@ -788,7 +789,7 @@ unit cgobj;
mangled_length : longint; mangled_length : longint;
p : pchar; p : pchar;
{$endif GDB} {$endif GDB}
noreraiselabel : pasmlabel; nofinal,noreraiselabel : pasmlabel;
hr : treference; hr : treference;
r : tregister; r : tregister;
@ -799,16 +800,30 @@ unit cgobj;
{ call the destructor help procedure } { call the destructor help procedure }
if (aktprocsym^.definition^.proctypeoption=potype_destructor) then if (aktprocsym^.definition^.proctypeoption=potype_destructor) then
begin begin
if procinfo._class^.is_class then if procinfo^._class^.is_class then
a_call_name(list,'FPC_DISPOSE_CLASS',0) a_call_name(list,'FPC_DISPOSE_CLASS',0)
else else
begin begin
we must do a finalize here for objects if if procinfo^._class^.needs_inittable then
necessary begin
getlabel(nofinal);
{!!!!!!!!!!
reset_reference(hr);
hr.base:=R_EBP;
hr.offset:=8;
a_cmp_reg_const_label(list,OS_ADDR,OZ_EQ,
}
reset_reference(hr);
hr.symbol:=procinfo^._class^.get_inittable_label;
a_paramaddr_ref(list,hr,2);
a_param_reg(list,OS_ADDR,self_pointer,1);
a_call_name(list,'FPC_FINALIZE',0);
a_label(list,nofinal);
end;
{ vmt_offset_reg can be a scratch register, } { vmt_offset_reg can be a scratch register, }
{ but it must be always the same } { but it must be always the same }
a_reg_alloc(list,vmt_offset_reg); a_reg_alloc(list,vmt_offset_reg);
a_load_const_reg(list,OS_32,procinfo._class^.vmt_offset,vmt_offset_reg); a_load_const_reg(list,OS_32,procinfo^._class^.vmt_offset,vmt_offset_reg);
a_call_name(list,'FPC_HELP_DESTRUCTOR',0); a_call_name(list,'FPC_HELP_DESTRUCTOR',0);
a_reg_dealloc(list,vmt_offset_reg); a_reg_dealloc(list,vmt_offset_reg);
end; end;
@ -827,7 +842,7 @@ unit cgobj;
aktprocsym^.definition^.parast^.foreach({$ifndef TP}@{$endif}_finalize_data); aktprocsym^.definition^.parast^.foreach({$ifndef TP}@{$endif}_finalize_data);
{ do we need to handle exceptions because of ansi/widestrings ? } { do we need to handle exceptions because of ansi/widestrings ? }
if (procinfo.flags and pi_needs_implicit_finally)<>0 then if (procinfo^.flags and pi_needs_implicit_finally)<>0 then
begin begin
getlabel(noreraiselabel); getlabel(noreraiselabel);
@ -838,15 +853,15 @@ unit cgobj;
a_reg_dealloc(list,accumulator); a_reg_dealloc(list,accumulator);
{ must be the return value finalized before reraising the exception? } { must be the return value finalized before reraising the exception? }
if (procinfo.retdef<>pdef(voiddef)) and if (procinfo^.retdef<>pdef(voiddef)) and
(procinfo.retdef^.needs_inittable) and (procinfo^.retdef^.needs_inittable) and
((procinfo.retdef^.deftype<>objectdef) or ((procinfo^.retdef^.deftype<>objectdef) or
not(pobjectdef(procinfo.retdef)^.is_class)) then not(pobjectdef(procinfo^.retdef)^.is_class)) then
begin begin
reset_reference(hr); reset_reference(hr);
hr.offset:=procinfo.retoffset; hr.offset:=procinfo^.retoffset;
hr.base:=procinfo.framepointer; hr.base:=procinfo^.framepointer;
g_finalize(list,procinfo.retdef,hr,ret_in_param(procinfo.retdef)); g_finalize(list,procinfo^.retdef,hr,ret_in_param(procinfo^.retdef));
end; end;
a_call_name(list,'FPC_RERAISE',0); a_call_name(list,'FPC_RERAISE',0);
@ -912,39 +927,50 @@ unit cgobj;
{$ifdef GDB} {$ifdef GDB}
if (cs_debuginfo in aktmoduleswitches) and not inlined then if (cs_debuginfo in aktmoduleswitches) and not inlined then
begin begin
aktprocsym^.concatstabto(exprasmlist); aktprocsym^.concatstabto(list);
if assigned(procinfo._class) then if assigned(procinfo^._class) then
if (not assigned(procinfo.parent) or if (not assigned(procinfo^.parent) or
not assigned(procinfo.parent^._class)) then not assigned(procinfo^.parent^._class)) then
list^.concat(new(pai_stabs,init(strpnew( list^.concat(new(pai_stabs,init(strpnew(
'"$t:v'+procinfo._class^.numberstring+'",'+ '"$t:v'+procinfo^._class^.numberstring+'",'+
tostr(N_PSYM)+',0,0,'+tostr(procinfo.selfpointer_offset))))) tostr(N_PSYM)+',0,0,'+tostr(procinfo^.selfpointer_offset)))));
{!!!!!!!!!!!!
else else
list^.concat(new(pai_stabs,init(strpnew( list^.concat(new(pai_stabs,init(strpnew(
'"$t:r'+procinfo._class^.numberstring+'",'+ '"$t:r'+procinfo^._class^.numberstring+'",'+
tostr(N_RSYM)+',0,0,'+tostr(GDB_i386index[R_ESI]))))); tostr(N_RSYM)+',0,0,'+tostr(GDB_i386index[R_ESI])))));
}
if (pdef(aktprocsym^.definition^.retdef) <> pdef(voiddef)) then if (pdef(aktprocsym^.definition^.retdef) <> pdef(voiddef)) then
begin
if ret_in_param(aktprocsym^.definition^.retdef) then if ret_in_param(aktprocsym^.definition^.retdef) then
list^.concat(new(pai_stabs,init(strpnew( list^.concat(new(pai_stabs,init(strpnew(
'"'+aktprocsym^.name+':X*'+aktprocsym^.definition^.retdef^.numberstring+'",'+ '"'+aktprocsym^.name+':X*'+aktprocsym^.definition^.retdef^.numberstring+'",'+
tostr(N_PSYM)+',0,0,'+tostr(procinfo.retoffset))))) tostr(N_PSYM)+',0,0,'+tostr(procinfo^.retoffset)))))
else else
list^.concat(new(pai_stabs,init(strpnew( list^.concat(new(pai_stabs,init(strpnew(
'"'+aktprocsym^.name+':X'+aktprocsym^.definition^.retdef^.numberstring+'",'+ '"'+aktprocsym^.name+':X'+aktprocsym^.definition^.retdef^.numberstring+'",'+
tostr(N_PSYM)+',0,0,'+tostr(procinfo.retoffset))))); tostr(N_PSYM)+',0,0,'+tostr(procinfo^.retoffset)))));
if (m_result in aktmodeswitches) then
if ret_in_param(aktprocsym^.definition^.retdef) then
list^.concat(new(pai_stabs,init(strpnew(
'"RESULT:X*'+aktprocsym^.definition^.retdef^.numberstring+'",'+
tostr(N_PSYM)+',0,0,'+tostr(procinfo^.retoffset)))))
else
list^.concat(new(pai_stabs,init(strpnew(
'"RESULT:X'+aktprocsym^.definition^.retdef^.numberstring+'",'+
tostr(N_PSYM)+',0,0,'+tostr(procinfo^.retoffset)))));
end;
mangled_length:=length(aktprocsym^.definition^.mangledname); mangled_length:=length(aktprocsym^.definition^.mangledname);
getmem(p,mangled_length+50); getmem(p,mangled_length+50);
strpcopy(p,'192,0,0,'); strpcopy(p,'192,0,0,');
strpcopy(strend(p),aktprocsym^.definition^.mangledname); strpcopy(strend(p),aktprocsym^.definition^.mangledname);
exprasmlist^.concat(new(pai_stabn,init(strnew(p)))); list^.concat(new(pai_stabn,init(strnew(p))));
{list^.concat(new(pai_stabn,init(strpnew('192,0,0,' {list^.concat(new(pai_stabn,init(strpnew('192,0,0,'
+aktprocsym^.definition^.mangledname)))); +aktprocsym^.definition^.mangledname))));
p[0]:='2';p[1]:='2';p[2]:='4'; p[0]:='2';p[1]:='2';p[2]:='4';
strpcopy(strend(p),'_end');} strpcopy(strend(p),'_end');}
freemem(p,mangled_length+50); freemem(p,mangled_length+50);
exprasmlist^.concat(new(pai_stabn,init( list^.concat(new(pai_stabn,init(
strpnew('224,0,0,'+aktexit2label^.name)))); strpnew('224,0,0,'+aktexit2label^.name))));
{ strpnew('224,0,0,' { strpnew('224,0,0,'
+aktprocsym^.definition^.mangledname+'_end'))));} +aktprocsym^.definition^.mangledname+'_end'))));}
@ -1082,7 +1108,10 @@ unit cgobj;
end. end.
{ {
$Log$ $Log$
Revision 1.27 1999-09-29 11:46:20 florian Revision 1.28 1999-10-12 21:20:46 florian
* new codegenerator compiles again
Revision 1.27 1999/09/29 11:46:20 florian
* fixed bug 292 from bugs directory * fixed bug 292 from bugs directory
Revision 1.26 1999/09/14 11:16:09 florian Revision 1.26 1999/09/14 11:16:09 florian

View File

@ -190,8 +190,8 @@ unit nmem;
hregister:=tg.getregisterint; hregister:=tg.getregisterint;
{ make a reference } { make a reference }
hp:=new_reference(procinfo.framepointer, hp:=new_reference(procinfo^.framepointer,
procinfo.framepointer_offset); procinfo^.framepointer_offset);
exprasmlist^.concat(new(paicpu,op_ref_reg(A_MOV,S_L,hp,hregister))); exprasmlist^.concat(new(paicpu,op_ref_reg(A_MOV,S_L,hp,hregister)));
@ -216,7 +216,7 @@ unit nmem;
end; end;
stt_exceptsymtable: stt_exceptsymtable:
begin begin
location.reference.base:=procinfo.framepointer; location.reference.base:=procinfo^.framepointer;
location.reference.offset:=pvarsym(symtableentry)^.address; location.reference.offset:=pvarsym(symtableentry)^.address;
end; end;
objectsymtable: objectsymtable:
@ -239,7 +239,7 @@ unit nmem;
{ symtable datasize field { symtable datasize field
contains the offset of the temp contains the offset of the temp
stored } stored }
hp:=new_reference(procinfo.framepointer, hp:=new_reference(procinfo^.framepointer,
symtable^.datasize); symtable^.datasize);
exprasmlist^.concat(new(paicpu,op_ref_reg(A_MOV,S_L,hp,hregister))); exprasmlist^.concat(new(paicpu,op_ref_reg(A_MOV,S_L,hp,hregister)));
@ -262,7 +262,7 @@ unit nmem;
if is_open_array(pvarsym(symtableentry)^.definition) or if is_open_array(pvarsym(symtableentry)^.definition) or
is_open_string(pvarsym(symtableentry)^.definition) then is_open_string(pvarsym(symtableentry)^.definition) then
begin begin
if (location.reference.base=procinfo.framepointer) then if (location.reference.base=procinfo^.framepointer) then
begin begin
highframepointer:=location.reference.base; highframepointer:=location.reference.base;
highoffset:=location.reference.offset; highoffset:=location.reference.offset;
@ -711,7 +711,10 @@ unit nmem;
end. end.
{ {
$Log$ $Log$
Revision 1.13 1999-09-15 20:35:46 florian Revision 1.14 1999-10-12 21:20:46 florian
* new codegenerator compiles again
Revision 1.13 1999/09/15 20:35:46 florian
* small fix to operator overloading when in MMX mode * small fix to operator overloading when in MMX mode
+ the compiler uses now fldz and fld1 if possible + the compiler uses now fldz and fld1 if possible
+ some fixes to floating point registers + some fixes to floating point registers

View File

@ -106,7 +106,7 @@ implementation
procedure firstasm(var p : ptree); procedure firstasm(var p : ptree);
begin begin
procinfo.flags:=procinfo.flags or pi_uses_asm; procinfo.flags:=procinfo^.flags or pi_uses_asm;
end; end;
{$endif dummy} {$endif dummy}
@ -123,35 +123,9 @@ implementation
not_first : boolean; not_first : boolean;
{$endif extdebug} {$endif extdebug}
begin begin
{$ifdef extdebug}
inc(total_of_firstpass);
if (p^.firstpasscount>0) and only_one_pass then
exit;
{$endif extdebug}
oldcodegenerror:=codegenerror; oldcodegenerror:=codegenerror;
oldpos:=aktfilepos; oldpos:=aktfilepos;
oldlocalswitches:=aktlocalswitches; oldlocalswitches:=aktlocalswitches;
{$ifdef extdebug}
if p^.firstpasscount>0 then
begin
move(p^,str1[1],sizeof(ttree));
{$ifndef TP}
{$ifopt H+}
SetLength(str1,sizeof(ttree));
{$else}
str1[0]:=char(sizeof(ttree));
{$endif}
{$else}
str1[0]:=char(sizeof(ttree));
{$endif}
new(oldp);
oldp^:=p^;
not_first:=true;
inc(firstpass_several);
end
else
not_first:=false;
{$endif extdebug}
if not p^.error then if not p^.error then
begin begin
@ -166,33 +140,6 @@ implementation
end end
else else
codegenerror:=true; codegenerror:=true;
{$ifdef extdebug}
if not_first then
begin
{ dirty trick to compare two ttree's (PM) }
move(p^,str2[1],sizeof(ttree));
{$ifndef TP}
{$ifopt H+}
SetLength(str2,sizeof(ttree));
{$else}
str2[0]:=char(sizeof(ttree));
{$endif}
{$else}
str2[0]:=char(sizeof(ttree));
{$endif}
if str1<>str2 then
begin
comment(v_debug,'tree changed after first counting pass '
+tostr(longint(p^.treetype)));
{!!!!!!! compare_trees(oldp,p); }
end;
dispose(oldp);
end;
{!!!!!!!
if count_ref then
inc(p^.firstpasscount);
}
{$endif extdebug}
end; end;
@ -221,7 +168,10 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.5 1999-08-04 00:23:57 florian 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 * renamed i386asm and i386base to cpuasm and cpubase
Revision 1.4 1999/08/01 18:22:36 florian Revision 1.4 1999/08/01 18:22:36 florian

View File

@ -288,7 +288,7 @@ implementation
{ only if no asm is used } { only if no asm is used }
{ and no try statement } { and no try statement }
if (cs_regalloc in aktglobalswitches) and if (cs_regalloc in aktglobalswitches) and
((procinfo.flags and (pi_uses_asm or pi_uses_exceptions))=0) then ((procinfo^.flags and (pi_uses_asm or pi_uses_exceptions))=0) then
begin begin
{ can we omit the stack frame ? } { can we omit the stack frame ? }
{ conditions: { conditions:
@ -301,25 +301,25 @@ implementation
begin begin
if not(aktprocsym^.definition^.proctypeoption in [potype_constructor,potype_destructor]) and if not(aktprocsym^.definition^.proctypeoption in [potype_constructor,potype_destructor]) and
not(po_interrupt in aktprocsym^.definition^.procoptions) and not(po_interrupt in aktprocsym^.definition^.procoptions) and
((procinfo.flags and pi_do_call)=0) and ((procinfo^.flags and pi_do_call)=0) and
(lexlevel>=normal_function_level) then (lexlevel>=normal_function_level) then
begin begin
{ use ESP as frame pointer } { use ESP as frame pointer }
procinfo.framepointer:=stack_pointer; procinfo^.framepointer:=stack_pointer;
use_esp_stackframe:=true; use_esp_stackframe:=true;
{ calc parameter distance new } { calc parameter distance new }
dec(procinfo.framepointer_offset,pointersize); dec(procinfo^.framepointer_offset,pointersize);
dec(procinfo.selfpointer_offset,pointersize); dec(procinfo^.selfpointer_offset,pointersize);
{ is this correct ???} { is this correct ???}
{ retoffset can be negativ for results in eax !! } { retoffset can be negativ for results in eax !! }
{ the value should be decreased only if positive } { the value should be decreased only if positive }
if procinfo.retoffset>=0 then if procinfo^.retoffset>=0 then
dec(procinfo.retoffset,4); dec(procinfo^.retoffset,4);
dec(procinfo.call_offset,4); dec(procinfo^.call_offset,4);
aktprocsym^.definition^.parast^.address_fixup:=procinfo.call_offset; aktprocsym^.definition^.parast^.address_fixup:=procinfo^.call_offset;
end; end;
end; end;
if (p^.registersint<maxvarregs) then if (p^.registersint<maxvarregs) then
@ -413,10 +413,10 @@ implementation
{ when loading parameter to reg } { when loading parameter to reg }
new(hr); new(hr);
reset_reference(hr^); reset_reference(hr^);
hr^.offset:=pvarsym(regvars[i])^.address+procinfo.call_offset; hr^.offset:=pvarsym(regvars[i])^.address+procinfo^.call_offset;
hr^.base:=procinfo.framepointer; hr^.base:=procinfo^.framepointer;
{$ifdef i386} {$ifdef i386}
procinfo.aktentrycode^.concat(new(paicpu,op_ref_reg(A_MOV,regsize, procinfo^.aktentrycode^.concat(new(paicpu,op_ref_reg(A_MOV,regsize,
hr,regvars[i]^.reg))); hr,regvars[i]^.reg)));
{$endif i386} {$endif i386}
{$ifdef m68k} {$ifdef m68k}
@ -451,20 +451,23 @@ implementation
do_secondpass(p); do_secondpass(p);
if assigned(procinfo.def) then if assigned(procinfo^.def) then
procinfo.def^.fpu_used:=p^.registersfpu; procinfo^.def^.fpu_used:=p^.registersfpu;
{ all registers can be used again } { all registers can be used again }
tg.resetusableregisters; tg.resetusableregisters;
end; end;
procinfo.aktproccode^.concatlist(exprasmlist); procinfo^.aktproccode^.concatlist(exprasmlist);
make_const_global:=false; make_const_global:=false;
end; end;
end. end.
{ {
$Log$ $Log$
Revision 1.7 1999-08-25 12:00:13 jonas Revision 1.8 1999-10-12 21:20:47 florian
* new codegenerator compiles again
Revision 1.7 1999/08/25 12:00:13 jonas
* changed pai386, paippc and paiapha (same for tai*) to paicpu (taicpu) * changed pai386, paippc and paiapha (same for tai*) to paicpu (taicpu)
Revision 1.6 1999/08/05 14:58:15 florian Revision 1.6 1999/08/05 14:58:15 florian

View File

@ -267,9 +267,6 @@ end;
begin begin
oldexit:=exitproc; oldexit:=exitproc;
exitproc:=@myexit; exitproc:=@myexit;
{$ifdef fpc}
heapblocks:=true;
{$endif}
{$ifdef UseOverlay} {$ifdef UseOverlay}
InitOverlay; InitOverlay;
{$endif} {$endif}
@ -279,7 +276,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.6 1999-08-04 12:59:22 jonas Revision 1.7 1999-10-12 21:20:47 florian
* new codegenerator compiles again
Revision 1.6 1999/08/04 12:59:22 jonas
* all tokes now start with an underscore * all tokes now start with an underscore
* PowerPC compiles!! * PowerPC compiles!!

View File

@ -326,7 +326,7 @@ unit tgobj;
{ do a reset, because the reference isn't used } { do a reset, because the reference isn't used }
reset_reference(ref); reset_reference(ref);
ref.offset:=gettempofsize(l); ref.offset:=gettempofsize(l);
ref.base:=procinfo.framepointer; ref.base:=procinfo^.framepointer;
end; end;
@ -336,7 +336,7 @@ unit tgobj;
begin begin
{ do a reset, because the reference isn't used } { do a reset, because the reference isn't used }
reset_reference(ref); reset_reference(ref);
ref.base:=procinfo.framepointer; ref.base:=procinfo^.framepointer;
{ Reuse old ansi slot ? } { Reuse old ansi slot ? }
foundslot:=nil; foundslot:=nil;
tl:=templist; tl:=templist;
@ -406,7 +406,7 @@ unit tgobj;
function ttgobj.istemp(const ref : treference) : boolean; function ttgobj.istemp(const ref : treference) : boolean;
begin begin
istemp:=((ref.base=procinfo.framepointer) and istemp:=((ref.base=procinfo^.framepointer) and
(ref.offset<firsttemp)); (ref.offset<firsttemp));
end; end;
@ -692,7 +692,10 @@ unit tgobj;
end. end.
{ {
$Log$ $Log$
Revision 1.6 1999-09-10 18:48:11 florian Revision 1.7 1999-10-12 21:20:47 florian
* new codegenerator compiles again
Revision 1.6 1999/09/10 18:48:11 florian
* some bug fixes (e.g. must_be_valid and procinfo.funcret_is_valid) * some bug fixes (e.g. must_be_valid and procinfo.funcret_is_valid)
* most things for stored properties fixed * most things for stored properties fixed

View File

@ -44,7 +44,7 @@ blockn:
{ Funktionsresultate an exit anh„ngen } { Funktionsresultate an exit anh„ngen }
{ this is wrong for string or other complex { this is wrong for string or other complex
result types !!! } result types !!! }
if ret_in_acc(procinfo.retdef) and if ret_in_acc(procinfo^.retdef) and
assigned(hp^.left) and assigned(hp^.left) and
(hp^.left^.right^.treetype=exitn) and (hp^.left^.right^.treetype=exitn) and
(hp^.right^.treetype=assignn) and (hp^.right^.treetype=assignn) and
@ -82,7 +82,10 @@ end.
{ {
$Log$ $Log$
Revision 1.1 1999-01-23 23:35:02 florian Revision 1.2 1999-10-12 21:20:47 florian
* new codegenerator compiles again
Revision 1.1 1999/01/23 23:35:02 florian
+ first versions + first versions
} }

View File

@ -116,7 +116,8 @@ unit tree;
arrayconstructrangen, {Range element to allow sets in array construction tree} arrayconstructrangen, {Range element to allow sets in array construction tree}
{ added for optimizations where we cannot suppress } { added for optimizations where we cannot suppress }
nothingn, nothingn,
loadvmtn loadvmtn,
pointerconstn
); );
tconverttype = ( tconverttype = (
@ -133,8 +134,9 @@ unit tree;
tc_array_2_pointer, tc_array_2_pointer,
tc_pointer_2_array, tc_pointer_2_array,
tc_int_2_int, tc_int_2_int,
tc_bool_2_int,
tc_int_2_bool, tc_int_2_bool,
tc_bool_2_bool,
tc_bool_2_int,
tc_real_2_real, tc_real_2_real,
tc_int_2_real, tc_int_2_real,
tc_int_2_fix, tc_int_2_fix,
@ -143,7 +145,7 @@ unit tree;
tc_proc_2_procvar, tc_proc_2_procvar,
tc_arrayconstructor_2_set, tc_arrayconstructor_2_set,
tc_load_smallset, tc_load_smallset,
tc_bool_2_bool tc_cord_2_pointer
); );
{ different assignment types } { different assignment types }
@ -358,6 +360,7 @@ unit tree;
function gensubscriptnode(varsym : pvarsym;l : ptree) : ptree; function gensubscriptnode(varsym : pvarsym;l : ptree) : ptree;
function genordinalconstnode(v : longint;def : pdef) : ptree; function genordinalconstnode(v : longint;def : pdef) : ptree;
function genfixconstnode(v : longint;def : pdef) : ptree; function genfixconstnode(v : longint;def : pdef) : ptree;
function genpointerconstnode(v : longint;def : pdef) : ptree;
function gentypeconvnode(node : ptree;t : pdef) : ptree; function gentypeconvnode(node : ptree;t : pdef) : ptree;
function gentypenode(t : pdef;sym:ptypesym) : ptree; function gentypenode(t : pdef;sym:ptypesym) : ptree;
function gencallparanode(expr,next : ptree) : ptree; function gencallparanode(expr,next : ptree) : ptree;
@ -601,7 +604,8 @@ unit tree;
'arrayconstructn', 'arrayconstructn',
'arrayconstructrangen', 'arrayconstructrangen',
'nothingn', 'nothingn',
'loadvmtn'); 'loadvmtn',
'pointerconstn');
begin begin
write(indention,'(',treetype2str[treetype]); write(indention,'(',treetype2str[treetype]);
@ -1277,6 +1281,27 @@ unit tree;
end; end;
function genpointerconstnode(v : longint;def : pdef) : ptree;
var
p : ptree;
begin
p:=getnode;
p^.disposetyp:=dt_nothing;
p^.treetype:=pointerconstn;
p^.registers32:=0;
{ p^.registers16:=0;
p^.registers8:=0; }
p^.registersfpu:=0;
{$ifdef SUPPORT_MMX}
p^.registersmmx:=0;
{$endif SUPPORT_MMX}
p^.resulttype:=def;
p^.value:=v;
genpointerconstnode:=p;
end;
function gensinglenode(t : ttreetyp;l : ptree) : ptree; function gensinglenode(t : ttreetyp;l : ptree) : ptree;
var var
@ -2018,7 +2043,10 @@ unit tree;
end. end.
{ {
$Log$ $Log$
Revision 1.14 1999-09-14 11:16:09 florian Revision 1.15 1999-10-12 21:20:47 florian
* new codegenerator compiles again
Revision 1.14 1999/09/14 11:16:09 florian
* only small updates to work with the current compiler * only small updates to work with the current compiler
Revision 1.13 1999/08/06 18:05:55 florian Revision 1.13 1999/08/06 18:05:55 florian

View File

@ -47,7 +47,10 @@ unit parser;
uses uses
globtype,version,tokens,systems, globtype,version,tokens,systems,
cobjects,globals,verbose, cobjects,globals,verbose,
symtable,files,aasm,hcodegen, symtable,files,aasm,
{$ifndef newcg}
hcodegen,
{$endif newcg}
assemble,link,script,gendef, assemble,link,script,gendef,
{$ifdef BrowserLog} {$ifdef BrowserLog}
browlog, browlog,
@ -61,6 +64,8 @@ unit parser;
{$ifdef newcg} {$ifdef newcg}
cgobj, cgobj,
cgcpu, cgcpu,
{ cgbase must be after hcodegen to use the correct procinfo !!! }
cgbase,
{$endif newcg} {$endif newcg}
comphook,tree,scanner,pbase,pdecl,psystem,pmodules,cresstr; comphook,tree,scanner,pbase,pdecl,psystem,pmodules,cresstr;
@ -482,7 +487,10 @@ unit parser;
end. end.
{ {
$Log$ $Log$
Revision 1.87 1999-10-03 19:44:41 peter Revision 1.88 1999-10-12 21:20:45 florian
* new codegenerator compiles again
Revision 1.87 1999/10/03 19:44:41 peter
* removed objpasunit reference, tvarrec is now searched in systemunit * removed objpasunit reference, tvarrec is now searched in systemunit
where it already was located where it already was located

View File

@ -43,7 +43,12 @@ unit pmodules;
uses uses
globtype,version,systems,tokens, globtype,version,systems,tokens,
cobjects,comphook,globals,verbose,files, cobjects,comphook,globals,verbose,files,
symconst,symtable,aasm,hcodegen, symconst,symtable,aasm,
{$ifdef newcg}
cgbase,
{$else newcg}
hcodegen,
{$endif newcg}
link,assemble,import,export,gendef,ppu,comprsrc, link,assemble,import,export,gendef,ppu,comprsrc,
cresstr,cpubase,cpuasm, cresstr,cpubase,cpuasm,
scanner,pbase,psystem,pdecl,psub,parser; scanner,pbase,psystem,pdecl,psub,parser;
@ -1455,7 +1460,10 @@ unit pmodules;
end. end.
{ {
$Log$ $Log$
Revision 1.158 1999-10-03 19:44:42 peter Revision 1.159 1999-10-12 21:20:45 florian
* new codegenerator compiles again
Revision 1.158 1999/10/03 19:44:42 peter
* removed objpasunit reference, tvarrec is now searched in systemunit * removed objpasunit reference, tvarrec is now searched in systemunit
where it already was located where it already was located

View File

@ -53,7 +53,12 @@ uses
strings,globals,verbose,files, strings,globals,verbose,files,
scanner,aasm,tree,types, scanner,aasm,tree,types,
import,gendef, import,gendef,
hcodegen,temp_gen,pass_1,cpubase,cpuasm {$ifdef newcg}
cgbase,
{$else newcg}
hcodegen,
{$endif newcg}
temp_gen,pass_1,cpubase,cpuasm
{$ifndef NOPASS2} {$ifndef NOPASS2}
,pass_2 ,pass_2
{$endif} {$endif}
@ -130,7 +135,11 @@ begin
{$else} {$else}
aktprocsym^.definition^.procoptions:=aktprocsym^.definition^.procoptions+[po_containsself]; aktprocsym^.definition^.procoptions:=aktprocsym^.definition^.procoptions+[po_containsself];
{$endif} {$endif}
{$ifdef newcg}
inc(procinfo^.selfpointer_offset,vs^.address);
{$else newcg}
inc(procinfo^.ESI_offset,vs^.address); inc(procinfo^.ESI_offset,vs^.address);
{$endif newcg}
consume(idtoken); consume(idtoken);
consume(_COLON); consume(_COLON);
p:=single_type(hs1,false); p:=single_type(hs1,false);
@ -473,7 +482,11 @@ begin
{ self isn't pushed in nested procedure of methods } { self isn't pushed in nested procedure of methods }
if assigned(procinfo^._class) and (lexlevel=normal_function_level) then if assigned(procinfo^._class) and (lexlevel=normal_function_level) then
begin begin
{$ifdef newcg}
procinfo^.selfpointer_offset:=paramoffset;
{$else newcg}
procinfo^.ESI_offset:=paramoffset; procinfo^.ESI_offset:=paramoffset;
{$endif newcg}
if assigned(aktprocsym^.definition) and if assigned(aktprocsym^.definition) and
not(po_containsself in aktprocsym^.definition^.procoptions) then not(po_containsself in aktprocsym^.definition^.procoptions) then
inc(paramoffset,target_os.size_of_pointer); inc(paramoffset,target_os.size_of_pointer);
@ -2078,7 +2091,10 @@ end.
{ {
$Log$ $Log$
Revision 1.26 1999-10-03 19:38:39 peter Revision 1.27 1999-10-12 21:20:46 florian
* new codegenerator compiles again
Revision 1.26 1999/10/03 19:38:39 peter
* fixed forward decl check for tp7/delphi * fixed forward decl check for tp7/delphi
Revision 1.25 1999/10/01 10:05:44 peter Revision 1.25 1999/10/01 10:05:44 peter