From 91bbc7bea36db62b23d82e017daba63e28c2ecf6 Mon Sep 17 00:00:00 2001 From: florian Date: Wed, 30 Apr 2003 20:53:32 +0000 Subject: [PATCH] * error when address of an abstract method is taken * fixed some x86-64 problems * merged some more x86-64 and i386 code --- compiler/i386/n386cnv.pas | 111 +---------- compiler/msg/errore.msg | 2 + compiler/msgidx.inc | 5 +- compiler/msgtxt.inc | 345 ++++++++++++++++----------------- compiler/ncgcal.pas | 18 +- compiler/ptconst.pas | 12 +- compiler/{i386 => x86}/cga.pas | 11 +- compiler/x86/cgx86.pas | 28 ++- compiler/x86/cpubase.pas | 87 +++++---- compiler/x86_64/cga.pas | 180 ----------------- compiler/x86_64/cpunode.pas | 20 +- compiler/x86_64/cpupara.pas | 31 ++- compiler/x86_64/nx64cnv.pas | 180 +++++++++++++++++ 13 files changed, 520 insertions(+), 510 deletions(-) rename compiler/{i386 => x86}/cga.pas (97%) delete mode 100644 compiler/x86_64/cga.pas create mode 100644 compiler/x86_64/nx64cnv.pas diff --git a/compiler/i386/n386cnv.pas b/compiler/i386/n386cnv.pas index 4927ef3ec9..b02acc02a2 100644 --- a/compiler/i386/n386cnv.pas +++ b/compiler/i386/n386cnv.pas @@ -27,10 +27,10 @@ unit n386cnv; interface uses - node,ncgcnv,defutil,defcmp; + node,ncgcnv,defutil,defcmp,nx86cnv; type - ti386typeconvnode = class(tcgtypeconvnode) + ti386typeconvnode = class(tx86typeconvnode) protected { procedure second_int_to_int;override; } { procedure second_string_to_string;override; } @@ -46,7 +46,7 @@ interface { procedure second_cord_to_pointer;override; } { procedure second_proc_to_procvar;override; } { procedure second_bool_to_int;override; } - procedure second_int_to_bool;override; + { procedure second_int_to_bool;override; } { procedure second_load_smallset;override; } { procedure second_ansistring_to_pchar;override; } { procedure second_pchar_to_string;override; } @@ -70,10 +70,6 @@ implementation cgobj,cga,tgobj,rgobj,rgcpu,ncgutil; -{***************************************************************************** - SecondTypeConv -*****************************************************************************} - function ti386typeconvnode.first_int_to_real : tnode; begin @@ -227,100 +223,6 @@ implementation end; - procedure ti386typeconvnode.second_int_to_bool; - var - hregister : tregister; - pref : treference; - resflags : tresflags; - hlabel,oldtruelabel,oldfalselabel : tasmlabel; - begin - oldtruelabel:=truelabel; - oldfalselabel:=falselabel; - objectlibrary.getlabel(truelabel); - objectlibrary.getlabel(falselabel); - secondpass(left); - if codegenerror then - exit; - { byte(boolean) or word(wordbool) or longint(longbool) must } - { be accepted for var parameters } - if (nf_explicit in flags) and - (left.resulttype.def.size=resulttype.def.size) and - (left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE,LOC_CREGISTER]) then - begin - location_copy(location,left.location); - truelabel:=oldtruelabel; - falselabel:=oldfalselabel; - exit; - end; - - { Load left node into flag F_NE/F_E } - resflags:=F_NE; - location_release(exprasmlist,left.location); - case left.location.loc of - LOC_CREFERENCE, - LOC_REFERENCE : - begin - if left.location.size in [OS_64,OS_S64] then - begin - hregister:=rg.getregisterint(exprasmlist,OS_INT); - emit_ref_reg(A_MOV,S_L,left.location.reference,hregister); - pref:=left.location.reference; - inc(pref.offset,4); - emit_ref_reg(A_OR,S_L,pref,hregister); - end - else - begin - location_force_reg(exprasmlist,left.location,left.location.size,true); - cg.a_op_reg_reg(exprasmlist,OP_OR,left.location.size,left.location.register,left.location.register); - end; - end; - LOC_FLAGS : - begin - resflags:=left.location.resflags; - end; - LOC_REGISTER,LOC_CREGISTER : - begin - if left.location.size in [OS_64,OS_S64] then - begin - {$ifdef newra} - hregister:=rg.getregisterint(exprasmlist,OS_32); - {$else} - hregister:=cg.get_scratch_reg_int(exprasmlist,OS_32); - {$endif} - cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,left.location.registerlow,hregister); - cg.a_op_reg_reg(exprasmlist,OP_OR,OS_32,left.location.registerhigh,hregister); - {$ifdef newra} - rg.ungetregisterint(exprasmlist,hregister); - {$else} - cg.free_scratch_reg(exprasmlist,hregister); - {$endif} - end - else - cg.a_op_reg_reg(exprasmlist,OP_OR,left.location.size,left.location.register,left.location.register); - end; - LOC_JUMP : - begin - hregister:=rg.getregisterint(exprasmlist,OS_INT); - objectlibrary.getlabel(hlabel); - cg.a_label(exprasmlist,truelabel); - cg.a_load_const_reg(exprasmlist,OS_INT,1,hregister); - cg.a_jmp_always(exprasmlist,hlabel); - cg.a_label(exprasmlist,falselabel); - cg.a_load_const_reg(exprasmlist,OS_INT,0,hregister); - cg.a_label(exprasmlist,hlabel); - cg.a_op_reg_reg(exprasmlist,OP_OR,OS_INT,hregister,hregister); - end; - else - internalerror(10062); - end; - { load flags to register } - location_reset(location,LOC_REGISTER,def_cgsize(resulttype.def)); - location.register:=def_getreg(resulttype.def); - cg.g_flags2reg(exprasmlist,location.size,resflags,location.register); - truelabel:=oldtruelabel; - falselabel:=oldfalselabel; - end; - {$ifdef TESTOBJEXT2} procedure ti386typeconvnode.checkobject; var @@ -456,7 +358,12 @@ begin end. { $Log$ - Revision 1.60 2003-04-23 20:16:04 peter + Revision 1.61 2003-04-30 20:53:32 florian + * error when address of an abstract method is taken + * fixed some x86-64 problems + * merged some more x86-64 and i386 code + + Revision 1.60 2003/04/23 20:16:04 peter + added currency support based on int64 + is_64bit for use in cg units instead of is_64bitint * removed cgmessage from n386add, replace with internalerrors diff --git a/compiler/msg/errore.msg b/compiler/msg/errore.msg index 368be30cbe..f0e3819c5e 100644 --- a/compiler/msg/errore.msg +++ b/compiler/msg/errore.msg @@ -1107,6 +1107,8 @@ type_w_smaller_possible_range_check=04048_W_Type size mismatch, possible loss of type_h_smaller_possible_range_check=04049_H_Type size mismatch, possible loss of data / range check error % There is an assignment to a smaller type than the source type. This means that % this may cause a range-check error, or may lead to possible loss of data. +type_e_cant_take_address_of_abstract_method=04050_E_The address of an abstract method can't be taken +% An abstract method has no body, so the address of an abstract method can't be taken. % \end{description} # # Symtable diff --git a/compiler/msgidx.inc b/compiler/msgidx.inc index 099cb6ca80..1f089b94cf 100644 --- a/compiler/msgidx.inc +++ b/compiler/msgidx.inc @@ -301,6 +301,7 @@ const type_h_in_range_check=04047; type_w_smaller_possible_range_check=04048; type_h_smaller_possible_range_check=04049; + type_e_cant_take_address_of_abstract_method=04050; sym_e_id_not_found=05000; sym_f_internal_error_in_symtablestack=05001; sym_e_duplicate_id=05002; @@ -608,9 +609,9 @@ const option_info=11024; option_help_pages=11025; - MsgTxtSize = 34438; + MsgTxtSize = 34495; MsgIdxMax : array[1..20] of longint=( - 17,62,195,50,57,44,98,19,35,43, + 17,62,195,51,57,44,98,19,35,43, 40,1,1,1,1,1,1,1,1,1 ); diff --git a/compiler/msgtxt.inc b/compiler/msgtxt.inc index a490c6bc42..a4d43eeb00 100644 --- a/compiler/msgtxt.inc +++ b/compiler/msgtxt.inc @@ -337,328 +337,327 @@ const msgtxt : array[0..000143,1..240] of char=( '04047_H_The left operand of the IN operator should b','e byte sized'#000+ '04048_W_Type size mismatch, possible loss of data / range check error'#000+ '04049_H_Type size mismatch, possible loss of data / range check error'#000+ - '05000_E_Identifier not found "$1"'#000+ + '04050_E_The address of an abstract method can'#039't be taken'#000+ + '05000_E_Identifier not found "','$1"'#000+ '05001_F_Internal Error in SymTableStack()'#000+ - '05002_E_Dup','licate identifier "$1"'#000+ + '05002_E_Duplicate identifier "$1"'#000+ '05003_H_Identifier already defined in $1 at line $2'#000+ '05004_E_Unknown identifier "$1"'#000+ '05005_E_Forward declaration not solved "$1"'#000+ - '05007_E_Error in type definition'#000+ + '05007_E_Error in type definition',#000+ '05009_E_Forward type not resolved "$1"'#000+ - '05010_E_Only stat','ic variables can be used in static methods or outsi'+ - 'de methods'#000+ + '05010_E_Only static variables can be used in static methods or outside'+ + ' methods'#000+ '05012_F_record or class type expected'#000+ '05013_E_Instances of classes or objects with an abstract method are no'+ 't allowed'#000+ - '05014_W_Label not defined "$1"'#000+ - '05015_E_Label used but not de','fined "$1"'#000+ + '050','14_W_Label not defined "$1"'#000+ + '05015_E_Label used but not defined "$1"'#000+ '05016_E_Illegal label declaration'#000+ '05017_E_GOTO and LABEL are not supported (use switch -Sg)'#000+ '05018_E_Label not found'#000+ '05019_E_identifier isn'#039't a label'#000+ - '05020_E_label already defined'#000+ + '05020_E_label already d','efined'#000+ '05021_E_illegal type declaration of set elements'#000+ - '0','5022_E_Forward class definition not resolved "$1"'#000+ + '05022_E_Forward class definition not resolved "$1"'#000+ '05023_H_Unit "$1" not used in $2'#000+ '05024_H_Parameter "$1" not used'#000+ '05025_N_Local variable "$1" not used'#000+ - '05026_H_Value parameter "$1" is assigned but never used'#000+ - '05027_N_Local variable "$1" is a','ssigned but never used'#000+ + '05026_H_Value parameter "$1" is',' assigned but never used'#000+ + '05027_N_Local variable "$1" is assigned but never used'#000+ '05028_H_Local $1 "$2" is not used'#000+ '05029_N_Private field "$1.$2" is never used'#000+ '05030_N_Private field "$1.$2" is assigned but never used'#000+ - '05031_N_Private method "$1.$2" never used'#000+ + '05031_N_Private method "$','1.$2" never used'#000+ '05032_E_Set type expected'#000+ - '05033_W_Functi','on result does not seem to be set'#000+ + '05033_W_Function result does not seem to be set'#000+ '05034_W_Type "$1" is not aligned correctly in current record for C'#000+ '05035_E_Unknown record field identifier "$1"'#000+ - '05036_W_Local variable "$1" does not seem to be initialized'#000+ - '05037_W_Variable "$1" does not see','m to be initialized'#000+ + '05036_W_Local variable "$1" does not ','seem to be initialized'#000+ + '05037_W_Variable "$1" does not seem to be initialized'#000+ '05038_E_identifier idents no member "$1"'#000+ '05039_H_Found declaration: $1'#000+ '05040_E_Data element too large'#000+ - '05042_E_No matching implementation for interface method "$1" found'#000+ + '05042_E_No matching implementation for interface method "$1" ','found'#000+ '05043_W_Symbol "$1" is deprecated'#000+ - '05044_W_Symbol "$','1" is not portable'#000+ + '05044_W_Symbol "$1" is not portable'#000+ '05055_W_Symbol "$1" is not implemented'#000+ '05056_E_Can'#039't create unique type from this type'#000+ '06000_E_BREAK not allowed'#000+ '06001_E_CONTINUE not allowed'#000+ - '06002_E_Expression too complicated - FPU stack overflow'#000+ - '06003_E_Illegal express','ion'#000+ + '06002_E_Expression too',' complicated - FPU stack overflow'#000+ + '06003_E_Illegal expression'#000+ '06004_E_Invalid integer expression'#000+ '06005_E_Illegal qualifier'#000+ '06006_E_High range limit < low range limit'#000+ '06007_E_Illegal counter variable'#000+ - '06008_E_Can'#039't determine which overloaded function to call'#000+ - '06009_E_Parameter list size exceeds 65535',' bytes'#000+ + '06008_E_Can'#039't determine which overloaded f','unction to call'#000+ + '06009_E_Parameter list size exceeds 65535 bytes'#000+ '06010_E_Illegal type conversion'#000+ '06011_H_Conversion between ordinals and pointers are not portable'#000+ '06012_E_File types must be var parameters'#000+ - '06013_E_The use of a far pointer isn'#039't allowed there'#000+ - '06014_E_illegal call by reference parame','ters'#000+ + '06013_E_The use of a far pointer isn',#039't allowed there'#000+ + '06014_E_illegal call by reference parameters'#000+ '06015_E_EXPORT declared functions can'#039't be called'#000+ '06016_W_Possible illegal call of constructor or destructor'#000+ '06017_N_Inefficient code'#000+ '06018_W_unreachable code'#000+ - '06020_E_Abstract methods can'#039't be called directly'#000+ - '06027_DL_Register $1 weigh','t $2 $3'#000+ + '06020_E_Abstract me','thods can'#039't be called directly'#000+ + '06027_DL_Register $1 weight $2 $3'#000+ '06029_DL_Stack frame is omitted'#000+ '06031_E_Object or class methods can'#039't be inline.'#000+ '06032_E_Procvar calls cannot be inline.'#000+ '06033_E_No code for inline procedure stored'#000+ - '06035_E_Element zero of an ansi/wide- or longstring can'#039't be acces'+ - 's','ed, use (set)length instead'#000+ + '06035_E_El','ement zero of an ansi/wide- or longstring can'#039't be acc'+ + 'essed, use (set)length instead'#000+ '06037_E_Constructors or destructors can not be called inside a '#039'wi'+ 'th'#039' clause'#000+ '06038_E_Cannot call message handler methods directly'#000+ - '06039_E_Jump in or outside of an exception block'#000+ - '06040_E_Control flow statements a','ren'#039't allowed in a finally bloc'+ - 'k'#000+ + '06039_E_Jump in or outsid','e of an exception block'#000+ + '06040_E_Control flow statements aren'#039't allowed in a finally block'#000+ '06041_W_Parameters size exceeds limit for certain cpu'#039's'#000+ '06042_W_Local variable size exceed limit for certain cpu'#039's'#000+ - '06043_E_Local variables size exceeds supported limit'#000+ - '07000_DL_Starting $1 styled assembler p','arsing'#000+ + '06043_E_Local variables size exceed','s supported limit'#000+ + '07000_DL_Starting $1 styled assembler parsing'#000+ '07001_DL_Finished $1 styled assembler parsing'#000+ '07002_E_Non-label pattern contains @'#000+ '07004_E_Error building record offset'#000+ '07005_E_OFFSET used without identifier'#000+ - '07006_E_TYPE used without identifier'#000+ - '07007_E_Cannot use local variable or ','parameters here'#000+ + '07006_E_TYPE used',' without identifier'#000+ + '07007_E_Cannot use local variable or parameters here'#000+ '07008_E_need to use OFFSET here'#000+ '07009_E_need to use $ here'#000+ '07010_E_Cannot use multiple relocatable symbols'#000+ '07011_E_Relocatable symbol can only be added'#000+ - '07012_E_Invalid constant expression'#000+ - '07013_E_Relocatable symbol is not al','lowed'#000+ + '07012_E_Invalid',' constant expression'#000+ + '07013_E_Relocatable symbol is not allowed'#000+ '07014_E_Invalid reference syntax'#000+ '07015_E_You can not reach $1 from that code'#000+ '07016_E_Local symbols/labels aren'#039't allowed as references'#000+ - '07017_E_Invalid base and index register usage'#000+ + '07017_E_Invalid base and index register us','age'#000+ '07018_W_Possible error in object field handling'#000+ - '07019','_E_Wrong scale factor specified'#000+ + '07019_E_Wrong scale factor specified'#000+ '07020_E_Multiple index register usage'#000+ '07021_E_Invalid operand type'#000+ '07022_E_Invalid string as opcode operand: $1'#000+ '07023_W_@CODE and @DATA not supported'#000+ - '07024_E_Null label references are not allowed'#000+ - '07025_E_Divi','de by zero in asm evaluator'#000+ + '0','7024_E_Null label references are not allowed'#000+ + '07025_E_Divide by zero in asm evaluator'#000+ '07026_E_Illegal expression'#000+ '07027_E_escape sequence ignored: $1'#000+ '07028_E_Invalid symbol reference'#000+ '07029_W_Fwait can cause emulation problems with emu387'#000+ - '07030_W_$1 without operand translated into $1P'#000+ - '07031_W_ENTER ','instruction is not supported by Linux kernel'#000+ + '0703','0_W_$1 without operand translated into $1P'#000+ + '07031_W_ENTER instruction is not supported by Linux kernel'#000+ '07032_W_Calling an overload function in assembler'#000+ '07033_E_Unsupported symbol type for operand'#000+ '07034_E_Constant value out of bounds'#000+ - '07035_E_Error converting decimal $1'#000+ - '07036_E_Error converting oct','al $1'#000+ + '07035_E','_Error converting decimal $1'#000+ + '07036_E_Error converting octal $1'#000+ '07037_E_Error converting binary $1'#000+ '07038_E_Error converting hexadecimal $1'#000+ '07039_H_$1 translated to $2'#000+ '07040_W_$1 is associated to an overloaded function'#000+ - '07041_E_Cannot use SELF outside a method'#000+ - '07042_E_Cannot use OLDEBP outside a nes','ted procedure'#000+ + '07041_E_Cannot use SELF',' outside a method'#000+ + '07042_E_Cannot use OLDEBP outside a nested procedure'#000+ '07043_W_Procedures can'#039't return any value in asm code'#000+ '07044_E_SEG not supported'#000+ '07045_E_Size suffix and destination or source size do not match'#000+ - '07046_W_Size suffix and destination or source size do not match'#000+ - '07047_E_Assembler ','syntax error'#000+ + '07046_W_Size suffix and d','estination or source size do not match'#000+ + '07047_E_Assembler syntax error'#000+ '07048_E_Invalid combination of opcode and operands'#000+ '07049_E_Assembler syntax error in operand'#000+ '07050_E_Assembler syntax error in constant'#000+ - '07051_E_Invalid String expression'#000+ - '07052_W_constant with symbol $1 for address which is not ','on a pointe'+ - 'r'#000+ + '07051_E_Invalid String expression'#000, + '07052_W_constant with symbol $1 for address which is not on a pointer'#000+ '07053_E_Unrecognized opcode $1'#000+ '07054_E_Invalid or missing opcode'#000+ '07055_E_Invalid combination of prefix and opcode: $1'#000+ - '07056_E_Invalid combination of override and opcode: $1'#000+ + '07056_E_Invalid combination of override and opcode: ','$1'#000+ '07057_E_Too many operands on line'#000+ - '07058_W_NEAR ignored',#000+ + '07058_W_NEAR ignored'#000+ '07059_W_FAR ignored'#000+ '07060_E_Duplicate local symbol $1'#000+ '07061_E_Undefined local symbol $1'#000+ '07062_E_Unknown label identifier $1'#000+ '07063_E_Invalid register name'#000+ - '07064_E_Invalid floating point register name'#000+ + '07064_E_Invalid floating poi','nt register name'#000+ '07066_W_Modulo not supported'#000+ - '07067_E_Inv','alid floating point constant $1'#000+ + '07067_E_Invalid floating point constant $1'#000+ '07068_E_Invalid floating point expression'#000+ '07069_E_Wrong symbol type'#000+ '07070_E_Cannot index a local var or parameter with a register'#000+ - '07071_E_Invalid segment override expression'#000+ - '07072_W_Identifier $1 supposed ext','ernal'#000+ + '07071_E_Invalid segme','nt override expression'#000+ + '07072_W_Identifier $1 supposed external'#000+ '07073_E_Strings not allowed as constants'#000+ '07074_No type of variable specified'#000+ '07075_E_assembler code not returned to text section'#000+ '07076_E_Not a directive or local symbol $1'#000+ - '07077_E_Using a defined name as a local label'#000+ - '07078_E_Dollar t','oken is used without an identifier'#000+ + '07077','_E_Using a defined name as a local label'#000+ + '07078_E_Dollar token is used without an identifier'#000+ '07079_W_32bit constant created for address'#000+ '07080_N_.align is target specific, use .balign or .p2align'#000+ - '07081_E_Can'#039't access fields directly for parameters'#000+ - '07082_E_Can'#039't access fields of objects/classes dire','ctly'#000+ + '07081_E_Can'#039't access fields directly for param','eters'#000+ + '07082_E_Can'#039't access fields of objects/classes directly'#000+ '07083_E_No size specified and unable to determine the size of the oper'+ 'ands'#000+ '07084_E_Cannot use RESULT in this function'#000+ - '07086_W_"$1" without operand translated into "$1 %st,%st(1)"'#000+ + '07086_W_"$1" without operand translated into "$1 %st,%st(1)"',#000+ '07087_W_"$1 %st(n)" translated into "$1 %st,%st(n)"'#000+ - '0708','8_W_"$1 %st(n)" translated into "$1 %st(n),%st"'#000+ + '07088_W_"$1 %st(n)" translated into "$1 %st(n),%st"'#000+ '07089_E_Char < not allowed here'#000+ '07090_E_Char > not allowed here'#000+ '07093_W_ALIGN not supported'#000+ '07094_E_Inc and Dec cannot be together'#000+ - '07095_E_Invalid reglist for movem'#000+ - '07096_E_Reglist invalid for',' opcode'#000+ + '0709','5_E_Invalid reglist for movem'#000+ + '07096_E_Reglist invalid for opcode'#000+ '07097_E_Higher cpu mode required ($1)'#000+ '08000_F_Too many assembler files'#000+ '08001_F_Selected assembler output not supported'#000+ '08002_F_Comp not supported'#000+ - '08003_F_Direct not support for binary writers'#000+ - '08004_E_Allocating of data is only allow','ed in bss section'#000+ + '08003_F_Direct not support fo','r binary writers'#000+ + '08004_E_Allocating of data is only allowed in bss section'#000+ '08005_F_No binary writer selected'#000+ '08006_E_Asm: Opcode $1 not in table'#000+ '08007_E_Asm: $1 invalid combination of opcode and operands'#000+ - '08008_E_Asm: 16 Bit references not supported'#000+ + '08008_E_Asm: 16 Bit references not s','upported'#000+ '08009_E_Asm: Invalid effective address'#000+ - '08010_E_A','sm: Immediate or reference expected'#000+ + '08010_E_Asm: Immediate or reference expected'#000+ '08011_E_Asm: $1 value exceeds bounds $2'#000+ '08012_E_Asm: Short jump is out of range $1'#000+ '08013_E_Asm: Undefined label $1'#000+ - '08014_E_Asm: Comp type not supported for this target'#000+ - '08015_E_Asm: Extended type not suppo','rted for this target'#000+ + '08014_E_Asm: Comp type not suppo','rted for this target'#000+ + '08015_E_Asm: Extended type not supported for this target'#000+ '08016_E_Asm: Duplicate label $1'#000+ '08017_E_Asm: Redefined label $1'#000+ '08018_E_Asm: First defined here'#000+ '09000_W_Source operating system redefined'#000+ - '09001_I_Assembling (pipe) $1'#000+ + '09001_I_Assembling (pipe',') $1'#000+ '09002_E_Can'#039't create assember file: $1'#000+ - '09003_E_Can'#039't',' create object file: $1'#000+ + '09003_E_Can'#039't create object file: $1'#000+ '09004_E_Can'#039't create archive file: $1'#000+ '09005_E_Assembler $1 not found, switching to external assembling'#000+ '09006_T_Using assembler: $1'#000+ - '09007_E_Error while assembling exitcode $1'#000+ - '09008_E_Can'#039't call the assembler, error $1',' switching to external'+ - ' assembling'#000+ + '09007_E_Error while assembli','ng exitcode $1'#000+ + '09008_E_Can'#039't call the assembler, error $1 switching to external a'+ + 'ssembling'#000+ '09009_I_Assembling $1'#000+ '09010_I_Assembling with smartlinking $1'#000+ '09011_W_Object $1 not found, Linking may fail !'#000+ - '09012_W_Library $1 not found, Linking may fail !'#000+ + '09012_W_Library $1 not found, Linking m','ay fail !'#000+ '09013_E_Error while linking'#000+ - '09014_E_Can'#039't call ','the linker, switching to external linking'#000+ + '09014_E_Can'#039't call the linker, switching to external linking'#000+ '09015_I_Linking $1'#000+ '09016_E_Util $1 not found, switching to external linking'#000+ '09017_T_Using util $1'#000+ - '09018_E_Creation of Executables not supported'#000+ - '09019_E_Creation of Dynamic/Shared Libraries not suppo','rted'#000+ + '09018_E_Creation of Executables not support','ed'#000+ + '09019_E_Creation of Dynamic/Shared Libraries not supported'#000+ '09020_I_Closing script $1'#000+ '09021_E_resource compiler not found, switching to external mode'#000+ '09022_I_Compiling resource $1'#000+ - '09023_T_unit $1 can'#039't be statically linked, switching to smart lin'+ - 'king'#000+ - '09024_T_unit $1 can'#039't be smart linked, switc','hing to static linki'+ - 'ng'#000+ + '09023_T_unit $1 can'#039't be statically linked, switching to s','mart l'+ + 'inking'#000+ + '09024_T_unit $1 can'#039't be smart linked, switching to static linking'+ + #000+ '09025_T_unit $1 can'#039't be shared linked, switching to static linkin'+ 'g'#000+ '09026_E_unit $1 can'#039't be smart or static linked'#000+ - '09027_E_unit $1 can'#039't be shared or static linked'#000+ + '09027_E_unit $1 can'#039't be shared or static li','nked'#000+ '09028_F_Can'#039't post process executable $1'#000+ - '09029_F_Can',#039't open executable $1'#000+ + '09029_F_Can'#039't open executable $1'#000+ '09030_X_Size of Code: $1 bytes'#000+ '09031_X_Size of initialized data: $1 bytes'#000+ '09032_X_Size of uninitialized data: $1 bytes'#000+ '09033_X_Stack space reserved: $1 bytes'#000+ - '09034_X_Stack space commited: $1 bytes'#000+ - '10000_T_Unitsearch: $','1'#000+ + '090','34_X_Stack space commited: $1 bytes'#000+ + '10000_T_Unitsearch: $1'#000+ '10001_T_PPU Loading $1'#000+ '10002_U_PPU Name: $1'#000+ '10003_U_PPU Flags: $1'#000+ '10004_U_PPU Crc: $1'#000+ '10005_U_PPU Time: $1'#000+ '10006_U_PPU File too short'#000+ - '10007_U_PPU Invalid Header (no PPU at the begin)'#000+ + '10007_U_PPU Invalid Header (no PPU at the begin',')'#000+ '10008_U_PPU Invalid Version $1'#000+ - '10009_U_PPU is compiled ','for another processor'#000+ + '10009_U_PPU is compiled for another processor'#000+ '10010_U_PPU is compiled for an other target'#000+ '10011_U_PPU Source: $1'#000+ '10012_U_Writing $1'#000+ '10013_F_Can'#039't Write PPU-File'#000+ '10014_F_Error reading PPU-File'#000+ - '10015_F_unexpected end of PPU-File'#000+ + '10015_F_unexpec','ted end of PPU-File'#000+ '10016_F_Invalid PPU-File entry: $1'#000+ - '10','017_F_PPU Dbx count problem'#000+ + '10017_F_PPU Dbx count problem'#000+ '10018_E_Illegal unit name: $1'#000+ '10019_F_Too much units'#000+ '10020_F_Circular unit reference between $1 and $2'#000+ - '10021_F_Can'#039't compile unit $1, no sources available'#000+ + '10021_F_Can'#039't compile unit $1, no sources available'#000, '10022_F_Can'#039't find unit $1'#000+ - '10023_W_Unit $1 was not found ','but $2 exists'#000+ + '10023_W_Unit $1 was not found but $2 exists'#000+ '10024_F_Unit $1 searched but $2 found'#000+ '10025_W_Compiling the system unit requires the -Us switch'#000+ '10026_F_There were $1 errors compiling module, stopping'#000+ - '10027_U_Load from $1 ($2) unit $3'#000+ - '10028_U_Recompiling $1, checksum changed',' for $2'#000+ + '10027_U_Load from',' $1 ($2) unit $3'#000+ + '10028_U_Recompiling $1, checksum changed for $2'#000+ '10029_U_Recompiling $1, source found only'#000+ '10030_U_Recompiling unit, static lib is older than ppufile'#000+ '10031_U_Recompiling unit, shared lib is older than ppufile'#000+ - '10032_U_Recompiling unit, obj and asm are older than ppufile'#000+ - '10033_U_Rec','ompiling unit, obj is older than asm'#000+ + '10032_U_Recompi','ling unit, obj and asm are older than ppufile'#000+ + '10033_U_Recompiling unit, obj is older than asm'#000+ '10034_U_Parsing interface of $1'#000+ '10035_U_Parsing implementation of $1'#000+ '10036_U_Second load for unit $1'#000+ '10037_U_PPU Check file $1 time $2'#000+ - '10038_H_Conditional $1 was not set at startup in last compilation of',' '+ - '$2'#000+ + '10038_H_Con','ditional $1 was not set at startup in last compilation of'+ + ' $2'#000+ '10039_H_Conditional $1 was set at startup in last compilation of $2'#000+ '10040_W_Can'#039't recompile unit $1, but found modifed include files'#000+ - '10041_H_File $1 is newer than Release PPU file $2'#000+ - '10042_U_Using a unit which was not compiled with corr','ect FPU mode'#000+ + '10041_H_File $1 is newer than Release PPU file',' $2'#000+ + '10042_U_Using a unit which was not compiled with correct FPU mode'#000+ '11000_$1 [options] [options]'#000+ '11001_W_Only one source file supported'#000+ '11002_W_DEF file can be created only for OS/2'#000+ - '11003_E_nested response files are not supported'#000+ + '11003_E_nested response files are not suppor','ted'#000+ '11004_F_No source file name in command line'#000+ - '11005_N_N','o option inside $1 config file'#000+ + '11005_N_No option inside $1 config file'#000+ '11006_E_Illegal parameter: $1'#000+ '11007_H_-? writes help pages'#000+ '11008_F_Too many config files nested'#000+ '11009_F_Unable to open file $1'#000+ - '11010_D_Reading further options from $1'#000+ + '11010_D_Reading further o','ptions from $1'#000+ '11011_W_Target is already set to: $1'#000+ - '11012','_W_Shared libs not supported on DOS platform, reverting to stat'+ - 'ic'#000+ + '11012_W_Shared libs not supported on DOS platform, reverting to static'+ + #000+ '11013_F_too many IF(N)DEFs'#000+ '11014_F_too many ENDIFs'#000+ '11015_F_open conditional at the end of the file'#000+ - '11016_W_Debug information generation is not supported by this executab'+ - 'le'#000+ - '11','017_H_Try recompiling with -dGDB'#000+ + '11016_W_Debug info','rmation generation is not supported by this execut'+ + 'able'#000+ + '11017_H_Try recompiling with -dGDB'#000+ '11018_E_You are using the obsolete switch $1'#000+ '11019_E_You are using the obsolete switch $1, please use $2'#000+ - '11020_N_Switching assembler to default source writing assembler'#000+ - '11021_W_Assembler output selected "$1"',' is not compatible with "$2"'#000+ + '11020_N_Switching assembler to default source',' writing assembler'#000+ + '11021_W_Assembler output selected "$1" is not compatible with "$2"'#000+ '11022_W_"$1" assembler use forced'#000+ '11026_T_Reading options from file $1'#000+ '11027_T_Reading options from environment $1'#000+ '11028_D_Handling option "$1"'#000+ - '11029__*** press enter ***'#000+ - '11030_H_Start of reading config file $1'#000, + '11029__***',' press enter ***'#000+ + '11030_H_Start of reading config file $1'#000+ '11031_H_End of reading config file $1'#000+ '11032_D_interpreting option "$1"'#000+ '11036_D_interpreting firstpass option "$1"'#000+ '11033_D_interpreting file option "$1"'#000+ - '11034_D_Reading config file "$1"'#000+ + '11034_D_Reading config file "$1','"'#000+ '11035_D_found source file name "$1"'#000+ - '11037_D_Defining sy','mbol $1'#000+ + '11037_D_Defining symbol $1'#000+ '11038_D_Undefining symbol $1'#000+ '11039_E_Unknown code page'#000+ '11023_Free Pascal Compiler version $FPCVER [$FPCDATE] for $FPCTARGET'#010+ 'Copyright (c) 1993-2002 by Florian Klaempfl'#000+ - '11024_Free Pascal Compiler version $FPCVER'#010+ + '11024_F','ree Pascal Compiler version $FPCVER'#010+ #010+ - 'Compiler Date : $FP','CDATE'#010+ + 'Compiler Date : $FPCDATE'#010+ 'Compiler Target: $FPCTARGET'#010+ #010+ 'Supported targets:'#010+ @@ -667,169 +666,169 @@ const msgtxt : array[0..000143,1..240] of char=( 'This program comes under the GNU General Public Licence'#010+ 'For more information read COPYING.FPC'#010+ #010+ - 'Report bugs,suggestions etc to:'#010+ + 'Report bugs,suggesti','ons etc to:'#010+ ' bugrep@freepascal.org'#000+ - '11025_','**0*_put + after a boolean switch option to enable it, - to di'+ - 'sable it'#010+ + '11025_**0*_put + after a boolean switch option to enable it, - to disa'+ + 'ble it'#010+ '**1a_the compiler doesn'#039't delete the generated assembler file'#010+ '**2al_list sourcecode lines in assembler file'#010+ - '**2ar_list register allocation/release info in assembler file',#010+ + '**2a','r_list register allocation/release info in assembler file'#010+ '**2at_list temp allocation/release info in assembler file'#010+ '**1b_generate browser info'#010+ '**2bl_generate local symbol info'#010+ '**1B_build all modules'#010+ '**1C_code generation options:'#010+ - '**2CD_create also dynamic library (not supported)'#010+ - '**2Ce_Compilati','on with emulated floating point opcodes'#010+ + '**2CD_cr','eate also dynamic library (not supported)'#010+ + '**2Ce_Compilation with emulated floating point opcodes'#010+ '**2Ch_ bytes heap (between 1023 and 67107840)'#010+ '**2Ci_IO-checking'#010+ '**2Cn_omit linking stage'#010+ '**2Co_check overflow of integer operations'#010+ - '**2Cr_range checking'#010+ - '**2CR_verify object method call validity'#010, + '**2Cr','_range checking'#010+ + '**2CR_verify object method call validity'#010+ '**2Cs_set stack size to '#010+ '**2Ct_stack checking'#010+ '**2CX_create also smartlinked library'#010+ '**1d_defines the symbol '#010+ '*O1D_generate a DEF file'#010+ '*O2Dd_set description to '#010+ - '*O2Dw_PM application'#010+ + '*O2Dw','_PM application'#010+ '**1e_set path to executable'#010+ - '**1E_same ','as -Cn'#010+ + '**1E_same as -Cn'#010+ '**1F_set file names and paths:'#010+ '**2FD_sets the directory where to search for compiler utilities'#010+ '**2Fe_redirect error output to '#010+ - '**2FE_set exe/unit output path to '#010+ + '**2FE_set exe/unit output path to ',''#010+ '**2Fi_adds to include path'#010+ - '**2Fl_adds t','o library path'#010+ + '**2Fl_adds to library path'#010+ '*L2FL_uses as dynamic linker'#010+ '**2Fo_adds to object path'#010+ '**2Fr_load error message file '#010+ '**2Fu_adds to unit path'#010+ - '**2FU_set unit output path to , overrides -FE'#010+ - '*g1g_generate debugger information:'#010, + '**2FU_set unit output path t','o , overrides -FE'#010+ + '*g1g_generate debugger information:'#010+ '*g2gg_use gsym'#010+ '*g2gd_use dbx'#010+ '*g2gh_use heap trace unit (for memory leak debugging)'#010+ '*g2gl_use line info unit to show more info for backtraces'#010+ '*g2gc_generate checks for pointers'#010+ - '**1i_information'#010+ + '**1i_in','formation'#010+ '**2iD_return compiler date'#010+ - '**2iV_return compile','r version'#010+ + '**2iV_return compiler version'#010+ '**2iSO_return compiler OS'#010+ '**2iSP_return compiler processor'#010+ '**2iTO_return target OS'#010+ '**2iTP_return target processor'#010+ '**1I_adds to include path'#010+ - '**1k_Pass to the linker'#010+ + '**1k_Pass to the li','nker'#010+ '**1l_write logo'#010+ - '**1n_don'#039't read the default config f','ile'#010+ + '**1n_don'#039't read the default config file'#010+ '**1o_change the name of the executable produced to '#010+ '**1pg_generate profile code for gprof (defines FPC_PROFILE)'#010+ - '*L1P_use pipes instead of creating temporary assembler files'#010+ + '*L1P_use pipes instead of creating temporary assembler files'#010, '**1S_syntax options:'#010+ - '**2S2_switch some Delphi 2 extens','ions on'#010+ + '**2S2_switch some Delphi 2 extensions on'#010+ '**2Sc_supports operators like C (*=,+=,/= and -=)'#010+ '**2Sa_include assertion code.'#010+ '**2Sd_tries to be Delphi compatible'#010+ - '**2Se_compiler stops after the errors (default is 1)'#010+ + '**2Se_compiler stops after the errors (default is 1)',#010+ '**2Sg_allow LABEL and GOTO'#010+ '**2Sh_Use ansistrings'#010+ - '**2Si_s','upport C++ styled INLINE'#010+ + '**2Si_support C++ styled INLINE'#010+ '**2Sm_support macros like C (global)'#010+ '**2So_tries to be TP/BP 7.0 compatible'#010+ '**2Sp_tries to be gpc compatible'#010+ - '**2Ss_constructor name must be init (destructor must be done)'#010+ + '**2Ss_constructor name must be init (destructor m','ust be done)'#010+ '**2St_allow static keyword in objects'#010+ - '**1s_d','on'#039't call assembler and linker (only with -a)'#010+ + '**1s_don'#039't call assembler and linker (only with -a)'#010+ '**2sh_Generate script to link on host'#010+ '**2sr_Skip register allocation phase (optimizations will be disabled)'#010+ - '**2st_Generate script to link on target'#010+ + '**2st_Generate script to link',' on target'#010+ '**1u_undefines the symbol '#010+ - '**1U_unit opt','ions:'#010+ + '**1U_unit options:'#010+ '**2Un_don'#039't check the unit name'#010+ '**2Ur_generate release unit files'#010+ '**2Us_compile a system unit'#010+ '**1v_Be verbose. is a combination of the following letters:'#010+ - '**2*_e : Show errors (default) d : Show debug info'#010+ - '**2*_w : Show wa','rnings u : Show unit info'#010+ + '**2*_e : Show er','rors (default) d : Show debug info'#010+ + '**2*_w : Show warnings u : Show unit info'#010+ '**2*_n : Show notes t : Show tried/used files'#010+ '**2*_h : Show hints m : Show defined macros'#010+ - '**2*_i : Show general info p : Show compiled procedures'#010+ - '**2*_l : S','how linenumbers c : Show conditionals'#010+ + '**2*_i : Show gener','al info p : Show compiled procedures'#010+ + '**2*_l : Show linenumbers c : Show conditionals'#010+ '**2*_a : Show everything 0 : Show nothing (except errors)'#010+ - '**2*_b : Show all procedure r : Rhide/GCC compatibility mode'#010+ - '**2*_ declarations if an error x : Executable',' info (Win32 only'+ - ')'#010+ + '**2*_b : Show all procedure r : Rhide/GCC compatibility',' mod'+ + 'e'#010+ + '**2*_ declarations if an error x : Executable info (Win32 only)'#010+ '**2*_ occurs'#010+ '**1V_write fpcdebug.txt file with lots of debugging info'#010+ '**1X_executable options:'#010+ '*L2Xc_link with the c library'#010+ - '**2Xs_strip all symbols from executable'#010+ - '**2XD_try to link dynamic (defines FPC_LINK_','DYNAMIC)'#010+ + '**2Xs_strip all symbols from executa','ble'#010+ + '**2XD_try to link dynamic (defines FPC_LINK_DYNAMIC)'#010+ '**2XS_try to link static (default) (defines FPC_LINK_STATIC)'#010+ '**2XX_try to link smart (defines FPC_LINK_SMART)'#010+ '**0*_Processor specific options:'#010+ - '3*1A_output format:'#010+ + '3*1A_output forma','t:'#010+ '3*2Aas_assemble using GNU AS'#010+ - '3*2Anasmcoff_coff (Go32v2',') file using Nasm'#010+ + '3*2Anasmcoff_coff (Go32v2) file using Nasm'#010+ '3*2Anasmelf_elf32 (Linux) file using Nasm'#010+ '3*2Anasmobj_obj file using Nasm'#010+ '3*2Amasm_obj file using Masm (Microsoft)'#010+ '3*2Atasm_obj file using Tasm (Borland)'#010+ - '3*2Acoff_coff (Go32v2) using internal writer'#010+ - '3*2Apecoff_pecoff (Win3','2) using internal writer'#010+ + '3*2Acoff_co','ff (Go32v2) using internal writer'#010+ + '3*2Apecoff_pecoff (Win32) using internal writer'#010+ '3*1R_assembler reading style:'#010+ '3*2Ratt_read AT&T style assembler'#010+ '3*2Rintel_read Intel style assembler'#010+ - '3*2Rdirect_copy assembler text directly to assembler file'#010+ + '3*2Rdirect_copy assembler text directly to assembler f','ile'#010+ '3*1O_optimizations:'#010+ '3*2Og_generate smaller code'#010+ - '3*','2OG_generate faster code (default)'#010+ + '3*2OG_generate faster code (default)'#010+ '3*2Or_keep certain variables in registers'#010+ '3*2Ou_enable uncertain optimizations (see docs)'#010+ '3*2O1_level 1 optimizations (quick optimizations)'#010+ - '3*2O2_level 2 optimizations (-O1 + slower optimizations)'#010+ - '3*2O3_le','vel 3 optimizations (-O2 repeatedly, max 5 times)'#010+ + '3*2O2_le','vel 2 optimizations (-O1 + slower optimizations)'#010+ + '3*2O3_level 3 optimizations (-O2 repeatedly, max 5 times)'#010+ '3*2Op_target processor:'#010+ '3*3Op1_set target processor to 386/486'#010+ '3*3Op2_set target processor to Pentium/PentiumMMX (tm)'#010+ - '3*3Op3_set target processor to PPro/PII/c6x86/K6 (tm)'#010+ - '3*1T_Target ','operating system:'#010+ + '3*3Op3_set t','arget processor to PPro/PII/c6x86/K6 (tm)'#010+ + '3*1T_Target operating system:'#010+ '3*2TEMX_OS/2 via EMX (including EMX/RSX extender)'#010+ '3*2TGO32V2_Version 2 of DJ Delorie DOS extender'#010+ '3*2TLINUX_Linux'#010+ '3*2TNETWARE_Novell Netware Module (clib)'#010+ - '3*2TOS2_OS/2 / eComStation'#010+ + '3*2TOS2_OS','/2 / eComStation'#010+ '3*2TSUNOS_SunOS/Solaris'#010+ - '3*2TWDOSX_WDOSX ','DOS extender'#010+ + '3*2TWDOSX_WDOSX DOS extender'#010+ '3*2TWIN32_Windows 32 Bit'#010+ '3*1W_Win32-like target options'#010+ '3*2WB_Set Image base to Hexadecimal value'#010+ '3*2WC_Specify console type application'#010+ - '3*2WD_Use DEFFILE to export functions of DLL or EXE'#010+ - '3*2WF_Specify full-screen ty','pe application (OS/2 only)'#010+ + '3*2WD_Use DEFFILE to ex','port functions of DLL or EXE'#010+ + '3*2WF_Specify full-screen type application (OS/2 only)'#010+ '3*2WG_Specify graphic type application'#010+ '3*2WN_Do not generate relocation code (necessary for debugging)'#010+ '3*2WR_Generate relocation code'#010+ - '6*1A_output format'#010+ + '6*1A_output format'#010, '6*2Aas_Unix o-file using GNU AS'#010+ - '6*2Agas_GNU Motorola asse','mbler'#010+ + '6*2Agas_GNU Motorola assembler'#010+ '6*2Amit_MIT Syntax (old GAS)'#010+ '6*2Amot_Standard Motorola assembler'#010+ '6*1O_optimizations:'#010+ '6*2Oa_turn on the optimizer'#010+ '6*2Og_generate smaller code'#010+ - '6*2OG_generate faster code (default)'#010+ + '6*2OG_generate faster code (default)',#010+ '6*2Ox_optimize maximum (still BUGGY!!!)'#010+ - '6*2O0_set target',' processor to a MC68000'#010+ + '6*2O0_set target processor to a MC68000'#010+ '6*2O2_set target processor to a MC68020+ (default)'#010+ '6*1R_assembler reading style:'#010+ '6*2RMOT_read motorola style assembler'#010+ '6*1T_Target operating system:'#010+ - '6*2TAMIGA_Commodore Amiga'#010+ + '6*2T','AMIGA_Commodore Amiga'#010+ '6*2TATARI_Atari ST/STe/TT'#010+ - '6*2TMACOS','_Macintosh m68k'#010+ + '6*2TMACOS_Macintosh m68k'#010+ '6*2TLINUX_Linux-68k'#010+ '6*2TPALMOS_PalmOS'#010+ '**1*_'#010+ diff --git a/compiler/ncgcal.pas b/compiler/ncgcal.pas index aa96abde17..55807e4c7c 100644 --- a/compiler/ncgcal.pas +++ b/compiler/ncgcal.pas @@ -85,10 +85,15 @@ implementation cginfo,cgbase,pass_2, cpuinfo,cpupi,aasmbase,aasmtai,aasmcpu, nbas,nmem,nld,ncnv, -{$ifdef i386} +{$ifdef x86} cga, -{$endif i386} - cg64f32,ncgutil,cgobj,tgobj,regvars,rgobj,rgcpu,cgcpu; +{$endif x86} +{$ifdef cpu64bit} + cg64f64, +{$else cpu64bit} + cg64f32, +{$endif cpu64bit} + ncgutil,cgobj,tgobj,regvars,rgobj,rgcpu,cgcpu; var @@ -1438,7 +1443,12 @@ begin end. { $Log$ - Revision 1.56 2003-04-29 07:28:52 michael + Revision 1.57 2003-04-30 20:53:32 florian + * error when address of an abstract method is taken + * fixed some x86-64 problems + * merged some more x86-64 and i386 code + + Revision 1.56 2003/04/29 07:28:52 michael + Patch from peter to fix wrong pushing of ansistring function results in open array Revision 1.55 2003/04/27 11:21:33 peter diff --git a/compiler/ptconst.pas b/compiler/ptconst.pas index c429692c57..e7c14676ae 100644 --- a/compiler/ptconst.pas +++ b/compiler/ptconst.pas @@ -398,7 +398,10 @@ implementation begin if Tprocsym(srsym).procdef_count>1 then Message(parser_e_no_overloaded_procvars); - curconstSegment.concat(Tai_const_symbol.Createname_offset(tprocsym(srsym).first_procdef.mangledname,offset)); + if po_abstractmethod in tprocsym(srsym).first_procdef.procoptions then + Message(type_e_cant_take_address_of_abstract_method) + else + curconstSegment.concat(Tai_const_symbol.Createname_offset(tprocsym(srsym).first_procdef.mangledname,offset)); end; varsym : curconstSegment.concat(Tai_const_symbol.Createname_offset(tvarsym(srsym).mangledname,offset)); @@ -1001,7 +1004,12 @@ implementation end. { $Log$ - Revision 1.67 2003-04-24 22:29:58 florian + Revision 1.68 2003-04-30 20:53:32 florian + * error when address of an abstract method is taken + * fixed some x86-64 problems + * merged some more x86-64 and i386 code + + Revision 1.67 2003/04/24 22:29:58 florian * fixed a lot of PowerPC related stuff Revision 1.66 2003/04/06 21:11:23 olle diff --git a/compiler/i386/cga.pas b/compiler/x86/cga.pas similarity index 97% rename from compiler/i386/cga.pas rename to compiler/x86/cga.pas index 685d7e56d3..5dc4575d7a 100644 --- a/compiler/i386/cga.pas +++ b/compiler/x86/cga.pas @@ -76,8 +76,12 @@ implementation 1 : def_opsize:=S_B; 2 : def_opsize:=S_W; 4 : def_opsize:=S_L; +{$ifdef x86_64} + 8 : def_opsize:=S_Q; +{$else x86_64} { I don't know if we need it (FK) } 8 : def_opsize:=S_L; +{$endif x86_64} else internalerror(130820001); end; @@ -186,7 +190,12 @@ implementation end. { $Log$ - Revision 1.38 2003-04-17 16:48:21 daniel + Revision 1.1 2003-04-30 20:53:32 florian + * error when address of an abstract method is taken + * fixed some x86-64 problems + * merged some more x86-64 and i386 code + + Revision 1.38 2003/04/17 16:48:21 daniel * Added some code to keep track of move instructions in register allocator diff --git a/compiler/x86/cgx86.pas b/compiler/x86/cgx86.pas index fa4a92cee8..e49fda19a3 100644 --- a/compiler/x86/cgx86.pas +++ b/compiler/x86/cgx86.pas @@ -190,11 +190,26 @@ unit cgx86; s3 := S_L; else internalerror(200109223); end; +{$ifdef x86_64} + S_D, + S_Q: + case s1 of + OS_8,OS_S8: + s3 := S_BQ; + OS_16,OS_S16: + s3 := S_WQ; + OS_32,OS_S32: + s3 := S_LQ; + OS_64,OS_S64: + s3 := S_Q; + else internalerror(200304302); + end; +{$endif x86_64} else internalerror(200109227); end; - if s3 in [S_B,S_W,S_L] then + if s3 in [S_B,S_W,S_L,S_Q] then op := A_MOV - else if s1 in [OS_8,OS_16,OS_32] then + else if s1 in [OS_8,OS_16,OS_32,OS_64] then op := A_MOVZX else op := A_MOVSX; @@ -383,6 +398,8 @@ unit cgx86; end; OS_32,OS_S32: list.concat(taicpu.op_ref(A_PUSH,S_L,r)); + OS_64,OS_S64: + list.concat(taicpu.op_ref(A_PUSH,S_Q,r)); else internalerror(2002032214); end; @@ -1938,7 +1955,12 @@ unit cgx86; end. { $Log$ - Revision 1.43 2003-04-27 11:21:36 peter + Revision 1.44 2003-04-30 20:53:32 florian + * error when address of an abstract method is taken + * fixed some x86-64 problems + * merged some more x86-64 and i386 code + + Revision 1.43 2003/04/27 11:21:36 peter * aktprocdef renamed to current_procdef * procinfo renamed to current_procinfo * procinfo will now be stored in current_module so it can be diff --git a/compiler/x86/cpubase.pas b/compiler/x86/cpubase.pas index b239be90d6..ac3358040c 100644 --- a/compiler/x86/cpubase.pas +++ b/compiler/x86/cpubase.pas @@ -128,6 +128,34 @@ uses {Super register numbers:} const +{$ifdef x86_64} + RS_SPECIAL = $00; {Special register} + RS_RAX = $01; {EAX} + RS_RBX = $02; {EBX} + RS_RCX = $03; {ECX} + RS_RDX = $04; {EDX} + RS_RSI = $05; {ESI} + RS_RDI = $06; {EDI} + RS_RBP = $07; {EBP} + RS_RSP = $08; {ESP} + RS_R8 = $09; {R8} + RS_R9 = $0a; {R9} + RS_R10 = $0b; {R10} + RS_R11 = $0c; {R11} + RS_R12 = $0d; {R12} + RS_R13 = $0e; {R13} + RS_R14 = $0f; {R14} + RS_R15 = $10; {R15} + { create aliases to allow code sharing between x86-64 and i386 } + RS_EAX = RS_RAX; + RS_EBX = RS_RBX; + RS_ECX = RS_RCX; + RS_EDX = RS_RDX; + RS_ESI = RS_RSI; + RS_EDI = RS_RDI; + RS_EBP = RS_RBP; + RS_ESP = RS_RSP; +{$else x86_64} RS_SPECIAL = $00; {Special register} RS_EAX = $01; {EAX} RS_EBX = $02; {EBX} @@ -137,14 +165,7 @@ uses RS_EDI = $06; {EDI} RS_EBP = $07; {EBP} RS_ESP = $08; {ESP} - RS_R8 = $09; {R8} - RS_R9 = $0a; {R9} - RS_R10 = $0b; {R10} - RS_R11 = $0c; {R11} - RS_R12 = $0d; {R12} - RS_R13 = $0e; {R13} - RS_R14 = $0f; {R14} - RS_R15 = $10; {R15} +{$endif x86_64} {Number of first and last superregister.} @@ -233,27 +254,35 @@ uses NR_R8L = $0900; {R8L} NR_R8W = $0902; {R8W} NR_R8D = $0903; {R8D} + NR_R8 = $0904; {R8} NR_R9L = $0a00; {R9D} NR_R9W = $0a02; {R9W} NR_R9D = $0a03; {R9D} + NR_R9 = $0a04; {R9} NR_R10L = $0b00; {R10L} NR_R10W = $0b02; {R10W} NR_R10D = $0b03; {R10D} + NR_R10 = $0b04; {R10} NR_R11L = $0c00; {R11L} NR_R11W = $0c02; {R11W} NR_R11D = $0c03; {R11D} + NR_R11 = $0c04; {R11} NR_R12L = $0d00; {R12L} NR_R12W = $0d02; {R12W} NR_R12D = $0d03; {R12D} + NR_R12 = $0d04; {R12} NR_R13L = $0e00; {R13L} NR_R13W = $0e02; {R13W} NR_R13D = $0e03; {R13D} + NR_R13 = $0e04; {R13} NR_R14L = $0f00; {R14L} NR_R14W = $0f02; {R14W} NR_R14D = $0f03; {R14D} + NR_R14 = $0f04; {R14} NR_R15L = $1000; {R15L} NR_R15W = $1002; {R15W} NR_R15D = $1003; {R15D} + NR_R15 = $1004; {R15} type tnewregister=word; @@ -465,9 +494,6 @@ uses ALL_REGISTERS = [firstreg..lastreg]; ALL_INTREGISTERS = [1..255]; - general_registers = [R_EAX,R_EBX,R_ECX,R_EDX]; - general_superregisters = [RS_EAX,RS_EBX,RS_ECX,RS_EDX]; - {# low and high of the available maximum width integer general purpose } { registers } LoGPReg = R_EAX; @@ -492,12 +518,6 @@ uses maxintregs = 4; intregs = [R_EAX..R_BL]-[R_ESI,R_SI]; -{$ifdef newra} - usableregsint = [first_imreg..last_imreg]; -{$else} - usableregsint = [RS_EAX,RS_EBX,RS_ECX,RS_EDX]; -{$endif} - c_countusableregsint = 4; maxfpuregs = 8; fpuregs = [R_ST0..R_ST7]; @@ -508,25 +528,6 @@ uses usableregsmm = [R_MM0..R_MM7]; c_countusableregsmm = 8; - maxaddrregs = 1; - addrregs = [R_ESI]; - usableregsaddr = [RS_ESI]; - c_countusableregsaddr = 1; - - maxvarregs = 4; - varregs : array[1..maxvarregs] of Toldregister = - (R_EBX,R_EDX,R_ECX,R_EAX); - - maxfpuvarregs = 8; - - {# Registers which are defined as scratch and no need to save across - routine calls or in assembler blocks. - } -{$ifndef newra} - max_scratch_regs = 1; - scratch_regs : array[1..max_scratch_regs] of Tsuperregister = (RS_EDI); -{$endif} - {***************************************************************************** CPU Dependent Constants *****************************************************************************} @@ -714,7 +715,19 @@ implementation end. { $Log$ - Revision 1.1 2003-04-25 11:12:09 florian + Revision 1.4 2003-04-30 20:53:32 florian + * error when address of an abstract method is taken + * fixed some x86-64 problems + * merged some more x86-64 and i386 code + + Revision 1.3 2002/04/25 20:15:40 florian + * block nodes within expressions shouldn't release the used registers, + fixed using a flag till the new rg is ready + + Revision 1.2 2002/04/25 16:12:09 florian + * fixed more problems with cpubase and x86-64 + + Revision 1.1 2003/04/25 11:12:09 florian * merged i386/cpubase and x86_64/cpubase to x86/cpubase; different stuff went to cpubase.inc diff --git a/compiler/x86_64/cga.pas b/compiler/x86_64/cga.pas deleted file mode 100644 index 4fdeeb8faa..0000000000 --- a/compiler/x86_64/cga.pas +++ /dev/null @@ -1,180 +0,0 @@ -{ - $Id$ - Copyright (c) 1998-2002 by Florian Klaempfl - - Helper routines for the x86-64 code generator - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - **************************************************************************** -} - -unit cga; - -{$i fpcdefs.inc} - -interface - - uses - cpuinfo,cpubase,cginfo, - symconst,symtype,symdef,aasmbase,aasmtai,aasmcpu; - -{$define TESTGETTEMP to store const that - are written into temps for later release PM } - - function def_opsize(p1:tdef):topsize; - function def_getreg(p1:tdef):tregister; - - procedure emitjmp(c : tasmcond;var l : tasmlabel); - - procedure emit_none(i : tasmop;s : topsize); - - procedure emit_const(i : tasmop;s : topsize;c : longint); - procedure emit_reg(i : tasmop;s : topsize;reg : tregister); - procedure emit_ref(i : tasmop;s : topsize;const ref : treference); - - procedure emit_const_reg(i : tasmop;s : topsize;c : longint;reg : tregister); - procedure emit_const_ref(i : tasmop;s : topsize;c : longint;const ref : treference); - procedure emit_ref_reg(i : tasmop;s : topsize;const ref : treference;reg : tregister); - procedure emit_reg_ref(i : tasmop;s : topsize;reg : tregister;const ref : treference); - procedure emit_reg_reg(i : tasmop;s : topsize;reg1,reg2 : tregister); - - procedure emit_const_reg_reg(i : tasmop;s : topsize;c : longint;reg1,reg2 : tregister); - procedure emit_reg_reg_reg(i : tasmop;s : topsize;reg1,reg2,reg3 : tregister); - - - procedure emit_sym(i : tasmop;s : topsize;op : tasmsymbol); - - -implementation - - uses - cutils, - systems,globals,verbose, - cgbase,cgobj,tgobj,rgobj,rgcpu; - - -{***************************************************************************** - Helpers -*****************************************************************************} - - function def_opsize(p1:tdef):topsize; - begin - case p1.size of - 1 : def_opsize:=S_B; - 2 : def_opsize:=S_W; - 4 : def_opsize:=S_L; - { I don't know if we need it (FK) } - 8 : def_opsize:=S_L; - else - internalerror(130820001); - end; - end; - - - function def_getreg(p1:tdef):tregister; - begin - def_getreg:=rg.makeregsize(rg.getregisterint(exprasmlist),int_cgsize(p1.size)); - end; - - -{***************************************************************************** - Emit Assembler -*****************************************************************************} - - procedure emitjmp(c : tasmcond;var l : tasmlabel); - var - ai : taicpu; - begin - if c=C_None then - ai := Taicpu.Op_sym(A_JMP,S_NO,l) - else - begin - ai:=Taicpu.Op_sym(A_Jcc,S_NO,l); - ai.SetCondition(c); - end; - ai.is_jmp:=true; - exprasmList.concat(ai); - end; - - - procedure emit_none(i : tasmop;s : topsize); - begin - exprasmList.concat(Taicpu.Op_none(i,s)); - end; - - procedure emit_reg(i : tasmop;s : topsize;reg : tregister); - begin - exprasmList.concat(Taicpu.Op_reg(i,s,reg)); - end; - - procedure emit_ref(i : tasmop;s : topsize;const ref : treference); - begin - exprasmList.concat(Taicpu.Op_ref(i,s,ref)); - end; - - procedure emit_const(i : tasmop;s : topsize;c : longint); - begin - exprasmList.concat(Taicpu.Op_const(i,s,aword(c))); - end; - - procedure emit_const_reg(i : tasmop;s : topsize;c : longint;reg : tregister); - begin - exprasmList.concat(Taicpu.Op_const_reg(i,s,aword(c),reg)); - end; - - procedure emit_const_ref(i : tasmop;s : topsize;c : longint;const ref : treference); - begin - exprasmList.concat(Taicpu.Op_const_ref(i,s,aword(c),ref)); - end; - - procedure emit_ref_reg(i : tasmop;s : topsize;const ref : treference;reg : tregister); - begin - exprasmList.concat(Taicpu.Op_ref_reg(i,s,ref,reg)); - end; - - procedure emit_reg_ref(i : tasmop;s : topsize;reg : tregister;const ref : treference); - begin - exprasmList.concat(Taicpu.Op_reg_ref(i,s,reg,ref)); - end; - - procedure emit_reg_reg(i : tasmop;s : topsize;reg1,reg2 : tregister); - begin - if (reg1<>reg2) or (i<>A_MOV) then - exprasmList.concat(Taicpu.Op_reg_reg(i,s,reg1,reg2)); - end; - - procedure emit_const_reg_reg(i : tasmop;s : topsize;c : longint;reg1,reg2 : tregister); - begin - exprasmList.concat(Taicpu.Op_const_reg_reg(i,s,c,reg1,reg2)); - end; - - procedure emit_reg_reg_reg(i : tasmop;s : topsize;reg1,reg2,reg3 : tregister); - begin - exprasmList.concat(Taicpu.Op_reg_reg_reg(i,s,reg1,reg2,reg3)); - end; - - procedure emit_sym(i : tasmop;s : topsize;op : tasmsymbol); - begin - exprasmList.concat(Taicpu.Op_sym(i,s,op)); - end; - -end. -{ - $Log$ - Revision 1.1 2002-07-24 22:38:15 florian - + initial release of x86-64 target code - -} diff --git a/compiler/x86_64/cpunode.pas b/compiler/x86_64/cpunode.pas index 35ea2a2da9..9e3bb28262 100644 --- a/compiler/x86_64/cpunode.pas +++ b/compiler/x86_64/cpunode.pas @@ -32,17 +32,31 @@ unit cpunode; implementation uses - ncgbas,ncgflw,ncgcnv,ncgmem,ncgcon,ncgld - // n386add,n386cal,n386con,n386flw,n386mat,n386mem, + ncgbas, + ncgflw, + ncgcnv, + ncgmem, + ncgcon, + ncgld, + ncgcal, + // n386add,n386con,n386flw,n386mat,n386mem, // n386set,n386inl,n386opt, { this not really a node } // n386obj + { the cpu specific node units must be used after the generic ones to + get the correct class pointer } + nx64cnv ; end. { $Log$ - Revision 1.2 2002-07-25 22:55:34 florian + Revision 1.3 2003-04-30 20:53:32 florian + * error when address of an abstract method is taken + * fixed some x86-64 problems + * merged some more x86-64 and i386 code + + Revision 1.2 2002/07/25 22:55:34 florian * several fixes, small test units can be compiled Revision 1.1 2002/07/24 22:38:15 florian diff --git a/compiler/x86_64/cpupara.pas b/compiler/x86_64/cpupara.pas index 342fe35415..fd4573e04c 100644 --- a/compiler/x86_64/cpupara.pas +++ b/compiler/x86_64/cpupara.pas @@ -51,7 +51,7 @@ unit cpupara; cpuinfo,cginfo,cgbase, defutil; - function getparaloc(p : tdef) : tloc; + function getparaloc(p : tdef) : tcgloc; begin { Later, the LOC_REFERENCE is in most cases changed into LOC_REGISTER @@ -117,7 +117,25 @@ unit cpupara; end; function tx86_64paramanager.getintparaloc(nr : longint) : tparalocation; + const + nr2reg : array[1..6] of word = (NR_RDI,NR_RSI,NR_RDX,NR_RCX,NR_R8,NR_R9); begin + fillchar(result,sizeof(tparalocation),0); + if nr<1 then + internalerror(200304303) + else if nr<=6 then + begin + result.loc:=LOC_REGISTER; + result.register.enum:=R_INTREGISTER; + result.register.number:=nr2reg[nr]; + end + else + begin + result.loc:=LOC_REFERENCE; + result.reference.index.enum:=R_INTREGISTER; + result.reference.index.number:=NR_STACK_POINTER_REG; + result.reference.offset:=(nr-6)*8; + end; end; procedure tx86_64paramanager.create_param_loc_info(p : tabstractprocdef); @@ -134,11 +152,18 @@ begin end. { $Log$ - Revision 1.2 2003-01-05 13:36:54 florian + Revision 1.4 2003-04-30 20:53:32 florian + * error when address of an abstract method is taken + * fixed some x86-64 problems + * merged some more x86-64 and i386 code + + Revision 1.3 2002/04/25 16:12:09 florian + * fixed more problems with cpubase and x86-64 + + Revision 1.2 2003/01/05 13:36:54 florian * x86-64 compiles + very basic support for float128 type (x86-64 only) Revision 1.1 2002/07/24 22:38:15 florian + initial release of x86-64 target code - } diff --git a/compiler/x86_64/nx64cnv.pas b/compiler/x86_64/nx64cnv.pas new file mode 100644 index 0000000000..d417030a0b --- /dev/null +++ b/compiler/x86_64/nx64cnv.pas @@ -0,0 +1,180 @@ +{ + $Id$ + Copyright (c) 1998-2002 by Florian Klaempfl + + Generate x86-64 assembler for type converting nodes + + 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. + + **************************************************************************** +} +unit nx64cnv; + +{$i fpcdefs.inc} + +interface + + uses + node,ncgcnv,defutil,defcmp, + nx86cnv; + + type + tx86_64typeconvnode = class(tx86typeconvnode) + protected + { procedure second_int_to_int;override; } + { procedure second_string_to_string;override; } + { procedure second_cstring_to_pchar;override; } + { procedure second_string_to_chararray;override; } + { procedure second_array_to_pointer;override; } + { procedure second_pointer_to_array;override; } + { procedure second_chararray_to_string;override; } + { procedure second_char_to_string;override; } + { function first_int_to_real: tnode; override; } + procedure second_int_to_real;override; + { procedure second_real_to_real;override; } + { procedure second_cord_to_pointer;override; } + { procedure second_proc_to_procvar;override; } + { procedure second_bool_to_int;override; } + { procedure second_int_to_bool;override; } + { procedure second_load_smallset;override; } + { procedure second_ansistring_to_pchar;override; } + { procedure second_pchar_to_string;override; } + { procedure second_class_to_intf;override; } + { procedure second_char_to_char;override; } + procedure second_call_helper(c : tconverttype);override; + end; + + +implementation + + uses + verbose,systems,globtype, + symconst,symdef,aasmbase,aasmtai,aasmcpu, + cginfo,cgbase,pass_2, + ncon,ncal,ncnv, + cpubase, + cgobj,cga,tgobj,rgobj,rgcpu,ncgutil; + + procedure tx86_64typeconvnode.second_int_to_real; + begin + internalerror(200304305); + end; + + + procedure tx86_64typeconvnode.second_call_helper(c : tconverttype); +{$ifdef fpc} + const + secondconvert : array[tconverttype] of pointer = ( + @second_nothing, {equal} + @second_nothing, {not_possible} + @second_nothing, {second_string_to_string, handled in resulttype pass } + @second_char_to_string, + @second_nothing, {char_to_charray} + @second_nothing, { pchar_to_string, handled in resulttype pass } + @second_nothing, {cchar_to_pchar} + @second_cstring_to_pchar, + @second_ansistring_to_pchar, + @second_string_to_chararray, + @second_nothing, { chararray_to_string, handled in resulttype pass } + @second_array_to_pointer, + @second_pointer_to_array, + @second_int_to_int, + @second_int_to_bool, + @second_bool_to_bool, + @second_bool_to_int, + @second_real_to_real, + @second_int_to_real, + @second_nothing, { real_to_currency, handled in resulttype pass } + @second_proc_to_procvar, + @second_nothing, { arrayconstructor_to_set } + @second_nothing, { second_load_smallset, handled in first pass } + @second_cord_to_pointer, + @second_nothing, { interface 2 string } + @second_nothing, { interface 2 guid } + @second_class_to_intf, + @second_char_to_char, + @second_nothing, { normal_2_smallset } + @second_nothing, { dynarray_2_openarray } + @second_nothing, { pwchar_2_string } + @second_nothing, { variant_2_dynarray } + @second_nothing { dynarray_2_variant} + ); + type + tprocedureofobject = procedure of object; + + var + r : packed record + proc : pointer; + obj : pointer; + end; + + begin + { this is a little bit dirty but it works } + { and should be quite portable too } + r.proc:=secondconvert[c]; + r.obj:=self; + tprocedureofobject(r)(); + end; +{$else fpc} + begin + case c of + tc_equal, + tc_not_possible, + tc_string_2_string : second_nothing; + tc_char_2_string : second_char_to_string; + tc_char_2_chararray : second_nothing; + tc_pchar_2_string : second_nothing; + tc_cchar_2_pchar : second_nothing; + tc_cstring_2_pchar : second_cstring_to_pchar; + tc_ansistring_2_pchar : second_ansistring_to_pchar; + tc_string_2_chararray : second_string_to_chararray; + tc_chararray_2_string : second_nothing; + tc_array_2_pointer : second_array_to_pointer; + tc_pointer_2_array : second_pointer_to_array; + tc_int_2_int : second_int_to_int; + tc_int_2_bool : second_int_to_bool; + tc_bool_2_bool : second_bool_to_bool; + tc_bool_2_int : second_bool_to_int; + tc_real_2_real : second_real_to_real; + tc_int_2_real : second_int_to_real; + tc_real_2_currency : second_nothing; + tc_proc_2_procvar : second_proc_to_procvar; + tc_arrayconstructor_2_set : second_nothing; + tc_load_smallset : second_nothing; + tc_cord_2_pointer : second_cord_to_pointer; + tc_intf_2_string : second_nothing; + tc_intf_2_guid : second_nothing; + tc_class_2_intf : second_class_to_intf; + tc_char_2_char : second_char_to_char; + tc_normal_2_smallset : second_nothing; + tc_dynarray_2_openarray : second_nothing; + tc_pwchar_2_string : second_nothing; + tc_variant_2_dynarray : second_nothing; + tc_dynarray_2_variant : second_nothing; + else internalerror(2002101101); + end; + end; +{$endif fpc} + +begin + ctypeconvnode:=tx86_64typeconvnode; +end. +{ + $Log$ + Revision 1.1 2003-04-30 20:53:32 florian + * error when address of an abstract method is taken + * fixed some x86-64 problems + * merged some more x86-64 and i386 code +}