+ support for virtual class methods on the JVM platform. The JVM does not

support those natively, so they are emulated via the procvar infrastructure
    (and hence not very fast). Could probably be optimized somewhat by adding
    a cache (hashmap of procvars) to the class hierarchies, maybe in the
    future.

git-svn-id: branches/jvmbackend@18704 -
This commit is contained in:
Jonas Maebe 2011-08-20 08:26:11 +00:00
parent cd6b8b9dd1
commit 7d8cbe80f5
8 changed files with 370 additions and 223 deletions

View File

@ -51,6 +51,7 @@ interface
procedure do_release_unused_return_value;override;
procedure extra_post_call_code; override;
function dispatch_procvar: tnode;
procedure remove_hidden_paras;
public
function pass_1: tnode; override;
end;
@ -59,8 +60,9 @@ interface
implementation
uses
verbose,globtype,constexp,
symconst,defutil,ncal,
verbose,globtype,constexp,cutils,
symconst,symtable,symsym,defutil,
ncal,
cgutils,tgobj,procinfo,
cpubase,aasmdata,aasmcpu,
hlcgobj,hlcgcpu,
@ -482,25 +484,10 @@ implementation
end;
function tjvmcallnode.dispatch_procvar: tnode;
procedure tjvmcallnode.remove_hidden_paras;
var
pdclass: tobjectdef;
prevpara, para, nextpara: tcallparanode;
begin
pdclass:=tprocvardef(right.resultdef).classdef;
{ convert procvar type into corresponding class }
if not tprocvardef(right.resultdef).is_addressonly then
begin
right:=caddrnode.create_internal(right);
include(right.flags,nf_typedaddr);
end;
right:=ctypeconvnode.create_explicit(right,pdclass);
include(right.flags,nf_load_procvar);
typecheckpass(right);
{ call the invoke method with these parameters. It will take care of the
wrapping and typeconversions; first filter out the automatically added
hidden parameters though }
prevpara:=nil;
para:=tcallparanode(left);
while assigned(para) do
@ -519,6 +506,28 @@ implementation
prevpara:=para;
para:=nextpara;
end;
end;
function tjvmcallnode.dispatch_procvar: tnode;
var
pdclass: tobjectdef;
begin
pdclass:=tprocvardef(right.resultdef).classdef;
{ convert procvar type into corresponding class }
if not tprocvardef(right.resultdef).is_addressonly then
begin
right:=caddrnode.create_internal(right);
include(right.flags,nf_typedaddr);
end;
right:=ctypeconvnode.create_explicit(right,pdclass);
include(right.flags,nf_load_procvar);
typecheckpass(right);
{ call the invoke method with these parameters. It will take care of the
wrapping and typeconversions; first filter out the automatically added
hidden parameters though }
remove_hidden_paras;
result:=ccallnode.createinternmethod(right,'INVOKE',left);
{ reused }
left:=nil;
@ -527,12 +536,41 @@ implementation
function tjvmcallnode.pass_1: tnode;
var
sym: tsym;
begin
{ transform procvar calls }
if assigned(right) then
result:=dispatch_procvar
else
begin
{ replace virtual class method calls in case they may be indirect }
if (procdefinition.typ=procdef) and
([po_classmethod,po_virtualmethod]<=procdefinition.procoptions) and
(methodpointer.nodetype<>loadvmtaddrn) then
begin
sym:=
search_struct_member(tobjectdef(procdefinition.owner.defowner),
upper(tprocdef(procdefinition).import_name^));
if not assigned(sym) or
(sym.typ<>procsym) then
internalerror(2011072801);
{ check whether we can simply replace the symtableprocentry, or
whether we have to reresolve overloads }
if symtableprocentry.ProcdefList.count=1 then
begin
symtableprocentry:=tprocsym(sym);
procdefinition:=tprocdef(symtableprocentry.ProcdefList[0]);
end
else
begin
remove_hidden_paras;
result:=ccallnode.create(left,tprocsym(sym),symtableproc,methodpointer,callnodeflags);
left:=nil;
methodpointer:=nil;
exit;
end;
end;
result:=inherited pass_1;
if assigned(result) then
exit;

View File

@ -1781,9 +1781,9 @@ type_e_class_helper_must_extend_subclass=04101_E_Derived class helper must exten
type_e_record_helper_must_extend_same_record=04102_E_Derived record helper must extend "$1"
% If a record helper inherits from another record helper it must extend the same
% record that the parent record helper extended.
type_e_java_class_method_not_static=04103_E_Java class methods have to be static
% All methods in Java are either regular (virtual) methods, or static class
% methods. It is not possible to declare non-static class methods.
type_e_java_class_method_not_static_virtual=04103_E_JVM virtual class methods cannot be static
% Virtual class methods cannot be static when targetting the JVM platform, because
% the self pointer is required for correct dispatching.
type_e_invalid_final_assignment=04104_E_Final (class) fields can only be assigned in their class' (class) constructor
% It is only possible to assign a value to a final (class) field inside a (class) constructor of its owning class.
type_e_no_managed_formal_assign_typecast=04105_E_It is not possible to typecast untyped parameters on managed platforms, simply assign a value to them instead.

View File

@ -503,7 +503,7 @@ const
type_e_record_type_expected=04100;
type_e_class_helper_must_extend_subclass=04101;
type_e_record_helper_must_extend_same_record=04102;
type_e_java_class_method_not_static=04103;
type_e_java_class_method_not_static_virtual=04103;
type_e_invalid_final_assignment=04104;
type_e_no_managed_formal_assign_typecast=04105;
type_e_no_managed_assign_generic_typecast=04106;
@ -911,7 +911,7 @@ const
option_info=11024;
option_help_pages=11025;
MsgTxtSize = 61950;
MsgTxtSize = 61956;
MsgIdxMax : array[1..20] of longint=(
26,89,319,107,87,54,111,23,202,63,

View File

@ -618,190 +618,190 @@ const msgtxt : array[0..000258,1..240] of char=(
'04101_E_Derived class ','helper must extend a subclass of "$1" or the c'+
'lass itself'#000+
'04102_E_Derived record helper must extend "$1"'#000+
'04103_E_Java class methods have to be static'#000+
'04103_E_JVM virtual class methods cannot be static'#000+
'04104_E_Final (class) fields can only be assigned in their class'#039' '+
'(class) constructor'#000+
'0410','5_E_It is not possible to typecast untyped parameters on managed'+
' platforms, simply assign a value to them instead.'#000+
'(class) constructo','r'#000+
'04105_E_It is not possible to typecast untyped parameters on managed p'+
'latforms, simply assign a value to them instead.'#000+
'04106_E_The assignment side of an expression cannot be typecasted to a'+
' supertype on managed platforms'#000+
'05000_E_Identifier not ','found "$1"'#000+
'05000_E_Identifie','r not found "$1"'#000+
'05001_F_Internal Error in SymTableStack()'#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 def','inition'#000+
'05007_E_Error in ty','pe definition'#000+
'05009_E_Forward type not resolved "$1"'#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 allo','wed'#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 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 al','ready defined'#000+
'05020_E_la','bel already defined'#000+
'05021_E_illegal type declaration of set elements'#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+
'05026_H_Value para','meter "$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 me','thod "$1.$2" never used'#000+
'05031_N_Priv','ate method "$1.$2" never used'#000+
'05032_E_Set type expected'#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" do','es not seem 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 metho','d "$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+
'05055_W_Symbol "$1" is not implemented'#000+
'05056_E_Can'#039't create unique type from this type'#000+
'05057_H_Local variable "$1" does not seem to be initialized'#000+
'05058_H_Va','riable "$1" does not seem to be initialized'#000+
'0505','8_H_Variable "$1" does not seem to be initialized'#000+
'05059_W_Function result variable does not seem to initialized'#000+
'05060_H_Function result variable does not seem to be initialized'#000+
'05061_W_Variable "$1" read but nowhere assigned'#000+
'05062_H_Found abstrac','t method: $1'#000+
'05062_H_Found a','bstract method: $1'#000+
'05063_W_Symbol "$1" is experimental'#000+
'05064_W_Forward declaration "$1" not resolved, assumed external'#000+
'05065_W_Symbol "$1" is belongs to a library'#000+
'05066_W_Symbol "$1" is deprecated: "$2"'#000+
'05067_E_Cannot find an enumerator for the t','ype "$1"'#000+
'05067_E_Cannot find an enumerator for',' the type "$1"'#000+
'05068_E_Cannot find a "MoveNext" method in enumerator "$1"'#000+
'05069_E_Cannot find a "Current" property in enumerator "$1"'#000+
'05070_E_Mismatch between number of declared parameters and number of c'+
'olons in message string.'#000+
'05071_N_Private t','ype "$1.$2" never used'#000+
'05071_N_Pri','vate type "$1.$2" never used'#000+
'05072_N_Private const "$1.$2" never used'#000+
'05073_N_Private property "$1.$2" never used'#000+
'05074_W_Unit "$1" is deprecated'#000+
'05075_W_Unit "$1" is deprecated: "$2"'#000+
'05076_W_Unit "$1" is not portable'#000+
'05077_W_Unit "$1" is belongs',' to a library'#000+
'05077_W_Unit "$1" is b','elongs to a library'#000+
'05078_W_Unit "$1" is not implemented'#000+
'05079_W_Unit "$1" is experimental'#000+
'05080_E_No complete definition of the formally declared class "$1" is '+
'in scope'#000+
'05081_E_Gotos into initialization or finalization blocks of units are '+
'not al','lowed'#000+
'05081_E_Gotos into initialization or finalization blocks of units are ',
'not allowed'#000+
'05082_E_Invalid external name "$1" for formal class "$2"'#000+
'05083_E_Complete class definition with external name "$1" here'#000+
'05084_W_Possible library conflict: symbol "$1" from library "$2" also '+
'found in library "$3"'#000+
'05085_E_Cannot add imp','licit constructor '#039'Create'#039' because ide'+
'05085_E_Cannot a','dd implicit constructor '#039'Create'#039' because ide'+
'ntifier already used by "$1"'#000+
'05086_E_Cannot generate default constructor for class, because parent '+
'has no parameterless constructor'#000+
'06009_E_Parameter list size exceeds 65535 bytes'#000+
'06012_E_File types mus','t be var parameters'#000+
'06012_E_File typ','es must be var parameters'#000+
'06013_E_The use of a far pointer isn'#039't allowed there'#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+
'06','020_E_Abstract methods 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+
'06033_E_No code for inline procedure ','stored'#000+
'06035_E_Element zero of an ansi/wide- or longstring can'#039't be acces'+
'sed, use (set)length instead'#000+
'06037_E_Constructors or destructors cannot be called inside a '#039'wit'+
'h'#039' clause'#000+
'06038_E_Cannot call message handler methods directly'#000+
'06039_E_Jump in',' or outside of an exception block'#000+
'06039_E_J','ump in or outside 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 s','ize exceeds supported limit'#000+
'06043_E_Local varia','bles size exceeds supported limit'#000+
'06044_E_BREAK not allowed'#000+
'06045_E_CONTINUE not allowed'#000+
'06046_F_Unknown compilerproc "$1". Check if you use the correct run ti'+
'me library.'#000+
'06047_F_Cannot find system type "$1". Check if you use the correct run'+
' time',' library.'#000+
'06047_F_Cannot find system type "$1". Check if you use the correct ru',
'n time library.'#000+
'06048_H_Inherited call to abstract method ignored'#000+
'06049_E_Goto label "$1" not defined or optimized away'#000+
'06050_F_Cannot find type "$1" in unit "$2". Check if you use the corre'+
'ct run time library.'#000+
'06051_E_Interprocedural gotos are a','llowed only to outer subroutines'#000+
'06051_E_Interprocedural gotos',' are allowed only to outer subroutines'#000+
'06052_E_Label must be defined in the same scope as it is declared'#000+
'06053_E_Leaving procedures containing explicit or implicit exceptions '+
'frames using goto is not allowed'#000+
'07000_DL_Starting $1 styled assembler ','parsing'#000+
'07000_DL_Starting $1 styled asse','mbler 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+
'07007_E_Cannot use local varia','ble 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 a','llowed'#000+
'07013_E_Relocatable symbol is',' not allowed'#000+
'07014_E_Invalid reference syntax'#000+
'07015_E_You cannot 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+
'07018_W_Possible error in object field handling'#000+
'07019','_E_Wrong scale factor specified'#000+
'07018_W_Possible error in object field handling',#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+
'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+
'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+
'07036_E_Error converti','ng 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+
'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+
'07047_E_Asse','mbler 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'+
'07052_W_constant with symbol $1 for address which i','s not on a pointe'+
'r'#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+
'07057_E_Too many operands on line'#000+
'07058_W_NEAR ignored',#000+
'07058_W_NEAR i','gnored'#000+
'07059_W_FAR ignored'#000+
'07060_E_Duplicate local symbol $1'#000+
'07061_E_Undefined local symbol $1'#000+
@ -809,127 +809,127 @@ const msgtxt : array[0..000258,1..240] of char=(
'07063_E_Invalid register name'#000+
'07064_E_Invalid floating point 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+
'07072_W_Identifier $1 suppos','ed external'#000+
'07073_E_Strings not allowed as constants'#000+
'07074_E_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',' token is used without an identifier'#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 di','rectly'#000+
'07082_E_Can'#039't access fields of objects/clas','ses 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+
'07087_W_"$1 %st(n)" translated into "$1 %st,%st(n)"'#000+
'07','088_W_"$1 %st(n)" translated into "$1 %st(n),%st"'#000+
'07087_W_"$1 %st(n)" translated into "$1 %st,%st(','n)"'#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 f','or opcode'#000+
'07096_E_Reglist inv','alid for opcode'#000+
'07097_E_Higher cpu mode required ($1)'#000+
'07098_W_No size specified and unable to determine the size of the oper'+
'ands, using DWORD as default'#000+
'07099_E_Syntax error while trying to parse a shifter operand'#000+
'07100_E_Address of packed compon','ent is not at a byte boundary'#000+
'07100_E_Address of packed ','component is not at a byte boundary'#000+
'07101_W_No size specified and unable to determine the size of the oper'+
'ands, using BYTE as default'#000+
'07102_W_Use of +offset(%ebp) for parameters invalid here'#000+
'07103_W_Use of +offset(%ebp) is not compatible with reg','call conventi'+
'07103_W_Use of +offset(%ebp) is not compatible wi','th regcall conventi'+
'on'#000+
'07104_W_Use of -offset(%ebp) is not recommended for local variable acc'+
'ess'#000+
'07105_W_Use of -offset(%esp), access may cause a crash or value may be'+
' lost'#000+
'07106_E_VMTOffset must be used in combination with a virtual method, a'+
'nd "','$1" is not virtual'#000+
'07106_E_VMTOffset must be used in combination with a virtual method,',' '+
'and "$1" is not virtual'#000+
'07107_E_Generating PIC, but reference is not PIC-safe'#000+
'07108_E_All registers in a register set must be of the same kind and w'+
'idth'#000+
'07109_E_A register set cannot be empty'#000+
'07110_W_@GOTPCREL is useless and potentially dangereo','us for local sy'+
'07110_W_@GOTPCREL is useless and potentially da','ngereous for local sy'+
'mbols'#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 allowed in bss section'#000+
'08005_F','_No binary writer selected'#000+
'0','8005_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+
'08009_E_Asm: Invalid effective address'#000+
'08010_E_Asm: Immediate or referenc','e expected'#000+
'08010_E_Asm: Immediate or re','ference 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 supported for this target'#000+
'0801','6_E_Asm: Duplicate label $1'#000+
'08015_E_Asm: Extended type not supported for this targe','t'#000+
'08016_E_Asm: Duplicate label $1'#000+
'08017_E_Asm: Redefined label $1'#000+
'08018_E_Asm: First defined here'#000+
'08019_E_Asm: Invalid register $1'#000+
'08020_E_Asm: 16 or 32 Bit references not supported'#000+
'08021_E_Asm: 64 Bit operands not supported'#000+
'08022_E_Asm: AH,BH,CH',' or DH cannot be used in an instruction requiri'+
'08022_E_Asm: AH',',BH,CH or DH cannot be used in an instruction requiri'+
'ng REX prefix'#000+
'09000_W_Source operating system redefined'#000+
'09001_I_Assembling (pipe) $1'#000+
'09002_E_Can'#039't create assembler file: $1'#000+
'09003_E_Can'#039't create object file: $1'#000+
'09004_E_Can'#039't create archive fi','le: $1'#000+
'09004_E_Can'#039't create arch','ive 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 a'+
'ssembling'#000+
'09009_I_Assembling $1',#000+
'09009_I_Assembl','ing $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+
'09013_E_Error while linking'#000+
'09014_E_Can'#039't call the linker, switching to external linking'#000+
'09015_I_Linki','ng $1'#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 supported'#000+
'09020_I_Closing script $1'#000+
'09021_E_resource compile','r "$1" not found, switching to external mode'+
'09021_E_resource c','ompiler "$1" 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, switching to static linking'+
#000+
'09025_T_unit $1 can'#039't be sh','ared linked, switching to static link'+
'09025_T_unit $1 can'#039't',' be shared linked, switching to static link'+
'ing'#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+
'09028_D_Calling resource compiler "$1" with "$2" as command line'#000+
'09029_E_Error while compiling resourc','es'#000+
'09029_E_Error while compiling r','esources'#000+
'09030_E_Can'#039't call the resource compiler "$1", switching to extern'+
'al mode'#000+
'09031_E_Can'#039't open resource file "$1"'#000+
'09032_E_Can'#039't write resource file "$1"'#000+
'09128_F_Can'#039't post process executable $1'#000+
'09129_F_Can'#039't open executable $1'#000+
'09130_X_Size',' of Code: $1 bytes'#000+
'09130_','X_Size of Code: $1 bytes'#000+
'09131_X_Size of initialized data: $1 bytes'#000+
'09132_X_Size of uninitialized data: $1 bytes'#000+
'09133_X_Stack space reserved: $1 bytes'#000+
'09134_X_Stack space committed: $1 bytes'#000+
'09200_F_Executable image size is too big for $1 target','.'#000+
'09200_F_Executable image size is too big for $1 ','target.'#000+
'09201_W_Object file "$1" contains 32-bit absolute relocation to symbol'+
' "$2".'#000+
'10000_T_Unitsearch: $1'#000+
@ -938,160 +938,160 @@ const msgtxt : array[0..000258,1..240] of char=(
'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+
'1000','7_U_PPU Invalid Header (no PPU at the begin)'#000+
'10006_U_PPU File too shor','t'#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+
'10010_U_PPU is compiled for another target'#000+
'10011_U_PPU Source: $1'#000+
'10012_U_Writing $1'#000+
'10013_F_Can'#039't Write PPU-File'#000+
'1001','4_F_Error reading PPU-File'#000+
'10013_F_Can'#039't Write PPU-Fil','e'#000+
'10014_F_Error reading PPU-File'#000+
'10015_F_unexpected end of PPU-File'#000+
'10016_F_Invalid PPU-File entry: $1'#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_Ca','n'#039't compile unit $1, no sources available'#000+
'1002','1_F_Can'#039't compile unit $1, no sources available'#000+
'10022_F_Can'#039't find unit $1 used by $2'#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+
'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+
'10029_U_Recompiling $1, source found only'#000+
'10030_U_Recompiling unit, static lib is older than ppufile'#000+
'10031_U_Recompiling u','nit, shared lib is older than ppufile'#000+
'10031_U_Recompi','ling unit, shared lib is older than ppufile'#000+
'10032_U_Recompiling 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+
'10036_U_Second loa','d for unit $1'#000+
'10037_U_PPU Check file $1 time $2'#000+
'10040_W_Can'#039't recompile unit $1, but found modifed include files'#000+
'10041_U_File $1 is newer than the one used for creating PPU file $2'#000+
'10042_U_Trying to use a unit which was compiled with a different ','FPU'+
'10042_U_Trying to use a unit which was compiled with a diff','erent FPU'+
' mode'#000+
'10043_U_Loading interface units from $1'#000+
'10044_U_Loading implementation units from $1'#000+
'10045_U_Interface CRC changed for unit $1'#000+
'10046_U_Implementation CRC changed for unit $1'#000+
'10047_U_Finished compiling unit $1'#000+
'10048_U_Adding depende','ncy: $1 depends on $2'#000+
'10048_U_Adding d','ependency: $1 depends on $2'#000+
'10049_U_No reload, is caller: $1'#000+
'10050_U_No reload, already in second compile: $1'#000+
'10051_U_Flag for reload: $1'#000+
'10052_U_Forced reloading'#000+
'10053_U_Previous state of $1: $2'#000+
'10054_U_Already compiling $1, setting second compi','le'#000+
'10054_U_Already compiling $1, setting second',' compile'#000+
'10055_U_Loading unit $1'#000+
'10056_U_Finished loading unit $1'#000+
'10057_U_Registering new unit $1'#000+
'10058_U_Re-resolving unit $1'#000+
'10059_U_Skipping re-resolving unit $1, still loading used units'#000+
'10060_U_Unloading resource unit $1 (not needed)'#000+
'10061_E','_Unit $1 was compiled using a different whole program optimiz'+
'1','0061_E_Unit $1 was compiled using a different whole program optimiz'+
'ation feedback input ($2, $3); recompile it without wpo or use the sam'+
'e wpo feedback input file for this compilation invocation'#000+
'10062_U_Indirect interface (objects/classes) CRC ch','anged for unit $1'+
'10062_U_Indirect interface (objects/classes) ','CRC changed for unit $1'+
#000+
'11000_O_$1 [options] <inputfile> [options]'#000+
'11001_W_Only one source file supported, changing source file to compil'+
'e from "$1" into "$2"'#000+
'11002_W_DEF file can be created only for OS/2'#000+
'11003_E_nested response files are not sup','ported'#000+
'11003_E_nested response files are n','ot supported'#000+
'11004_F_No source file name in command line'#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 furthe','r options from $1'#000+
'11010_D_Reading ','further options from $1'#000+
'11011_W_Target is already set to: $1'#000+
'11012_W_Shared libs not supported on DOS platform, reverting to static'+
#000+
'11013_F_In options file $1 at line $2 too many \var{\#IF(N)DEFs} encou'+
'ntered'#000+
'11014_F_In options file $1 at line $2',' unexpected \var{\#ENDIFs} enco'+
'11014_F_In options file $1 at l','ine $2 unexpected \var{\#ENDIFs} enco'+
'untered'#000+
'11015_F_Open conditional at the end of the options file'#000+
'11016_W_Debug information generation is not supported by this executab'+
'le'#000+
'11017_H_Try recompiling with -dGDB'#000+
'11018_W_You are using the obsolete sw','itch $1'#000+
'11018_W_You are using the obsol','ete switch $1'#000+
'11019_W_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+
'11022_W_"$1" assembler use forced'#000+
'11026_T','_Reading options from file $1'#000+
'1','1026_T_Reading options from file $1'#000+
'11027_T_Reading options from environment $1'#000+
'11028_D_Handling option "$1"'#000+
'11029_O_*** 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+
'11032_D_interpreting opti','on "$1"'#000+
'11036_D_interpreting firstpass option "$1"'#000+
'11033_D_interpreting file option "$1"'#000+
'11034_D_Reading config file "$1"'#000+
'11035_D_found source file name "$1"'#000+
'11039_E_Unknown code page'#000+
'11040_F_Config file $1 is a directory'#000+
'11041_W_Assembler output',' selected "$1" cannot generate debug info, d'+
'11041_W_Assembler ','output selected "$1" cannot generate debug info, d'+
'ebugging disabled'#000+
'11042_W_Use of ppc386.cfg is deprecated, please use fpc.cfg instead'#000+
'11043_F_In options file $1 at line $2 \var{\#ELSE} directive without \'+
'var{\#IF(N)DEF} found'#000+
'11044_F_Option "$1','" is not, or not yet, supported on the current tar'+
'11044_F_Opti','on "$1" is not, or not yet, supported on the current tar'+
'get platform'#000+
'11045_F_The feature "$1" is not, or not yet, supported on the selected'+
' target platform'#000+
'11046_N_DWARF debug information cannot be used with smart linking on t'+
'his target, switchin','g to static linking'#000+
'his target, sw','itching to static linking'#000+
'11047_W_Option "$1" is ignored for the current target platform.'#000+
'11048_W_Disabling external debug information because it is unsupported'+
' for the selected target/debug format combination.'#000+
'12000_F_Cannot open whole program o','ptimization feedback file "$1"'#000+
'12000_F_Cannot open whole pro','gram optimization feedback file "$1"'#000+
'12001_D_Processing whole program optimization information in wpo feedb'+
'ack file "$1"'#000+
'12002_D_Finished processing the whole program optimization information'+
' in wpo feedback file "$1"'#000+
'12003_E_Expected section hea','der, but got "$2" at line $1 of wpo feed'+
'12003_E_Expected secti','on header, but got "$2" at line $1 of wpo feed'+
'back file'#000+
'12004_W_No handler registered for whole program optimization section "'+
'$2" at line $1 of wpo feedback file, ignoring'#000+
'12005_D_Found whole program optimization section "$1" with information'+
' abo','ut "$2"'#000+
'12005_D_Found whole program optimization section "$1" with informati','o'+
'n about "$2"'#000+
'12006_F_The selected whole program optimizations require a previously '+
'generated feedback file (use -Fw to specify)'#000+
'12007_E_No collected information necessary to perform "$1" whole progr'+
'am optimization found'#000+
'12008_F_Specify a whole p','rogram optimization feedback file to store '+
'12008_F_Specify a w','hole program optimization feedback file to store '+
'the generated info in (using -FW)'#000+
'12009_E_Not generating any whole program optimization information, yet'+
' a feedback file was specified (using -FW)'#000+
'12010_E_Not performing any whole program optimizat','ions, yet an input'+
'12010_E_Not performing any whole program opt','imizations, yet an input'+
' feedback file was specified (using -Fw)'#000+
'12011_D_Skipping whole program optimization section "$1", because not '+
'needed by the requested optimizations'#000+
'12012_W_Overriding previously read information for "$1" from feedback '+
'inp','ut file using information in section "$2"'#000+
'12012_W_Overriding previously read information for "$1" from feedba','c'+
'k input file using information in section "$2"'#000+
'12013_E_Cannot extract symbol liveness information from program when s'+
'tripping symbols, use -Xs-'#000+
'12014_E_Cannot extract symbol liveness information from program when w'+
'hen not linking'#000+
'12015_F_Cannot ','find "$1" or "$2" to extract symbol liveness informat'+
'12015_F_C','annot find "$1" or "$2" to extract symbol liveness informat'+
'ion from linked program'#000+
'12016_E_Error during reading symbol liveness information produced by "'+
'$1"'#000+
'12017_F_Error executing "$1" (exitcode: $2) to extract symbol informat'+
'ion from linked pro','gram'#000+
'ion from link','ed program'#000+
'12018_E_Collection of symbol liveness information can only help when u'+
'sing smart linking, use -CX -XX'#000+
'12019_E_Cannot create specified whole program optimisation feedback fi'+
'le "$1"'#000+
'11023_Free Pascal Compiler version $FPCFULLVERSION [$FP','CDATE] for $F'+
'11023_Free Pascal Compiler version $FPCFULLVERSIO','N [$FPCDATE] for $F'+
'PCCPU'#010+
'Copyright (c) 1993-2011 by Florian Klaempfl and others'#000+
'11024_Free Pascal Compiler version $FPCVERSION'#010+
@ -1102,7 +1102,7 @@ const msgtxt : array[0..000258,1..240] of char=(
'Supported targets:'#010+
' $OSTARGETS'#010+
#010+
'Supported CPU instruction',' sets:'#010+
'Supported CPU instr','uction sets:'#010+
' $INSTRUCTIONSETS'#010+
#010+
'Supported FPU instruction sets:'#010+
@ -1118,7 +1118,7 @@ const msgtxt : array[0..000258,1..240] of char=(
' All'#010+
' $WPOPTIMIZATIONS'#010+
#010+
'Supported Mi','crocontroller types:'#010+
'Suppor','ted Microcontroller types:'#010+
' $CONTROLLERTYPES'#010+
#010+
'This program comes under the GNU General Public Licence'#010+
@ -1127,72 +1127,72 @@ const msgtxt : array[0..000258,1..240] of char=(
'Report bugs, suggestions, etc. to:'#010+
' http://bugs.freepascal.org'#010+
'or'#010+
' bugs@','freepascal.org'#000+
' ',' bugs@freepascal.org'#000+
'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+
'**2an_List node info in assembler file'#010+
'*','L2ap_Use pipes instead of creating temporary assembler files'#010+
'**2an_List node info in assembler ','file'#010+
'*L2ap_Use pipes instead of creating temporary assembler files'#010+
'**2ar_List register allocation/release info in assembler file'#010+
'**2at_List temp allocation/release info in assembler file'#010+
'**1A<x>_Output format:'#010+
'**2Adefault_Use default assembler'#010+
'3*','2Aas_Assemble using GNU AS'#010+
'**2Adefault_Use default assemb','ler'#010+
'3*2Aas_Assemble using GNU AS'#010+
'3*2Amacho_Mach-O (Darwin, Intel 32 bit) using internal writer'#010+
'3*2Anasmcoff_COFF (Go32v2) file using Nasm'#010+
'3*2Anasmelf_ELF32 (Linux) file using Nasm'#010+
'3*2Anasmwin32_Win32 object file using Nasm'#010+
'3*2Anasmwdosx_Win32/WDO','SX object file using Nasm'#010+
'3*2Anasmwdosx_Win','32/WDOSX object file using Nasm'#010+
'3*2Awasm_Obj file using Wasm (Watcom)'#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*2Aelf_ELF (Linux) using internal writer'#010+
'3*2Acoff_COFF (Go32v2)',' using internal writer'#010+
'3*2Acoff_COFF (G','o32v2) using internal writer'#010+
'3*2Apecoff_PE-COFF (Win32) using internal writer'#010+
'4*2Aas_Assemble using GNU AS'#010+
'4*2Agas_Assemble using GNU GAS'#010+
'4*2Agas-darwin_Assemble darwin Mach-O64 using GNU GAS'#010+
'4*2Amasm_Win64 object file using ml64 (Microsoft)'#010+
'4*2A','pecoff_PE-COFF (Win64) using internal writer'#010+
'4*2Amasm_Win64 object file using ml64 (Microsoft',')'#010+
'4*2Apecoff_PE-COFF (Win64) using internal writer'#010+
'4*2Aelf_ELF (Linux-64bit) using internal writer'#010+
'6*2Aas_Unix o-file using GNU AS'#010+
'6*2Agas_GNU Motorola assembler'#010+
'6*2Amit_MIT Syntax (old GAS)'#010+
'6*2Amot_Standard Motorola assembler'#010+
'A*2Aas_Assemble usi','ng GNU AS'#010+
'A*2Aas_Assemb','le using GNU AS'#010+
'P*2Aas_Assemble using GNU AS'#010+
'S*2Aas_Assemble using GNU AS'#010+
'**1b_Generate browser info'#010+
'**2bl_Generate local symbol info'#010+
'**1B_Build all modules'#010+
'**1C<x>_Code generation options:'#010+
'**2C3<x>_Turn on ieee error checking for constants'#010+
'**2Ca','<x>_Select ABI, see fpc -i for possible values'#010+
'**2C3<x>_Turn on ieee error checking for constants',#010+
'**2Ca<x>_Select ABI, see fpc -i for possible values'#010+
'**2Cb_Generate big-endian code'#010+
'**2Cc<x>_Set default calling convention to <x>'#010+
'**2CD_Create also dynamic library (not supported)'#010+
'**2Ce_Compilation with emulated floating point opcodes'#010+
'**2Cf<x>_S','elect fpu instruction set to use, see fpc -i for possible '+
'**2C','f<x>_Select fpu instruction set to use, see fpc -i for possible '+
'values'#010+
'**2CF<x>_Minimal floating point constant precision (default, 32, 64)'#010+
'**2Cg_Generate PIC code'#010+
'**2Ch<n>_<n> bytes heap (between 1023 and 67107840)'#010+
'**2Ci_IO-checking'#010+
'**2Cn_Omit l','inking stage'#010+
'**2Cn_','Omit linking stage'#010+
'**2Co_Check overflow of integer operations'#010+
'**2CO_Check for possible overflow of integer operations'#010+
'**2Cp<x>_Select instruction set, see fpc -i for possible values'#010+
'**2CP<x>=<y>_ packing settings'#010+
'**3CPPACKSET=<y>_ <y> set allocat','ion: 0, 1 or DEFAULT or NORMAL, 2, '+
'**3CPPACKSET=<y>_ <y> set a','llocation: 0, 1 or DEFAULT or NORMAL, 2, '+
'4 and 8'#010+
'**2Cr_Range checking'#010+
'**2CR_Verify object method call validity'#010+
'**2Cs<n>_Set stack checking size to <n>'#010+
'**2Ct_Stack checking (for testing only, see manual)'#010+
'**2CX_Create also smartlinked library'#010+
'**1d<','x>_Defines the symbol <x>'#010+
'**2CX_Create also smartlinked library',#010+
'**1d<x>_Defines the symbol <x>'#010+
'**1D_Generate a DEF file'#010+
'**2Dd<x>_Set description to <x>'#010+
'**2Dv<x>_Set DLL version to <x>'#010+
@ -1200,126 +1200,126 @@ const msgtxt : array[0..000258,1..240] of char=(
'**1e<x>_Set path to executable'#010+
'**1E_Same as -Cn'#010+
'**1fPIC_Same as -Cg'#010+
'**1F<x>_Set file names and paths:'#010+
'**','2Fa<x>[,y]_(for a program) load units <x> and [y] before uses is p'+
'arsed'#010+
'**1F<x>_Set file names and pat','hs:'#010+
'**2Fa<x>[,y]_(for a program) load units <x> and [y] before uses is par'+
'sed'#010+
'**2Fc<x>_Set input codepage to <x>'#010+
'**2FC<x>_Set RC compiler binary name to <x>'#010+
'**2Fd_Disable the compiler'#039's internal directory cache'#010+
'**2FD<x>_Set the directory where to',' search for compiler utilities'#010+
'**2FD<x>_Set the directory wh','ere to search for compiler utilities'#010+
'**2Fe<x>_Redirect error output to <x>'#010+
'**2Ff<x>_Add <x> to framework path (Darwin only)'#010+
'**2FE<x>_Set exe/unit output path to <x>'#010+
'**2Fi<x>_Add <x> to include path'#010+
'**2Fl<x>_Add <x> to library path'#010+
'**2FL<x>_Use <x','> as dynamic linker'#010+
'**2FL<x>_','Use <x> as dynamic linker'#010+
'**2Fm<x>_Load unicode conversion table from <x>.txt in the compiler di'+
'r'#010+
'**2Fo<x>_Add <x> to object path'#010+
'**2Fr<x>_Load error message file <x>'#010+
'**2FR<x>_Set resource (.res) linker to <x>'#010+
'**2Fu<x>_Add <x> to unit path'#010+
'**2FU<','x>_Set unit output path to <x>, overrides -FE'#010+
'**2Fu<x>_Add <x> to unit path'#010,
'**2FU<x>_Set unit output path to <x>, overrides -FE'#010+
'**2FW<x>_Store generated whole-program optimization feedback in <x>'#010+
'**2Fw<x>_Load previously stored whole-program optimization feedback fr'+
'om <x>'#010+
'*g1g_Generate debug information (default format f','or target)'#010+
'*g1g_Generate debug information (default fo','rmat for target)'#010+
'*g2gc_Generate checks for pointers'#010+
'*g2gh_Use heaptrace unit (for memory leak/corruption debugging)'#010+
'*g2gl_Use line info unit (show more info with backtraces)'#010+
'*g2go<x>_Set debug information options'#010+
'*g3godwarfsets_ Enable DWARF '#039'set',#039' type debug information (bre'+
'aks gdb < 6.5)'#010+
'*g3godwarfsets_ Enable DWAR','F '#039'set'#039' type debug information (b'+
'reaks gdb < 6.5)'#010+
'*g3gostabsabsincludes_ Store absolute/full include file paths in Stabs'+
#010+
'*g3godwarfmethodclassprefix_ Prefix method names in DWARF with class n'+
'ame'#010+
'*g2gp_Preserve case in stabs symbol names'#010+
'*g2gs_Gen','erate Stabs debug information'#010+
'*g2','gs_Generate Stabs debug information'#010+
'*g2gt_Trash local variables (to detect uninitialized uses)'#010+
'*g2gv_Generates programs traceable with Valgrind'#010+
'*g2gw_Generate DWARFv2 debug information (same as -gw2)'#010+
'*g2gw2_Generate DWARFv2 debug information'#010+
'*g2g','w3_Generate DWARFv3 debug information'#010+
'*g2gw2_Generate DWARFv2 debug informatio','n'#010+
'*g2gw3_Generate DWARFv3 debug information'#010+
'*g2gw4_Generate DWARFv4 debug information (experimental)'#010+
'**1i_Information'#010+
'**2iD_Return compiler date'#010+
'**2iV_Return short compiler version'#010+
'**2iW_Return full compiler version'#010+
'**2iSO_Return compiler OS'#010+
'**2i','SP_Return compiler host processor'#010+
'**2iSO_Return compiler O','S'#010+
'**2iSP_Return compiler host processor'#010+
'**2iTO_Return target OS'#010+
'**2iTP_Return target processor'#010+
'**1I<x>_Add <x> to include path'#010+
'**1k<x>_Pass <x> to the linker'#010+
'**1l_Write logo'#010+
'**1M<x>_Set language mode to <x>'#010+
'**2Mfpc_Free Pascal dialect (default)'#010+
'*','*2Mobjfpc_FPC mode with Object Pascal support'#010+
'**2Mfpc_Free Pascal dialect (defa','ult)'#010+
'**2Mobjfpc_FPC mode with Object Pascal support'#010+
'**2Mdelphi_Delphi 7 compatibility mode'#010+
'**2Mtp_TP/BP 7.0 compatibility mode'#010+
'**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+
'**1n_Do not read the default config files'#010+
'**1N<x>_Node tree opt','imizations'#010+
'**1N<x>_Node tr','ee optimizations'#010+
'**2Nu_Unroll loops'#010+
'**1o<x>_Change the name of the executable produced to <x>'#010+
'**1O<x>_Optimizations:'#010+
'**2O-_Disable optimizations'#010+
'**2O1_Level 1 optimizations (quick and debugger friendly)'#010+
'**2O2_Level 2 optimizations (-O1 + quick op','timizations)'#010+
'**2O2_Level 2 optimizations (-O1 + qu','ick optimizations)'#010+
'**2O3_Level 3 optimizations (-O2 + slow optimizations)'#010+
'**2Oa<x>=<y>_Set alignment'#010+
'**2Oo[NO]<x>_Enable or disable optimizations, see fpc -i for possible '+
'values'#010+
'**2Op<x>_Set target cpu for optimizing, see fpc -i for possible valu','e'+
's'#010+
'**2Op<x>_Set target cpu for optimizing, see fpc -i for possibl','e valu'+
'es'#010+
'**2OW<x>_Generate whole-program optimization feedback for optimization'+
' <x>, see fpc -i for possible values'#010+
'**2Ow<x>_Perform whole-program optimization <x>, see fpc -i for possib'+
'le values'#010+
'**2Os_Optimize for size rather than speed'#010+
'**1pg_Ge','nerate profile code for gprof (defines FPC_PROFILE)'#010+
'**','1pg_Generate profile code for gprof (defines FPC_PROFILE)'#010+
'**1R<x>_Assembler reading style:'#010+
'**2Rdefault_Use default assembler for target'#010+
'3*2Ratt_Read AT&T style assembler'#010+
'3*2Rintel_Read Intel style assembler'#010+
'6*2RMOT_Read motorola style assembler'#010+
'*','*1S<x>_Syntax options:'#010+
'6*2RMOT_Read motorola style assem','bler'#010+
'**1S<x>_Syntax options:'#010+
'**2S2_Same as -Mobjfpc'#010+
'**2Sc_Support operators like C (*=,+=,/= and -=)'#010+
'**2Sa_Turn on assertions'#010+
'**2Sd_Same as -Mdelphi'#010+
'**2Se<x>_Error options. <x> is a combination of the following:'#010+
'**3*_<n> : Compiler halts after th','e <n> errors (default is 1)'#010+
'**3*_<n> : Compiler halts af','ter the <n> errors (default is 1)'#010+
'**3*_w : Compiler also halts after warnings'#010+
'**3*_n : Compiler also halts after notes'#010+
'**3*_h : Compiler also halts after hints'#010+
'**2Sg_Enable LABEL and GOTO (default in -Mtp and -Mdelphi)'#010+
'**2Sh_Use ansistrings by de','fault instead of shortstrings'#010+
'**2Sh_Use ansistrings',' by default instead of shortstrings'#010+
'**2Si_Turn on inlining of procedures/functions declared as "inline"'#010+
'**2Sk_Load fpcylix unit'#010+
'**2SI<x>_Set interface style to <x>'#010+
'**3SIcom_COM compatible interface (default)'#010+
'**3SIcorba_CORBA compatible interface'#010,
'**3SIcorba_CORBA compatible inte','rface'#010+
'**2Sm_Support macros like C (global)'#010+
'**2So_Same as -Mtp'#010+
'**2Ss_Constructor name must be init (destructor must be done)'#010+
'**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+
'**2Sy_@<pointer> returns a typed pointer, same as $T+'#010+
'**1','s_Do not call assembler and linker'#010+
'**2Sy_@<pointer> returns a typed pointer, same as $','T+'#010+
'**1s_Do not call assembler and linker'#010+
'**2sh_Generate script to link on host'#010+
'**2st_Generate script to link on target'#010+
'**2sr_Skip register allocation phase (use with -alr)'#010+
'**1T<x>_Target operating system:'#010+
'3*2Tdarwin_Darwin/Mac OS X'#010+
'3*2Temx_OS/2 v','ia EMX (including EMX/RSX extender)'#010+
'3*2Temx_','OS/2 via EMX (including EMX/RSX extender)'#010+
'3*2Tfreebsd_FreeBSD'#010+
'3*2Tgo32v2_Version 2 of DJ Delorie DOS extender'#010+
'3*2Tiphonesim_ iPhoneSimulator from iOS SDK 3.2+ (older versions: -Tda'+
'rwin)'#010+
'3*2Tlinux_Linux'#010+
'3*2Tnetbsd_NetBSD'#010+
'3*2Tnetware_Novell Netware',' Module (clib)'#010+
'3*2Tnetware_Novell N','etware Module (clib)'#010+
'3*2Tnetwlibc_Novell Netware Module (libc)'#010+
'3*2Topenbsd_OpenBSD'#010+
'3*2Tos2_OS/2 / eComStation'#010+
@ -1327,7 +1327,7 @@ const msgtxt : array[0..000258,1..240] of char=(
'3*2Tsymbian_Symbian OS'#010+
'3*2Tsolaris_Solaris'#010+
'3*2Twatcom_Watcom compatible DOS extender'#010+
'3*2Twdosx_WDOSX DOS extende','r'#010+
'3*2Twdosx_WDOSX DOS e','xtender'#010+
'3*2Twin32_Windows 32 Bit'#010+
'3*2Twince_Windows CE'#010+
'4*2Tdarwin_Darwin/Mac OS X'#010+
@ -1337,7 +1337,7 @@ const msgtxt : array[0..000258,1..240] of char=(
'6*2Tatari_Atari ST/STe/TT'#010+
'6*2Tlinux_Linux'#010+
'6*2Tpalmos_PalmOS'#010+
'A*2Tdarwin_Darwin/iPho','neOS/iOS'#010+
'A*2Tdarwin_Darwi','n/iPhoneOS/iOS'#010+
'A*2Tlinux_Linux'#010+
'A*2Twince_Windows CE'#010+
'P*2Tamiga_AmigaOS'#010+
@ -1348,100 +1348,100 @@ const msgtxt : array[0..000258,1..240] of char=(
'S*2Tsolaris_Solaris'#010+
'S*2Tlinux_Linux'#010+
'**1u<x>_Undefines the symbol <x>'#010+
'**1U_Unit options',':'#010+
'**1U_Unit o','ptions:'#010+
'**2Un_Do not check where the unit name matches the file name'#010+
'**2Ur_Generate release unit files (never automatically recompiled)'#010+
'**2Us_Compile a system unit'#010+
'**1v<x>_Be verbose. <x> is a combination of the following letters:'#010+
'**2*_e : Show e','rrors (default) 0 : Show nothing (except errors'+
'**2*_e : ','Show errors (default) 0 : Show nothing (except errors'+
')'#010+
'**2*_w : Show warnings u : Show unit info'#010+
'**2*_n : Show notes t : Show tried/used files'#010+
'**2*_h : Show hints c : Show conditionals'#010+
'**2*_i ',': Show general info d : Show debug info'#010+
'*','*2*_i : Show general info d : Show debug info'#010+
'**2*_l : Show linenumbers r : Rhide/GCC compatibility mode'#010+
'**2*_s : Show time stamps q : Show message numbers'#010+
'**2*_a : Show everything x : Executable info (','Win32 only'+
'**2*_a : Show everything x : Executable ','info (Win32 only'+
')'#010+
'**2*_b : Write file names messages p : Write tree.log with parse tre'+
'e'#010+
'**2*_ with full path v : Write fpcdebug.txt with'#010+
'**2*_ lots of debugging info'#010+
'**2*_m<x>,<y> : Don'#039't show ','messages numbered <x> and <y>'#010+
'**2*_m<x>,<y> : Don'#039't',' show messages numbered <x> and <y>'#010+
'**1W<x>_Target-specific options (targets)'#010+
'3*2WA_Specify native type application (Windows)'#010+
'4*2WA_Specify native type application (Windows)'#010+
'A*2WA_Specify native type application (Windows)'#010+
'3*2Wb_Create a bundle in','stead of a library (Darwin)'#010+
'3*2Wb_Create a bun','dle instead of a library (Darwin)'#010+
'P*2Wb_Create a bundle instead of a library (Darwin)'#010+
'p*2Wb_Create a bundle instead of a library (Darwin)'#010+
'A*2Wb_Create a bundle instead of a library (Darwin)'#010+
'4*2Wb_Create a bundle instead of a library (Darwin)'#010+
'3*2W','B_Create a relocatable image (Windows, Symbian)'#010+
'4*2Wb_Create a bundle instead of a library (Darwin',')'#010+
'3*2WB_Create a relocatable image (Windows, Symbian)'#010+
'3*2WBxxxx_Set image base to xxxx (Windows, Symbian)'#010+
'4*2WB_Create a relocatable image (Windows)'#010+
'4*2WBxxxx_Set image base to xxxx (Windows)'#010+
'A*2WB_Create a relocatable image (Windows, Symbian)'#010+
'A*','2WBxxxx_Set image base to xxxx (Windows, Symbian)'#010+
'A*2WB_Create a relocatable image (Windows, Symbi','an)'#010+
'A*2WBxxxx_Set image base to xxxx (Windows, Symbian)'#010+
'3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
'4*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
'A*2WC_Specify console type application (Windows)'#010+
'P*2WC_Specify console',' type application (Classic Mac OS)'#010+
'P*2WC_Specify c','onsole type application (Classic Mac OS)'#010+
'3*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
'4*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
'A*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
'3*2We_Use external ','resources (Darwin)'#010+
'3*2We_Use ext','ernal resources (Darwin)'#010+
'4*2We_Use external resources (Darwin)'#010+
'A*2We_Use external resources (Darwin)'#010+
'P*2We_Use external resources (Darwin)'#010+
'p*2We_Use external resources (Darwin)'#010+
'3*2WF_Specify full-screen type application (EMX, OS/2)'#010+
'3*2WG_Specify ','graphic type application (EMX, OS/2, Windows)'#010+
'3*2WG_Sp','ecify graphic type application (EMX, OS/2, Windows)'#010+
'4*2WG_Specify graphic type application (EMX, OS/2, Windows)'#010+
'A*2WG_Specify graphic type application (Windows)'#010+
'P*2WG_Specify graphic type application (Classic Mac OS)'#010+
'3*2Wi_Use internal resources ','(Darwin)'#010+
'3*2Wi_Use internal reso','urces (Darwin)'#010+
'4*2Wi_Use internal resources (Darwin)'#010+
'A*2Wi_Use internal resources (Darwin)'#010+
'P*2Wi_Use internal resources (Darwin)'#010+
'p*2Wi_Use internal resources (Darwin)'#010+
'3*2WI_Turn on/off the usage of import sections (Windows)'#010+
'4*2WI_Turn on/off the ','usage of import sections (Windows)'#010+
'4*2WI_Turn on/of','f the usage of import sections (Windows)'#010+
'A*2WI_Turn on/off the usage of import sections (Windows)'#010+
'3*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
'4*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
'A*2WN_Do',' not generate relocation code, needed for debugging (Windows'+
'A*','2WN_Do not generate relocation code, needed for debugging (Windows'+
')'#010+
'A*2Wpxxxx_Specify the controller type, see fpc -i for possible values'#010+
'V*2Wpxxxx_Specify the controller type, see fpc -i for possible values'#010+
'3*2WR_Generate relocation code (Window','s)'#010+
'3*2WR_Generate relocation code (','Windows)'#010+
'4*2WR_Generate relocation code (Windows)'#010+
'A*2WR_Generate relocation code (Windows)'#010+
'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+
'**2WX_Enable executable stack (Linux)'#010+
'**1X_Executable options:'#010+
'**2Xc_Pass --shared/-dynamic to the',' linker (BeOS, Darwin, FreeBSD, L'+
'**2Xc_Pass --shared/-dynamic ','to the linker (BeOS, Darwin, FreeBSD, L'+
'inux)'#010+
'**2Xd_Do not use standard library search path (needed for cross compil'+
'e)'#010+
'**2Xe_Use external linker'#010+
'**2Xg_Create debuginfo in a separate file and add a debuglink section '+
'to executable'#010+
'**2XD_Try to link ','units dynamically (defines FPC_LINK_DYNAMIC)'#010+
'**2XD_Try to',' link units dynamically (defines FPC_LINK_DYNAMIC)'#010+
'**2Xi_Use internal linker'#010+
'**2Xm_Generate link map'#010+
'**2XM<x>_Set the name of the '#039'main'#039' program routine (default i'+
's '#039'main'#039')'#010+
'**2XP<x>_Prepend the binutils names with the prefix <x>'#010+
'**2Xr<x>_Set',' the linker'#039's rlink-path to <x> (needed for cross co'+
'**2Xr<','x>_Set the linker'#039's rlink-path to <x> (needed for cross co'+
'mpile, see the ld manual for more information) (BeOS, Linux)'#010+
'**2XR<x>_Prepend <x> to all linker search paths (BeOS, Darwin, FreeBSD'+
', Linux, Mac OS, Solaris)'#010+
'**2Xs_Strip all symbols from ex','ecutable'#010+
'**2Xs_Strip all symbols f','rom executable'#010+
'**2XS_Try to link units statically (default, defines FPC_LINK_STATIC)'#010+
'**2Xt_Link with static libraries (-static is passed to linker)'#010+
'**2XX_Try to smartlink units (defines FPC_LINK_SMART)'#010+
'**1*_'#010+
'**1?_Show this help'#010+
'**1h_S','hows this help without waiting'
'**1?_Show this help'#010,
'**1h_Shows this help without waiting'
);

View File

@ -780,6 +780,7 @@ implementation
procedure chkjava(pd: tprocdef);
begin
{$ifdef jvm}
if is_java_class_or_interface(pd.struct) then
begin
{ mark all non-virtual instance methods as "virtual; final;",
@ -792,15 +793,23 @@ implementation
vmt and we can't check whether child classes try to override
them
}
if is_javaclass(pd.struct) and
not(po_virtualmethod in pd.procoptions) and
not(po_classmethod in pd.procoptions) then
if is_javaclass(pd.struct) then
begin
include(pd.procoptions,po_virtualmethod);
include(pd.procoptions,po_finalmethod);
include(pd.procoptions,po_java_nonvirtual);
if not(po_virtualmethod in pd.procoptions) and
not(po_classmethod in pd.procoptions) then
begin
include(pd.procoptions,po_virtualmethod);
include(pd.procoptions,po_finalmethod);
include(pd.procoptions,po_java_nonvirtual);
end
else if [po_virtualmethod,po_classmethod]<=pd.procoptions then
begin
if po_staticmethod in pd.procoptions then
Message(type_e_java_class_method_not_static_virtual);
end;
end;
end;
{$endif}
end;
@ -1423,6 +1432,7 @@ implementation
add_missing_parent_constructors_intf(tobjectdef(current_structdef),vis_none);
{$ifdef jvm}
maybe_add_public_default_java_constructor(tobjectdef(current_structdef));
jvm_wrap_virtual_class_methods(tobjectdef(current_structdef));
{$endif}
end;
{ need method to hold the initialization code for typed constants? }

View File

@ -42,6 +42,8 @@ interface
procedure jvm_maybe_create_enum_class(const name: TIDString; def: tdef);
procedure jvm_create_procvar_class(const name: TIDString; def: tdef);
procedure jvm_wrap_virtual_class_methods(obj: tobjectdef);
function jvm_add_typed_const_initializer(csym: tconstsym): tstaticvarsym;
function jvm_wrap_method_with_vis(pd: tprocdef; vis: tvisibility): tprocdef;
@ -489,6 +491,76 @@ implementation
end;
procedure jvm_wrap_virtual_class_method(pd: tprocdef);
var
wrapperpd: tprocdef;
wrapperpv: tprocvardef;
typ: ttypesym;
begin
if (po_external in pd.procoptions) or
(oo_is_external in pd.struct.objectoptions) then
exit;
{ the JVM does not support virtual class methods -> we generate
wrappers with the original name so they can be called normally,
and these wrappers will then perform a dynamic lookup. To enable
calling the class method by its intended name from external Java code,
we have to change its external name so that we give that original
name to the wrapper function -> "switch" the external names around for
the original and wrapper methods }
{ wrapper is part of the same symtable as the original procdef }
symtablestack.push(pd.owner);
{ get a copy of the virtual class method }
wrapperpd:=tprocdef(pd.getcopy);
{ this one is not virtual nor override }
exclude(wrapperpd.procoptions,po_virtualmethod);
exclude(wrapperpd.procoptions,po_overridingmethod);
{ import/external name = name of original class method }
stringdispose(wrapperpd.import_name);
if not assigned(pd.import_name) then
wrapperpd.import_name:=stringdup(pd.procsym.realname)
else
wrapperpd.import_name:=stringdup(pd.import_name^);
include(wrapperpd.procoptions,po_has_importname);
{ replace importname of original procdef }
include(pd.procoptions,po_has_importname);
stringdispose(pd.import_name);
pd.import_name:=stringdup(wrapperpd.import_name^+'__fpcvirtualclassmethod__');
{ implementation }
wrapperpd.synthetickind:=tsk_jvm_virtual_clmethod;
{ associate with wrapper procsym (Pascal-level name = wrapper name ->
in callnodes, we will have to replace the calls to virtual class
methods with calls to the wrappers) }
finish_copied_procdef(wrapperpd,pd.import_name^,pd.owner,tabstractrecorddef(pd.owner.defowner));
{ also create procvar type that we can use in the implementation }
wrapperpv:=tprocvardef(pd.getcopyas(procvardef,pc_normal));
wrapperpv.calcparas;
jvm_create_procvar_class('__fpc_virtualclassmethod_pv_t'+tostr(wrapperpd.defid),wrapperpv);
{ create alias for the procvar type so we can use it in generated
Pascal code }
typ:=ttypesym.create('__fpc_virtualclassmethod_pv_t'+tostr(wrapperpd.defid),wrapperpv);
wrapperpv.classdef.typesym.visibility:=vis_strictprivate;
symtablestack.top.insert(typ);
wrapperpd.skpara:=pd;
symtablestack.pop(pd.owner);
end;
procedure jvm_wrap_virtual_class_methods(obj: tobjectdef);
var
i: longint;
def: tdef;
begin
for i:=0 to obj.symtable.deflist.count-1 do
begin
def:=tdef(obj.symtable.deflist[i]);
if def.typ<>procdef then
continue;
if [po_classmethod,po_virtualmethod]<=tprocdef(def).procoptions then
jvm_wrap_virtual_class_method(tprocdef(def))
end;
end;
function jvm_add_typed_const_initializer(csym: tconstsym): tstaticvarsym;
var
ssym: tstaticvarsym;

View File

@ -420,23 +420,12 @@ implementation
end;
procedure implement_callthrough(pd: tprocdef);
procedure addvisibibleparameters(var str: ansistring; pd: tprocdef);
var
str: ansistring;
callpd: tprocdef;
currpara: tparavarsym;
i: longint;
firstpara,
isclassmethod: boolean;
firstpara: boolean;
begin
isclassmethod:=
(po_classmethod in pd.procoptions) and
not(pd.proctypeoption in [potype_constructor,potype_destructor]);
callpd:=tprocdef(pd.skpara);
str:='begin ';
if pd.returndef<>voidtype then
str:=str+'result:=';
str:=str+callpd.procsym.realname+'(';
firstpara:=true;
for i:=0 to pd.paras.count-1 do
begin
@ -449,11 +438,31 @@ implementation
str:=str+currpara.realname;
end;
end;
end;
procedure implement_callthrough(pd: tprocdef);
var
str: ansistring;
callpd: tprocdef;
isclassmethod: boolean;
begin
isclassmethod:=
(po_classmethod in pd.procoptions) and
not(pd.proctypeoption in [potype_constructor,potype_destructor]);
callpd:=tprocdef(pd.skpara);
str:='begin ';
if pd.returndef<>voidtype then
str:=str+'result:=';
str:=str+callpd.procsym.realname+'(';
addvisibibleparameters(str,pd);
str:=str+') end;';
str_parse_method_impl(str,pd,isclassmethod);
end;
{$ifdef jvm}
procedure implement_jvm_enum_values(pd: tprocdef);
begin
str_parse_method_impl('begin result:=__fpc_FVALUES end;',pd,true);
@ -630,7 +639,6 @@ implementation
procedure implement_jvm_procvar_invoke(pd: tprocdef);
{$ifdef jvm}
var
pvclass: tobjectdef;
procvar: tprocvardef;
@ -639,11 +647,7 @@ implementation
paradef,boxdef,boxargdef: tdef;
i: longint;
firstpara: boolean;
{$endif jvm}
begin
{$ifndef jvm}
internalerror(2011072401);
{$else not jvm}
pvclass:=tobjectdef(pd.owner.defowner);
procvar:=tprocvardef(ttypesym(search_struct_member(pvclass,'__FPC_PROCVARALIAS')).typedef);
{ the procvar wrapper class has a tmethod member called "method", whose
@ -727,10 +731,28 @@ implementation
end;
str:=str+'])'+endstr+' end;';
str_parse_method_impl(str,pd,false)
{$endif not jvm}
end;
procedure implement_jvm_virtual_clmethod(pd: tprocdef);
var
str: ansistring;
callpd: tprocdef;
begin
callpd:=tprocdef(pd.skpara);
str:='var pv: __fpc_virtualclassmethod_pv_t'+tostr(pd.defid)+'; begin '
+ 'pv:=@'+callpd.procsym.RealName+';';
if (pd.proctypeoption<>potype_constructor) and
not is_void(pd.returndef) then
str:=str+'result:=';
str:=str+'pv(';
addvisibibleparameters(str,pd);
str:=str+') end;';
str_parse_method_impl(str,pd,true)
end;
{$endif jvm}
procedure add_synthetic_method_implementations_for_struct(struct: tabstractrecorddef);
var
i : longint;
@ -760,6 +782,7 @@ implementation
implement_empty(pd);
tsk_callthrough:
implement_callthrough(pd);
{$ifdef jvm}
tsk_jvm_enum_values:
implement_jvm_enum_values(pd);
tsk_jvm_enum_valueof:
@ -780,6 +803,9 @@ implementation
implement_jvm_enum_set2set(pd);
tsk_jvm_procvar_invoke:
implement_jvm_procvar_invoke(pd);
tsk_jvm_virtual_clmethod:
implement_jvm_virtual_clmethod(pd);
{$endif jvm}
else
internalerror(2011032801);
end;

View File

@ -527,7 +527,8 @@ interface
tsk_jvm_enum_long2set, // Java fpcLongToEnumSet function that returns an enumset corresponding to a bit pattern in a jlong
tsk_jvm_enum_bitset2set, // Java fpcBitSetToEnumSet function that returns an enumset corresponding to a BitSet
tsk_jvm_enum_set2Set, // Java fpcEnumSetToEnumSet function that returns an enumset corresponding to another enumset (different enum kind)
tsk_jvm_procvar_invoke // Java invoke method that calls a wrapped procvar
tsk_jvm_procvar_invoke, // Java invoke method that calls a wrapped procvar
tsk_jvm_virtual_clmethod // Java wrapper for virtual class method
);
{$ifdef oldregvars}