* reintegrated "blocks" branch. Adds support for calling C-style blocks with

global procedures and Object Pascal methods on Darwin platforms. Support
    for nested procedures will be added later on. For the syntax, see
    tests/test/tblock*.pp

git-svn-id: trunk@29517 -
This commit is contained in:
Jonas Maebe 2015-01-21 23:38:50 +00:00
commit 2f40fa7b33
34 changed files with 1377 additions and 380 deletions

7
.gitattributes vendored
View File

@ -138,6 +138,7 @@ compiler/avr/ravrstd.inc svneol=native#text/plain
compiler/avr/ravrsup.inc svneol=native#text/plain
compiler/avr/rgcpu.pas svneol=native#text/plain
compiler/avr/symcpu.pas svneol=native#text/plain
compiler/blockutl.pas svneol=native#text/plain
compiler/browcol.pas svneol=native#text/plain
compiler/bsdcompile -text
compiler/catch.pas svneol=native#text/plain
@ -8330,6 +8331,7 @@ rtl/i8086/strings.inc svneol=native#text/plain
rtl/i8086/stringss.inc svneol=native#text/plain
rtl/inc/aliases.inc svneol=native#text/plain
rtl/inc/astrings.inc svneol=native#text/plain
rtl/inc/blockrtl.pp svneol=native#text/plain
rtl/inc/cgeneric.inc svneol=native#text/plain
rtl/inc/cgenmath.inc svneol=native#text/plain
rtl/inc/cgenstr.inc svneol=native#text/plain
@ -11236,6 +11238,11 @@ tests/test/tasm8.pp svneol=native#text/plain
tests/test/tasmread.pp svneol=native#text/plain
tests/test/tasout.pp svneol=native#text/plain
tests/test/tassignmentoperator1.pp svneol=native#text/pascal
tests/test/tblock1.pp svneol=native#text/plain
tests/test/tblock1a.pp svneol=native#text/plain
tests/test/tblock1c.pp svneol=native#text/plain
tests/test/tblock2.pp svneol=native#text/plain
tests/test/tblock2a.pp svneol=native#text/plain
tests/test/tbopr.pp svneol=native#text/plain
tests/test/tbrtlevt.pp svneol=native#text/plain
tests/test/tbsx1.pp svneol=native#text/plain

385
compiler/blockutl.pas Normal file
View File

@ -0,0 +1,385 @@
{
Copyright (c) 2014 by Jonas Maebe, Member of the Free Pascal
development team.
This unit implements helper routines for "blocks" support
(http://en.wikipedia.org/wiki/Blocks_(C_language_extension) )
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 blockutl;
{$i fpcdefs.inc}
interface
uses
node,nld,ncnv,
symtype,symdef;
{ accepts a loadnode for a procdef
returns a node representing the converted code to implement this
conversion (this node is valid both for typed constant declarations and
in function bodies). The node is not reused }
function generate_block_for_procaddr(procloadnode: tloadnode): tnode;
{ for a procdef, return a recorddef representing a block literal for this
procdef
for a procvardef, return a basic recorddef representing a block literal
with enough info to call this procvardef }
function get_block_literal_type_for_proc(pd: tabstractprocdef): trecorddef;
implementation
uses
verbose,globtype,globals,cutils,constexp,
pass_1,pparautl,fmodule,
aasmdata,
nbas,ncon,nmem,nutils,
symbase,symconst,symtable,symsym,symcreat,objcutil,objcdef,defutil,
paramgr;
function get_block_literal_type_for_proc(pd: tabstractprocdef): trecorddef;
begin
if pd.typ=procvardef then
result:=trecorddef(search_named_unit_globaltype('BLOCKRTL','FPC_BLOCK_LITERAL_BASE',true).typedef)
else if pd.is_addressonly then
result:=trecorddef(search_named_unit_globaltype('BLOCKRTL','FPC_BLOCK_LITERAL_STATIC',true).typedef)
{ todo: nested functions and Objective-C methods }
else if not is_nested_pd(pd) and
not is_objcclass(tdef(pd.owner.defowner)) then
result:=trecorddef(search_named_unit_globaltype('BLOCKRTL','FPC_BLOCK_LITERAL_COMPLEX_PROCVAR',true).typedef)
else
internalerror(2014071304);
end;
function get_block_literal_isa(orgpd: tprocdef): tstaticvarsym;
var
srsym: tsym;
srsymtable: tsymtable;
name: tidstring;
begin
if orgpd.is_addressonly then
name:='_NSCONCRETEGLOBALBLOCK'
else
name:='_NSCONCRETESTACKBLOCK';
if not searchsym_in_named_module('BLOCKRTL',name,srsym,srsymtable) or
(srsym.typ<>staticvarsym) then
internalerror(2014071501);
result:=tstaticvarsym(srsym);
end;
function get_block_literal_flags(orgpd, invokepd: tprocdef): longint;
{ BlockLiteralFlags }
const
BLOCK_HAS_COPY_DISPOSE = 1 shl 25;
BLOCK_HAS_CXX_OBJ = 1 shl 26;
BLOCK_IS_GLOBAL = 1 shl 28;
BLOCK_USE_STRET = 1 shl 29;
BLOCK_HAS_SIGNATURE = 1 shl 30;
BLOCK_HAS_EXTENDED_LAYOUT = 1 shl 31;
begin
result:=0;
{ BLOCK_HAS_COPY_DISPOSE :
copy/dispose will be necessary once we support nested procedures, in
case they capture reference counted types, Objective-C class instances
or block-type variables
}
{ BLOCK_HAS_CXX_OBJ:
we don't support C++ (stack-based) class instances yet
}
{ BLOCK_IS_GLOBAL:
set in case the block does not capture any local state; used for
global functions and in theory also possible for nested functions that
do not access any variables from their parentfp context
}
if orgpd.is_addressonly then
result:=result or BLOCK_IS_GLOBAL;
{ BLOCK_USE_STRET:
set in case the invoke function returns its result via a hidden
parameter
}
if paramanager.ret_in_param(invokepd.returndef,orgpd) then
result:=result or BLOCK_USE_STRET;
{ BLOCK_HAS_SIGNATURE:
only if this bit is set, the above bit will actually be taken into
account (for backward compatibility). We need it so that our invoke
function isn't called as a variadic function, but on the downside this
requires Mac OS X 10.7 or later
}
result:=result or BLOCK_HAS_SIGNATURE;
{ BLOCK_HAS_EXTENDED_LAYOUT:
no documentation about what this means or what it's good for (clang
adds it for Objective-C 1 platforms in case garbage collection is
switched off, but then you also have to actually generate this layout)
}
end;
function get_block_literal_descriptor(invokepd: tprocdef; block_literal_size: tcgint): tstaticvarsym;
var
descriptordef: tdef;
descriptor: tstaticvarsym;
name: tsymstr;
srsym: tsym;
srsymtable: tsymtable;
begin
(*
FPC_Block_descriptor_simple = record
reserved: culong;
Block_size: culong;
{ signatures are only for the "ABI.2010.3.16" version, but that's all
we support because otherwise the callback has to be a C-style
variadic function, which we cannot (yet?) generate }
signature: pchar;
end;
*)
{ must be a valid Pascal identifier, because we will reference it when
constructing the block initialiser }
{ we don't have to include the moduleid in this mangledname, because
the invokepd is a local procedure in the current unit -> defid by
itself is unique }
name:='__FPC_BLOCK_DESCRIPTOR_SIMPLE_'+tostr(invokepd.defid);
{ already exists -> return }
if searchsym(name,srsym,srsymtable) then
begin
if srsym.typ<>staticvarsym then
internalerror(2014071402);
result:=tstaticvarsym(srsym);
exit;
end;
{ find the type of the descriptor structure }
descriptordef:=search_named_unit_globaltype('BLOCKRTL','FPC_BLOCK_DESCRIPTOR_SIMPLE',true).typedef;
{ create new static variable }
descriptor:=cstaticvarsym.create(name,vs_value,descriptordef,[]);
symtablestack.top.insert(descriptor);
include(descriptor.symoptions,sp_internal);
{ create typed constant for the descriptor }
str_parse_typedconst(current_asmdata.AsmLists[al_const],
'(reserved: 0; Block_size: '+tostr(block_literal_size)+
'; signature: '''+objcencodemethod(invokepd)+''');',descriptor);
result:=descriptor;
end;
{ creates a wrapper function for pd with the C calling convention and an
extra first parameter pointing to the block "self" pointer. This wrapper is
what will be assigned to the "invoke" field of the block }
function get_invoke_wrapper(orgpd: tprocdef; orgpv: tprocvardef): tprocdef;
var
wrappername: TIDString;
srsym: tsym;
srsymtable: tsymtable;
begin
{ the copy() is to ensure we don't overflow the maximum identifier length;
the combination of owner.moduleid and defid will make the name unique }
wrappername:='__FPC_BLOCK_INVOKE_'+upper(copy(orgpd.procsym.realname,1,60))+'_'+tostr(orgpd.owner.moduleid)+'_'+tostr(orgpd.defid);
{ already an invoke wrapper for this procsym -> reuse }
if searchsym(wrappername,srsym,srsymtable) then
begin
if (srsym.typ<>procsym) or
(tprocsym(srsym).procdeflist.count<>1) then
internalerror(2014071503);
result:=tprocdef(tprocsym(srsym).procdeflist[0]);
exit;
end;
{ bare copy, so that self etc are not inserted }
result:=tprocdef(orgpd.getcopyas(procdef,pc_bareproc));
{ will be called accoding to the ABI conventions }
result.proccalloption:=pocall_cdecl;
{ add po_is_block so that a block "self" pointer gets added (of the type
returned by get_block_literal_type_for_proc()) }
include(result.procoptions,po_is_block);
{ now insert self/vmt/funcret according to the newly set calling
convention }
insert_self_and_vmt_para(result);
insert_funcret_para(result);
finish_copied_procdef(result,wrappername,current_module.localsymtable,nil);
if orgpd.is_addressonly then
begin
result.synthetickind:=tsk_callthrough;
result.skpara:=orgpd;
end
else
begin
{ alias for the type to invoke the procvar, used in the symcreat
handling of tsk_block_invoke_procvar }
result.localst.insert(ctypesym.create('__FPC_BLOCK_INVOKE_PV_TYPE',orgpv));
result.synthetickind:=tsk_block_invoke_procvar;
end;
end;
{ compose a block literal for a static block (one without context) }
function get_global_proc_literal_sym(blockliteraldef: tdef; blockisasym: tstaticvarsym; blockflags: longint; invokepd: tprocdef; descriptor: tstaticvarsym): tstaticvarsym;
var
literalname: TIDString;
srsym: tsym;
srsymtable: tsymtable;
begin
literalname:='block_literal_for_'+invokepd.procsym.realname;
{ already exists -> return }
if searchsym(literalname,srsym,srsymtable) then
begin
if srsym.typ<>staticvarsym then
internalerror(2014071506);
result:=tstaticvarsym(srsym);
exit;
end;
{ create new block literal symbol }
result:=cstaticvarsym.create(
'$'+literalname,
vs_value,
blockliteraldef,[]);
include(result.symoptions,sp_internal);
symtablestack.top.insert(result);
{ initialise it }
str_parse_typedconst(current_asmdata.AsmLists[al_const],
'(base: (isa : @'+blockisasym.realname+
'; flags : '+tostr(blockflags)+
'; reserved : 0'+
'; invoke : @'+invokepd.procsym.realname+
'; descriptor: @'+descriptor.realname+
'));',
result);
end;
{ compose an on-stack block literal for a "procedure of object" }
function get_pascal_method_literal(blockliteraldef: tdef; blockisasym: tstaticvarsym; blockflags: longint; procvarnode: tnode; invokepd: tprocdef; orgpv: tprocvardef; descriptor: tstaticvarsym): tnode;
var
statement: tstatementnode;
literaltemp: ttempcreatenode;
begin
result:=internalstatements(statement);
{ create new block literal structure }
literaltemp:=ctempcreatenode.create(blockliteraldef,blockliteraldef.size,tt_persistent,false);
addstatement(statement,literaltemp);
{ temp.base.isa:=@blockisasym }
addstatement(statement,cassignmentnode.create(
genloadfield(genloadfield(ctemprefnode.create(literaltemp),'BASE'),'ISA'),
caddrnode.create(cloadnode.create(blockisasym,blockisasym.owner))));
{ temp.base.flags:=blockflags }
addstatement(statement,cassignmentnode.create(
genloadfield(genloadfield(ctemprefnode.create(literaltemp),'BASE'),'FLAGS'),
genintconstnode(blockflags)));
{ temp.base.reserved:=0 }
addstatement(statement,cassignmentnode.create(
genloadfield(genloadfield(ctemprefnode.create(literaltemp),'BASE'),'RESERVED'),
genintconstnode(0)));
{ temp.base.invoke:=tmethod(@invokepd) }
addstatement(statement,cassignmentnode.create(
genloadfield(genloadfield(ctemprefnode.create(literaltemp),'BASE'),'INVOKE'),
ctypeconvnode.create_proc_to_procvar(
cloadnode.create_procvar(invokepd.procsym,invokepd,invokepd.owner))));
{ temp.base.descriptor:=@descriptor }
addstatement(statement,cassignmentnode.create(
genloadfield(genloadfield(ctemprefnode.create(literaltemp),'BASE'),'DESCRIPTOR'),
caddrnode.create(cloadnode.create(descriptor,descriptor.owner))));
{ temp.pv:=tmethod(@orgpd) }
addstatement(statement,cassignmentnode.create(
ctypeconvnode.create_explicit(genloadfield(ctemprefnode.create(literaltemp),'PV'),orgpv),
procvarnode.getcopy));
{ and return the address of the temp }
addstatement(statement,caddrnode.create(ctemprefnode.create(literaltemp)));
{ typecheck this now, because the current source may be written in TP/
Delphi/MacPas mode and the above node tree has been constructed for
ObjFPC mode, which has been set by replace_scanner (in Delphi, the
assignment to invoke would be without the proc_to_procvar conversion) }
typecheckpass(result);
end;
function generate_block_for_procaddr(procloadnode: tloadnode): tnode;
var
procvarnode: tnode;
{ procvardef representing the original function we want to invoke }
orgpv: tprocvardef;
{ procdef of the original function we want to invoke }
orgpd,
{ procdef for the invoke-wrapper that we generated to call the original
function via a procvar }
invokepd: tprocdef;
blockliteraldef: tdef;
descriptor,
blockisasym,
blockliteralsym: tstaticvarsym;
blockflags: longint;
old_symtablestack: tsymtablestack;
sstate: tscannerstate;
begin
result:=nil;
{ supported? (should be caught earlier) }
if (procloadnode.resultdef.typ<>procdef) or
is_nested_pd(tprocdef(procloadnode.resultdef)) or
is_objcclass(tdef(procloadnode.resultdef.owner.defowner)) then
internalerror(2014071401);
{ add every symbol that we create here to the unit-level symbol table }
old_symtablestack:=symtablestack;
symtablestack:=old_symtablestack.getcopyuntil(current_module.localsymtable);
{ save scanner state }
replace_scanner('block literal creation',sstate);
{ def representing the original function }
orgpd:=tprocdef(procloadnode.resultdef);
{ def representing the corresponding procvar type }
procvarnode:=ctypeconvnode.create_proc_to_procvar(procloadnode.getcopy);
typecheckpass(procvarnode);
orgpv:=tprocvardef(procvarnode.resultdef);
{ get blockdef for this kind of procdef }
blockliteraldef:=get_block_literal_type_for_proc(orgpd);
{ get the invoke wrapper }
invokepd:=get_invoke_wrapper(orgpd,orgpv);
{ get the descriptor }
descriptor:=get_block_literal_descriptor(invokepd,blockliteraldef.size);
{ get the ISA pointer for the literal }
blockisasym:=get_block_literal_isa(orgpd);
{ get the flags for the block }
blockflags:=get_block_literal_flags(orgpd,invokepd);
{ global/simple procedure -> block literal is a typed constant }
if orgpd.is_addressonly then
begin
blockliteralsym:=get_global_proc_literal_sym(blockliteraldef,blockisasym,blockflags,invokepd,descriptor);
{ result: address of the block literal }
result:=caddrnode.create(cloadnode.create(blockliteralsym,blockliteralsym.owner));
end
else
begin
result:=get_pascal_method_literal(blockliteraldef,blockisasym,blockflags,procvarnode,invokepd,orgpv,descriptor)
end;
procvarnode.free;
{ restore scanner }
restore_scanner(sstate);
{ restore symtable stack }
symtablestack.free;
symtablestack:=old_symtablestack;
end;
end.

View File

@ -1533,6 +1533,10 @@ implementation
begin
{ procvar -> procvar }
eq:=proc_to_procvar_equal(tprocvardef(def_from),tprocvardef(def_to),cdo_warn_incompatible_univ in cdoptions);
if eq<te_equal then
doconv:=tc_proc_2_procvar
else
doconv:=tc_equal;
end;
pointerdef :
begin
@ -2176,30 +2180,38 @@ implementation
if not(assigned(def1)) or not(assigned(def2)) then
exit;
{ check for method pointer and local procedure pointer:
a) if one is a procedure of object, the other also has to be one
b) if one is a pure address, the other also has to be one
a) anything but procvars can be assigned to blocks
b) if one is a procedure of object, the other also has to be one
(except for block)
c) if one is a pure address, the other also has to be one
except if def1 is a global proc and def2 is a nested procdef
(global procedures can be converted into nested procvars)
c) if def1 is a nested procedure, then def2 has to be a nested
d) if def1 is a nested procedure, then def2 has to be a nested
procvar and def1 has to have the po_delphi_nested_cc option
d) if def1 is a procvar, def1 and def2 both have to be nested or
e) if def1 is a procvar, def1 and def2 both have to be nested or
non-nested (we don't allow assignments from non-nested to
nested procvars to make sure that we can still implement
nested procvars using trampolines -- e.g., this would be
necessary for LLVM or CIL as long as they do not have support
for Delphi-style frame pointer parameter passing) }
if (def1.is_methodpointer<>def2.is_methodpointer) or { a) }
((def1.is_addressonly<>def2.is_addressonly) and { b) }
if is_block(def2) then { a) }
{ can't explicitly check against procvars here, because
def1 may already be a procvar due to a proc_to_procvar;
this is checked in the type conversion node itself -> ok }
else if (def1.is_methodpointer<>def2.is_methodpointer) or { b) }
((def1.is_addressonly<>def2.is_addressonly) and { c) }
(is_nested_pd(def1) or
not is_nested_pd(def2))) or
((def1.typ=procdef) and { c) }
((def1.typ=procdef) and { d) }
is_nested_pd(def1) and
(not(po_delphi_nested_cc in def1.procoptions) or
not is_nested_pd(def2))) or
((def1.typ=procvardef) and { d) }
((def1.typ=procvardef) and { e) }
(is_nested_pd(def1)<>is_nested_pd(def2))) then
exit;
pa_comp:=[cpo_ignoreframepointer];
if is_block(def2) then
include(pa_comp,cpo_ignorehidden);
if checkincompatibleuniv then
include(pa_comp,cpo_warn_incompatible_univ);
{ check return value and options, methodpointer is already checked }
@ -2209,7 +2221,10 @@ implementation
include(po_comp,po_staticmethod);
if (m_delphi in current_settings.modeswitches) then
exclude(po_comp,po_varargs);
if (def1.proccalloption=def2.proccalloption) and
{ for blocks, the calling convention doesn't matter because we have to
generate a wrapper anyway }
if ((po_is_block in def2.procoptions) or
(def1.proccalloption=def2.proccalloption)) and
((po_comp * def1.procoptions)= (po_comp * def2.procoptions)) and
equal_defs(def1.returndef,def2.returndef) then
begin
@ -2224,6 +2239,9 @@ implementation
{ prefer non-nested to non-nested over non-nested to nested }
if (is_nested_pd(def1)<>is_nested_pd(def2)) then
eq:=te_convert_l1;
{ in case of non-block to block, we need a type conversion }
if (po_is_block in def1.procoptions) <> (po_is_block in def2.procoptions) then
eq:=te_convert_l1;
end;
proc_to_procvar_equal:=eq;
end;

View File

@ -331,6 +331,9 @@ interface
{ returns true of def is a methodpointer }
function is_methodpointer(def : tdef) : boolean;
{ returns true if def is a C "block" }
function is_block(def: tdef): boolean;
implementation
uses
@ -1425,4 +1428,10 @@ implementation
result:=(def.typ=procvardef) and (po_methodpointer in tprocvardef(def).procoptions);
end;
function is_block(def: tdef): boolean;
begin
result:=(def.typ=procvardef) and (po_is_block in tprocvardef(def).procoptions)
end;
end.

View File

@ -400,8 +400,9 @@ interface
fields in Java) }
m_default_unicodestring, { makes the default string type in $h+ mode unicodestring rather than
ansistring; similarly, char becomes unicodechar rather than ansichar }
m_type_helpers { allows the declaration of "type helper" (non-Delphi) or "record helper"
m_type_helpers, { allows the declaration of "type helper" (non-Delphi) or "record helper"
(Delphi) for primitive types }
m_blocks { support for http://en.wikipedia.org/wiki/Blocks_(C_language_extension) }
);
tmodeswitches = set of tmodeswitch;
@ -566,7 +567,8 @@ interface
'SYSTEMCODEPAGE',
'FINALFIELDS',
'UNICODESTRINGS',
'TYPEHELPERS');
'TYPEHELPERS',
'BLOCKS');
type

View File

@ -1538,7 +1538,7 @@ parser_e_global_generic_references_static=03339_E_Global Generic template refere
%
# Type Checking
#
# 04122 is the last used one
# 04123 is the last used one
#
% \section{Type checking errors}
% This section lists all errors that can occur when type checking is
@ -1846,13 +1846,13 @@ type_w_zero_to_nil=04090_W_Converting 0 to NIL
% Use NIL rather than 0 when initialising a pointer.
type_e_protocol_type_expected=04091_E_Objective-C protocol type expected, but got "$1"
% The compiler expected a protocol type name, but found something else.
type_e_objc_type_unsupported=04092_E_The type "$1" is not supported for interaction with the Objective-C runtime.
% Objective-C makes extensive use of run time type information (RTTI). This format
type_e_objc_type_unsupported=04092_E_The type "$1" is not supported for interaction with the Objective-C and the blocks runtime.
% Objective-C and Blocks make extensive use of run time type information (RTTI). This format
% is defined by the maintainers of the run time and can therefore not be adapted
% to all possible Object Pascal types. In particular, types that depend on
% reference counting by the compiler (such as ansistrings and certain kinds of
% interfaces) cannot be used as fields of Objective-C classes, cannot be
% directly passed to Objective-C methods, and cannot be encoded using \var{objc\_encode}.
% directly passed to Objective-C methods or Blocks, and cannot be encoded using \var{objc\_encode}.
type_e_class_or_objcclass_type_expected=04093_E_Class or objcclass type expected, but got "$1"
% It is only possible to create class reference types of \var{class} and \var{objcclass}
type_e_objcclass_type_expected=04094_E_Objcclass type expected
@ -1968,6 +1968,13 @@ type_e_procedure_must_be_far=04121_E_Procedure or function must be far in order
type_w_instance_abstract_class=04122_W_Creating an instance of abstract class "$1"
% The specified class is declared as \var{abstract} and thus no instance of this class
% should be created. This is merely a warning for Delphi compatibility.
type_e_function_reference_kind=04123_E_Subroutine references cannot be declared as "of object" or "is nested", they can always refer to any kind of subroutine
% Subroutine references can refer to any kind of subroutine and hence do not
% require specialisation for methods or nested subroutines.
type_e_anonymous_function_unsupported=04999_E_Function references are not yet supported, only blocks (add "cdecl;" at the end)
% Remove this error message once Delphi-style anonymous are implemented. It has
% number 4999 so as not to result in a gap in the error message numbering once
% it's removed.
% \end{description}
#
# Symtable

View File

@ -554,6 +554,8 @@ const
type_e_type_not_allowed_for_type_helper=04120;
type_e_procedure_must_be_far=04121;
type_w_instance_abstract_class=04122;
type_e_function_reference_kind=04123;
type_e_anonymous_function_unsupported=04999;
sym_e_id_not_found=05000;
sym_f_internal_error_in_symtablestack=05001;
sym_e_duplicate_id=05002;
@ -1004,9 +1006,9 @@ const
option_info=11024;
option_help_pages=11025;
MsgTxtSize = 74721;
MsgTxtSize = 74953;
MsgIdxMax : array[1..20] of longint=(
26,99,340,123,96,57,126,29,202,64,
26,99,340,1000,96,57,126,29,202,64,
58,20,1,1,1,1,1,1,1,1
);

File diff suppressed because it is too large Load Diff

View File

@ -69,6 +69,7 @@ interface
function gen_procvar_context_tree_parentfp:tnode;
function gen_self_tree:tnode;
function gen_vmt_tree:tnode;
function gen_block_context:tnode;
procedure gen_hidden_parameters;
function funcret_can_be_reused:boolean;
procedure maybe_create_funcret_node;
@ -2343,6 +2344,13 @@ implementation
end;
function tcallnode.gen_block_context: tnode;
begin
{ the self parameter of a block invocation is that address of the
block literal (which is what right contains) }
result:=right.getcopy;
end;
function check_funcret_used_as_para(var n: tnode; arg: pointer): foreachnoderesult;
var
@ -2573,8 +2581,10 @@ implementation
else
internalerror(200309287);
end
else if not(po_is_block in procdefinition.procoptions) then
para.left:=gen_procvar_context_tree_parentfp
else
para.left:=gen_procvar_context_tree_parentfp;
para.left:=gen_block_context
end
else
if vo_is_range_check in para.parasym.varoptions then

View File

@ -28,7 +28,7 @@ interface
uses
cpubase,
globtype,
parabase,cgutils,
parabase,cgbase,cgutils,
symdef,node,ncal;
type
@ -95,6 +95,8 @@ interface
function can_call_ref(var ref: treference):boolean;virtual;
procedure extra_call_ref_code(var ref: treference);virtual;
procedure do_call_ref(ref: treference);virtual;
procedure load_block_invoke(toreg: tregister);virtual;
public
procedure pass_generate_code;override;
destructor destroy;override;
@ -107,11 +109,11 @@ implementation
systems,
cutils,verbose,globals,
cpuinfo,
symconst,symtable,symtype,defutil,paramgr,
cgbase,pass_2,
symconst,symbase,symtable,symtype,symsym,defutil,paramgr,
pass_2,
aasmbase,aasmtai,aasmdata,
nbas,nmem,nld,ncnv,nutils,
ncgutil,
ncgutil,blockutl,
cgobj,tgobj,hlcgobj,
procinfo,
wpobase;
@ -449,6 +451,26 @@ implementation
end;
procedure tcgcallnode.load_block_invoke(toreg: tregister);
var
href: treference;
srsym: tsym;
srsymtable: tsymtable;
literaldef: trecorddef;
begin
literaldef:=get_block_literal_type_for_proc(tabstractprocdef(right.resultdef));
hlcg.location_force_reg(current_asmdata.CurrAsmList,right.location,right.resultdef,getpointerdef(literaldef),true);
{ load the invoke pointer }
hlcg.reference_reset_base(href,right.resultdef,right.location.register,0,right.resultdef.alignment);
if not searchsym_in_record(literaldef,'INVOKE',srsym,srsymtable) or
(srsym.typ<>fieldvarsym) or
(tfieldvarsym(srsym).vardef<>voidpointertype) then
internalerror(2014071506);
href.offset:=tfieldvarsym(srsym).fieldoffset;
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,tfieldvarsym(srsym).vardef,procdefinition,href,toreg);
end;
procedure tcgcallnode.set_result_location(realresdef: tstoreddef);
begin
if realresdef.is_intregable or
@ -1007,7 +1029,9 @@ implementation
pvreg:=cg.getintregister(current_asmdata.CurrAsmList,proc_addr_size);
{ Only load OS_ADDR from the reference (when converting to hlcg:
watch out with procedure of object) }
if right.location.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
if po_is_block in procdefinition.procoptions then
load_block_invoke(pvreg)
else if right.location.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
begin
href:=right.location.reference;
callref:=can_call_ref(href);

View File

@ -296,7 +296,7 @@ implementation
symconst,symdef,symsym,symcpu,symtable,
ncon,ncal,nset,nadd,nmem,nmat,nbas,nutils,ninl,
cgbase,procinfo,
htypechk,pass_1,cpuinfo;
htypechk,blockutl,pass_1,cpuinfo;
{*****************************************************************************
@ -1992,6 +1992,7 @@ implementation
function ttypeconvnode.typecheck_proc_to_procvar : tnode;
var
pd : tabstractprocdef;
source: pnode;
begin
result:=nil;
pd:=tabstractprocdef(left.resultdef);
@ -2002,7 +2003,36 @@ implementation
real procvartype that we are converting to) }
if assigned(totypedef) and
(totypedef.typ=procvardef) then
resultdef:=totypedef
begin
{ have to do this in typecheckpass so that it's triggered for
typed constant declarations }
if po_is_block in tprocvardef(totypedef).procoptions then
begin
{ can only convert from procdef to procvardef, but in the mean
time other type conversions may have been inserted (pointers,
proc2procvar, ...) }
source:=actualtargetnode(@left);
while (source^.nodetype=typeconvn) and
(ttypeconvnode(source^).convtype=tc_proc_2_procvar) and
(is_void(source^.resultdef) or
(source^.resultdef.typ=procvardef)) do
begin
{ won't skip proc2procvar }
source:=actualtargetnode(@ttypeconvnode(source^).left);
end;
if (source^.nodetype=loadn) and
(source^.resultdef.typ=procdef) and
not is_nested_pd(tprocdef(source^.resultdef)) and
not is_objcclass(tdef(source^.resultdef.owner.defowner)) then
begin
result:=generate_block_for_procaddr(tloadnode(source^));
exit;
end
else
CGMessage2(type_e_illegal_type_conversion,left.resultdef.typename,resultdef.typename);
end;
resultdef:=totypedef;
end
else
begin
resultdef:=pd.getcopyas(procvardef,pc_normal);
@ -2241,7 +2271,9 @@ implementation
the procvar, is compatible with the procvar's type }
if not(nf_explicit in flags) and
(proc_to_procvar_equal(currprocdef,tprocvardef(resultdef),false)=te_incompatible) then
IncompatibleTypes(left.resultdef,resultdef);
IncompatibleTypes(left.resultdef,resultdef)
else
result:=typecheck_call_helper(convtype);
exit;
end
else if maybe_global_proc_to_nested(left,resultdef) then

View File

@ -1237,6 +1237,8 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis
var
tmpn,n : tnode;
pd : tprocdef;
havepd,
haveblock: boolean;
begin
{ Procvars and pointers are no longer compatible. }
{ under tp: =nil or =var under fpc: =nil or =@var }
@ -1287,17 +1289,33 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis
n:=tmpn;
end;
{ we now need to have a loadn with a procsym }
if (n.nodetype=loadn) and
(tloadnode(n).symtableentry.typ=procsym) then
havepd:=
(n.nodetype=loadn) and
(tloadnode(n).symtableentry.typ=procsym);
{ or a staticvarsym representing a block }
haveblock:=
(n.nodetype=loadn) and
(tloadnode(n).symtableentry.typ=staticvarsym) and
(sp_internal in tloadnode(n).symtableentry.symoptions);
if havepd or
haveblock then
begin
pd:=tloadnode(n).procdef;
list.concat(Tai_const.createname(pd.mangledname,0));
if havepd then
begin
pd:=tloadnode(n).procdef;
list.concat(Tai_const.createname(pd.mangledname,0));
end
else
begin
list.concat(Tai_const.Createname(tstaticvarsym(tloadnode(n).symtableentry).mangledname,0));
end;
{ nested procvar typed consts can only be initialised with nil
(checked above) or with a global procedure (checked here),
because in other cases we need a valid frame pointer }
if is_nested_pd(def) then
begin
if is_nested_pd(pd) then
if haveblock or
is_nested_pd(pd) then
Message(parser_e_no_procvarnested_const);
list.concat(Tai_const.Create_sym(nil));
end

View File

@ -371,7 +371,10 @@ implementation
end;
end;
procvardef :
encodedstr:=encodedstr+'^?';
if not(po_is_block in tprocvardef(def).procoptions) then
encodedstr:=encodedstr+'^?'
else
encodedstr:=encodedstr+'@?';
objectdef :
case tobjectdef(def).objecttype of
odt_helper,

View File

@ -40,7 +40,7 @@ interface
{ Encode a method's parameters and result type into the format used by the
run time (for generating protocol and class rtti). }
function objcencodemethod(pd: tprocdef): ansistring;
function objcencodemethod(pd: tabstractprocdef): ansistring;
{ Exports all assembler symbols related to the obj-c class }
procedure exportobjcclass(def: tobjectdef);
@ -196,7 +196,7 @@ end;
end;
function objcencodemethod(pd: tprocdef): ansistring;
function objcencodemethod(pd: tabstractprocdef): ansistring;
var
parasize,
totalsize: aint;
@ -230,7 +230,11 @@ end;
(vs.varspez in [vs_var,vs_out,vs_constref]) then
result:=result+'^';
{ Add the parameter type. }
if not objcaddencodedtype(vs.vardef,ris_initial,false,result,founderror) then
if (vo_is_parentfp in vs.varoptions) and
(po_is_block in pd.procoptions) then
{ special case: self parameter of block procvars has to be @? }
result:=result+'@?'
else if not objcaddencodedtype(vs.vardef,ris_initial,false,result,founderror) then
{ should be checked earlier on }
internalerror(2009081701);
{ And the total size of the parameters coming before this one

View File

@ -787,6 +787,28 @@ implementation
consume(_SEMICOLON);
end;
parse_var_proc_directives(tsym(newtype));
if po_is_function_ref in tprocvardef(hdef).procoptions then
begin
{ these always support everything, no "of object" or
"is_nested" is allowed }
if is_nested_pd(tprocvardef(hdef)) or
is_methodpointer(hdef) then
cgmessage(type_e_function_reference_kind)
else
begin
if (po_hascallingconvention in tprocvardef(hdef).procoptions) and
(tprocvardef(hdef).proccalloption=pocall_cdecl) then
begin
include(tprocvardef(hdef).procoptions,po_is_block);
{ can't check yet whether the parameter types
are valid for a block, since some of them
may still be forwarddefs }
end
else
{ a regular anonymous function type: not yet supported }
cgmessage(type_e_anonymous_function_unsupported);
end
end;
handle_calling_convention(tprocvardef(hdef));
if try_consume_hintdirective(newtype.symoptions,newtype.deprecatedmsg) then
consume(_SEMICOLON);

View File

@ -348,6 +348,10 @@ implementation
if m_iso in current_settings.modeswitches then
AddUnit('iso7185');
{ blocks support? }
if m_blocks in current_settings.modeswitches then
AddUnit('blockrtl');
{ default char=widechar? }
if m_default_unicodestring in current_settings.modeswitches then
AddUnit('uuchar');

View File

@ -39,7 +39,7 @@ implementation
uses
globals,globtype,verbose,systems,
symconst,symtype,symbase,symsym,symtable,symcreat,defutil,
symconst,symtype,symbase,symsym,symtable,symcreat,defutil,blockutl,
paramgr;
@ -176,6 +176,31 @@ implementation
vs:=cparavarsym.create('$self',paranr_self,vs_value,voidpointertype,[vo_is_self,vo_is_hidden_para]);
pd.parast.insert(vs);
end
{ while only procvardefs of this type can be declared in Pascal code,
internally we also generate procdefs of this type when creating
block wrappers }
else if (po_is_block in pd.procoptions) then
begin
{ generate the first hidden parameter, which is a so-called "block
literal" describing the block and containing its invocation
procedure }
hdef:=getpointerdef(get_block_literal_type_for_proc(pd));
{ mark as vo_is_parentfp so that proc2procvar comparisons will
succeed when assigning arbitrary routines to the block }
vs:=cparavarsym.create('$_block_literal',paranr_blockselfpara,vs_value,
hdef,[vo_is_hidden_para,vo_is_parentfp]
);
pd.parast.insert(vs);
if pd.typ=procdef then
begin
{ make accessible to code }
sl:=tpropaccesslist.create;
sl.addsym(sl_load,vs);
aliasvs:=cabsolutevarsym.create_ref('FPC_BLOCK_SELF',hdef,sl);
include(aliasvs.varoptions,vo_is_parentfp);
tlocalsymtable(tprocdef(pd).localst).insert(aliasvs);
end;
end
else
begin
if (pd.typ=procdef) and

View File

@ -73,7 +73,7 @@ implementation
paramgr,procinfo,
{ symtable }
symconst,symsym,symtable,symcreat,
defutil,defcmp,
defutil,defcmp,objcdef,
{$ifdef jvm}
jvmdef,
{$endif}
@ -1795,6 +1795,43 @@ implementation
jvm_create_procvar_class(name,def);
{$endif}
end;
_ID:
begin
case idtoken of
_HELPER:
begin
if hadtypetoken and
{ don't allow "type helper" in mode delphi and require modeswitch typehelpers }
([m_delphi,m_type_helpers]*current_settings.modeswitches=[m_type_helpers]) then
begin
{ reset hadtypetoken, so that calling code knows that it should not be handled
as a "unique" type }
hadtypetoken:=false;
consume(_HELPER);
def:=object_dec(odt_helper,name,newsym,genericdef,genericlist,nil,ht_type);
end
else
expr_type
end;
_REFERENCE:
begin
if m_blocks in current_settings.modeswitches then
begin
consume(_REFERENCE);
consume(_TO);
def:=procvar_dec(genericdef,genericlist);
{ could be errordef in case of a syntax error }
if assigned(def) and
(def.typ=procvardef) then
include(tprocvardef(def).procoptions,po_is_function_ref);
end
else
expr_type;
end;
else
expr_type;
end;
end
else
if (token=_KLAMMERAFFE) and (m_iso in current_settings.modeswitches) then
begin
@ -1805,19 +1842,7 @@ implementation
current_module.checkforwarddefs.add(def);
end
else
if hadtypetoken and
{ don't allow "type helper" in mode delphi and require modeswitch typehelpers }
([m_delphi,m_type_helpers]*current_settings.modeswitches=[m_type_helpers]) and
(token=_ID) and (idtoken=_HELPER) then
begin
{ reset hadtypetoken, so that calling code knows that it should not be handled
as a "unique" type }
hadtypetoken:=false;
consume(_HELPER);
def:=object_dec(odt_helper,name,newsym,genericdef,genericlist,nil,ht_type);
end
else
expr_type;
expr_type;
end;
if def=nil then

View File

@ -602,6 +602,15 @@ implementation
break;
end;
{ Blocks supported? }
if doinclude and
(i = m_blocks) and
not(target_info.system in systems_blocks_supported) then
begin
Message1(option_unsupported_target_for_feature,'Blocks');
break;
end;
if changeInit then
current_settings.modeswitches:=init_settings.modeswitches;
Result:=true;

View File

@ -113,16 +113,17 @@ const
{ implicit parameter positions, normal parameters start at 10
and will increase with 10 for each parameter. The high parameters
will be inserted with n+1 }
paranr_parentfp = 1;
paranr_parentfp_delphi_cc_leftright = 1;
paranr_self = 2;
paranr_result = 3;
paranr_vmt = 4;
paranr_blockselfpara = 1;
paranr_parentfp = 2;
paranr_parentfp_delphi_cc_leftright = 2;
paranr_self = 3;
paranr_result = 4;
paranr_vmt = 5;
{ the implicit parameters for Objective-C methods need to come
after the hidden result parameter }
paranr_objc_self = 4;
paranr_objc_cmd = 5;
paranr_objc_self = 5;
paranr_objc_cmd = 6;
{ Required to support variations of syscalls on MorphOS }
paranr_syscall_basesysv = 9;
paranr_syscall_sysvbase = high(word)-5;
@ -355,7 +356,11 @@ type
{ procedure is far (x86 only) }
po_far,
{ the procedure never returns, this information is usefull for dfa }
po_noreturn
po_noreturn,
{ procvar is a function reference }
po_is_function_ref,
{ procvar is a block (http://en.wikipedia.org/wiki/Blocks_(C_language_extension) ) }
po_is_block
);
tprocoptions=set of tprocoption;
@ -393,7 +398,8 @@ type
tsk_jvm_procvar_intconstr, // Java procvar class constructor that accepts an interface instance for easy Java interoperation
tsk_jvm_virtual_clmethod, // Java wrapper for virtual class method
tsk_field_getter, // getter for a field (callthrough property is passed in skpara)
tsk_field_setter // Setter for a field (callthrough property is passed in skpara)
tsk_field_setter, // Setter for a field (callthrough property is passed in skpara)
tsk_block_invoke_procvar // Call a procvar to invoke inside a block
);
{ options for objects and classes }
@ -762,6 +768,9 @@ inherited_objectoptions : tobjectoptions = [oo_has_virtual,oo_has_private,oo_has
vararray = $2000;
varbyref = $4000;
{ blocks-related constants }
blocks_procvar_invoke_type_name = '__FPC_invoke_pvtype';
implementation
end.

View File

@ -916,6 +916,20 @@ implementation
end;
procedure implement_block_invoke_procvar(pd: tprocdef);
var
str: ansistring;
begin
str:='';
str:='begin ';
if pd.returndef<>voidtype then
str:=str+'result:=';
str:=str+'__FPC_BLOCK_INVOKE_PV_TYPE(PFPC_Block_literal_complex_procvar(FPC_Block_Self)^.pv)(';
addvisibibleparameters(str,pd);
str:=str+') end;';
str_parse_method_impl(str,pd,false);
end;
procedure add_synthetic_method_implementations_for_st(st: tsymtable);
var
i : longint;
@ -986,6 +1000,8 @@ implementation
implement_field_getter(pd);
tsk_field_setter:
implement_field_setter(pd);
tsk_block_invoke_procvar:
implement_block_invoke_procvar(pd);
else
internalerror(2011032801);
end;
@ -999,9 +1015,6 @@ implementation
def: tdef;
sstate: tscannerstate;
begin
{ only necessary for the JVM target currently }
if not (target_info.system in systems_jvm) then
exit;
{ skip if any errors have occurred, since then this can only cause more
errors }
if ErrorCount<>0 then

View File

@ -5243,7 +5243,9 @@ implementation
not(is_void(returndef)) then
s:=s+':'+returndef.GetTypeName;
if owner.symtabletype=localsymtable then
s:=s+' is nested';
s:=s+' is nested'
else if po_is_block in procoptions then
s:=s+' is block';
s:=s+';';
{ forced calling convention? }
if (po_hascallingconvention in procoptions) then
@ -5885,7 +5887,11 @@ implementation
s := s+' of object';
if is_nested_pd(self) then
s := s+' is nested';
GetTypeName := s+';'+ProcCallOptionStr[proccalloption]+'>';
{ calling convention doesn't matter for blocks }
if po_is_block in procoptions then
GetTypeName := s+' is block;'
else
GetTypeName := s+';'+ProcCallOptionStr[proccalloption]+'>';
end;

View File

@ -43,6 +43,7 @@ interface
init_final_check_done : boolean;
procedure _needs_init_final(sym:TObject;arg:pointer);
procedure check_forward(sym:TObject;arg:pointer);
procedure check_block_valid(def: TObject;arg:pointer);
procedure labeldefined(sym:TObject;arg:pointer);
procedure varsymbolused(sym:TObject;arg:pointer);
procedure TestPrivate(sym:TObject;arg:pointer);
@ -360,7 +361,7 @@ implementation
{ global }
verbose,globals,
{ symtable }
symutil,defutil,defcmp,
symutil,defutil,defcmp,objcdef,
{ module }
fmodule,
{ codegen }
@ -656,6 +657,21 @@ implementation
end;
procedure tstoredsymtable.check_block_valid(def: TObject; arg: pointer);
var
founderrordef: tdef;
begin
{ all parameters passed to a block must be handled by the Objective-C
runtime }
if is_block(tdef(def)) and
not objcchecktype(tdef(def),founderrordef) then
if assigned(tdef(def).typesym) then
MessagePos1(tdef(def).typesym.fileinfo,type_e_objc_type_unsupported,founderrordef.typename)
else
Message1(type_e_objc_type_unsupported,tprocvardef(def).typename)
end;
procedure TStoredSymtable.labeldefined(sym:TObject;arg:pointer);
begin
if (tsym(sym).typ=labelsym) and
@ -800,6 +816,9 @@ implementation
procedure tstoredsymtable.check_forwards;
begin
SymList.ForEachCall(@check_forward,nil);
{ check whether all block definitions contain valid Objective-C types
(now that all forward definitions have been resolved) }
DefList.ForEachCall(@check_block_valid,nil);
end;

View File

@ -287,6 +287,9 @@ interface
{ systems using the non-fragile Objective-C ABI }
systems_objc_nfabi = [system_powerpc64_darwin,system_x86_64_darwin,system_arm_darwin,system_i386_iphonesim];
{ systems supporting "blocks" }
systems_blocks_supported = systems_darwin;
{ all systems supporting exports from programs or units }
systems_unit_program_exports = [system_i386_win32,
system_i386_wdosx,

View File

@ -258,6 +258,7 @@ type
_PROCEDURE,
_PROTECTED,
_PUBLISHED,
_REFERENCE,
_SOFTFLOAT,
_THREADVAR,
_WRITEONLY,
@ -577,6 +578,7 @@ const
(str:'PROCEDURE' ;special:false;keyword:alllanguagemodes;op:NOTOKEN),
(str:'PROTECTED' ;special:false;keyword:[m_none];op:NOTOKEN),
(str:'PUBLISHED' ;special:false;keyword:[m_none];op:NOTOKEN),
(str:'REFERENCE' ;special:false;keyword:[m_none];op:NOTOKEN),
(str:'SOFTFLOAT' ;special:false;keyword:[m_none];op:NOTOKEN),
(str:'THREADVAR' ;special:false;keyword:alllanguagemodes-[m_iso];op:NOTOKEN),
(str:'WRITEONLY' ;special:false;keyword:[m_none];op:NOTOKEN),

View File

@ -463,7 +463,7 @@ const
'jvm enum fpcvalueof', 'jvm enum long2set',
'jvm enum bitset2set', 'jvm enum set2set',
'jvm procvar invoke', 'jvm procvar intf constructor',
'jvm virtual class method', 'jvm field getter', 'jvm field setter');
'jvm virtual class method', 'jvm field getter', 'jvm field setter', 'block invoke');
begin
if w<=ord(high(syntheticName)) then
result:=syntheticName[tsynthetickind(w)]
@ -1755,7 +1755,9 @@ const
(mask:po_rtlproc; str: 'RTL procedure'),
(mask:po_auto_raised_visibility; str: 'Visibility raised by compiler'),
(mask:po_far; str: 'Far'),
(mask:po_noreturn; str: 'No return')
(mask:po_noreturn; str: 'No return'),
(mask:po_is_function_ref; str: 'Function reference'),
(mask:po_is_block; str: 'C "Block"')
);
var
proctypeoption : tproctypeoption;

View File

@ -359,235 +359,235 @@ ifndef USELIBGGI
USELIBGGI=NO
endif
ifeq ($(FULL_TARGET),i386-linux)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-go32v2)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-win32)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-os2)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-freebsd)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-beos)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-haiku)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-netbsd)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-solaris)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-qnx)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-netware)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-openbsd)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-wdosx)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-darwin)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-emx)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-watcom)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-netwlibc)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-wince)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-embedded)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-symbian)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-nativent)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-iphonesim)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-android)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-aros)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),m68k-linux)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),m68k-freebsd)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),m68k-netbsd)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),m68k-amiga)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),m68k-atari)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),m68k-openbsd)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),m68k-palmos)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),m68k-embedded)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),powerpc-linux)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),powerpc-netbsd)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),powerpc-amiga)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),powerpc-macos)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),powerpc-darwin)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),powerpc-morphos)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),powerpc-embedded)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),powerpc-wii)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),powerpc-aix)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),sparc-linux)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),sparc-netbsd)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),sparc-solaris)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),sparc-embedded)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),x86_64-linux)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),x86_64-freebsd)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),x86_64-netbsd)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),x86_64-solaris)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),x86_64-openbsd)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),x86_64-darwin)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),x86_64-win64)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),x86_64-embedded)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),x86_64-dragonfly)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),arm-linux)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),arm-palmos)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),arm-darwin)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),arm-wince)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),arm-gba)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),arm-nds)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),arm-embedded)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),arm-symbian)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),arm-android)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),powerpc64-linux)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),powerpc64-darwin)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),powerpc64-embedded)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),powerpc64-aix)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),avr-embedded)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),armeb-linux)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),armeb-embedded)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),mips-linux)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),mipsel-linux)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),mipsel-embedded)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),mipsel-android)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),jvm-java)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),jvm-android)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i8086-msdos)
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
override TARGET_UNITS+=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 strings sysctl baseunix unixutil unix initc cmem dynlibs $(CPU_UNITS) dos dl blockrtl sysutils typinfo fgl classes math types charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb errors termio sysconst cthreads rtlconsts cwstring bsd fpwidestring fpintres fpextres objc objcbase unixcp
endif
ifeq ($(FULL_TARGET),i386-linux)
override TARGET_IMPLICITUNITS+=exeinfo cp1250 cp1251 cp1252 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 cp437 cp646 cp850 cp856 cp866 cp874 cp8859_1 cp8859_5 cp8859_2 cp852 unicodedata unicodenumtable
@ -2703,6 +2703,7 @@ strings$(PPUEXT) : $(SYSTEMUNIT)$(PPUEXT) $(INC)/strings.pp $(INC)/stringsi.inc\
$(SYSTEMUNIT)$(PPUEXT)
objc$(PPUEXT) : $(SYSTEMUNIT)$(PPUEXT) ctypes$(PPUEXT) unixtype$(PPUEXT) $(INC)/objc.pp $(INC)/objc1.inc $(INC)/objcnf.inc
objcbase$(PPUEXT) : $(SYSTEMUNIT)$(PPUEXT) $(INC)/objcbase.pp objc$(PPUEXT)
blockrtl$(PPUEXT) : $(SYSTEMUNIT)$(PPUEXT) objpas$(PPUEXT) initc$(PPUEXT) ctypes$(PPUEXT) $(INC)/blockrtl.pp
baseunix$(PPUEXT) : unixtype$(PPUEXT) sysctl$(PPUEXT) errno.inc ptypes.inc $(UNIXINC)/ctypes.inc \
signal.inc $(UNIXINC)/bunxh.inc \
$(BSDINC)/bunxsysc.inc \

View File

@ -11,7 +11,7 @@ loaders=
units=$(SYSTEMUNIT) uuchar unixtype ctypes objpas macpas iso7185 \
strings sysctl baseunix unixutil \
unix initc cmem dynlibs $(CPU_UNITS) \
dos dl \
dos dl blockrtl \
sysutils typinfo fgl classes math types \
charset cpall character getopts heaptrc lineinfo lnfodwrf lnfogdb \
errors termio \
@ -142,6 +142,8 @@ objc$(PPUEXT) : $(SYSTEMUNIT)$(PPUEXT) ctypes$(PPUEXT) unixtype$(PPUEXT) $(INC)/
objcbase$(PPUEXT) : $(SYSTEMUNIT)$(PPUEXT) $(INC)/objcbase.pp objc$(PPUEXT)
blockrtl$(PPUEXT) : $(SYSTEMUNIT)$(PPUEXT) objpas$(PPUEXT) initc$(PPUEXT) ctypes$(PPUEXT) $(INC)/blockrtl.pp
#
# System Dependent Units
#

128
rtl/inc/blockrtl.pp Normal file
View File

@ -0,0 +1,128 @@
{
This file is part of the Free Pascal run time library.
Copyright (c) 20134 by Jonas Maebe,
member of the Free Pascal development team
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
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.
**********************************************************************}
unit blockrtl;
{ for tmethod }
{$mode objfpc}
{$packrecords c}
interface
uses
initc,
ctypes;
{ blocks helpers }
function _Block_copy(const aBlock: pointer): pointer; cdecl; external;
procedure _Block_release(const aBlock: pointer); cdecl; external;
procedure _Block_object_assign(dst, src: pointer; const flags: cint); cdecl; external;
procedure _Block_object_dispose(const aBlock: pointer; const flags: cint); cdecl; external;
{ blocks isa pointers }
var
_NSConcreteGlobalBlock: array[0..31] of pointer; cvar; external;
_NSConcreteStackBlock: array[0..31] of pointer; cvar; external;
{ from Clang source, distributed under the University of Illinois Open Source
License }
{ BlockByrefFlags }
const
BLOCK_BYREF_HAS_COPY_DISPOSE = 1 shl 25;
BLOCK_BYREF_LAYOUT_MASK = $f shl 28;
BLOCK_BYREF_LAYOUT_EXTENDED = 1 shl 28;
BLOCK_BYREF_LAYOUT_NON_OBJECT = 2 shl 28;
BLOCK_BYREF_LAYOUT_STRONG = 3 shl 28;
BLOCK_BYREF_LAYOUT_WEAK = 4 shl 28;
BLOCK_BYREF_LAYOUT_UNRETAINED = 5 shl 28;
{ BlockLiteralFlags }
const
BLOCK_HAS_COPY_DISPOSE = 1 shl 25;
BLOCK_HAS_CXX_OBJ = 1 shl 26;
BLOCK_IS_GLOBAL = 1 shl 28;
BLOCK_USE_STRET = 1 shl 29;
BLOCK_HAS_SIGNATURE = 1 shl 30;
BLOCK_HAS_EXTENDED_LAYOUT = 1 shl 31;
{ BlockFieldFlag_t }
const
BLOCK_FIELD_IS_OBJECT = $03; { id, NSObject, __attribute__((NSObject)), block, ... }
BLOCK_FIELD_IS_BLOCK = $07; { a block variable }
BLOCK_FIELD_IS_BYREF = $08; { the on stack structure holding the __block variable }
BLOCK_FIELD_IS_WEAK = $10; { declared __weak, only used in byref copy helpers }
BLOCK_FIELD_IS_ARC = $40; { field has ARC-specific semantics }
BLOCK_BYREF_CALLER = 128; { called from __block (byref) copy/dispose support routines }
BLOCK_BYREF_CURRENT_MAX = 256;
type
FPC_Block_literal_base = record
isa: pointer; // initialized to &_NSConcreteStackBlock or &_NSConcreteGlobalBlock
flags: cint;
reserved: cint;
{ actually a function pointer, will be cast by the compiler }
invoke: pointer;
descriptor: pointer;
end;
{ descriptor for a simple block (no copy/release) }
FPC_Block_descriptor_simple = record
reserved: culong;
Block_size: culong;
{ signatures are only for the "ABI.2010.3.16" version, but that's all we support
because otherwise the callback has to be a C-style variadic function, which
we cannot (yet?) generate on the callee side}
signature: pchar;
end;
{ descriptor for a simple block (no copy/release) }
FPC_Block_descriptor_complex = record
reserved: culong;
Block_size: culong;
copy_helper: procedure(dst, src: pointer); cdecl;
dispose_helper: procedure(block: pointer); cdecl;
{ signatures are only for the "ABI.2010.3.16" version, but that's all we support
because otherwise the callback has to be a C-style variadic function, which
we cannot (yet?) generate on the callee side}
signature: pchar;
end;
{ for global procedures }
FPC_Block_literal_static = record
base: FPC_Block_literal_base;
{ no local state }
end;
{ for simple procedure variable (just an address) }
FPC_Block_literal_simple_procvar = record
base: FPC_Block_literal_base;
{ the procvar to call }
pv: pointer;
end;
{ for procedure of object, and in the future also nested procedures and
maybe Objective-C methods }
FPC_Block_literal_complex_procvar = record
base: FPC_Block_literal_base;
{ the procvar to call }
pv: tmethod;
end;
PFPC_Block_literal_complex_procvar = ^FPC_Block_literal_complex_procvar;
implementation
end.

31
tests/test/tblock1.pp Normal file
View File

@ -0,0 +1,31 @@
{ %target=darwin,iphonesim}
{$modeswitch blocks}
type
tblock = reference to procedure; cdecl;
procedure test(b: tblock);
begin
b;
end;
procedure proc;
begin
writeln('called as block');
end;
const
bconst: tblock = @proc;
var
b: tblock;
begin
b:=@proc;
b;
test(@proc);
test(b);
bconst;
test(bconst);
end.

32
tests/test/tblock1a.pp Normal file
View File

@ -0,0 +1,32 @@
{ %target=darwin,iphonesim}
{$mode delphi}
{$modeswitch blocks}
type
tblock = reference to procedure; cdecl;
procedure test(b: tblock);
begin
b;
end;
procedure proc;
begin
writeln('called as block');
end;
const
bconst: tblock = proc;
var
b: tblock;
begin
b:=proc;
b;
test(proc);
test(b);
bconst;
test(bconst);
end.

37
tests/test/tblock1c.pp Normal file
View File

@ -0,0 +1,37 @@
{ %target=darwin,iphonesim}
{$modeswitch blocks}
type
tblock = reference to function(l: longint): longint; cdecl;
function test(b: tblock; l: longint): longint;
begin
test:=b(l);
end;
function func(l: longint): longint;
begin
writeln('called as block');
func:=l+1;
end;
const
bconst: tblock = @func;
var
b: tblock;
begin
b:=@func;
if b(1)<>2 then
halt(1);
if test(@func,4)<>5 then
halt(2);
if test(b,123)<>124 then
halt(3);
if bconst(100)<>101 then
halt(4);
if test(bconst,10)<>11 then
halt(5);
end.

51
tests/test/tblock2.pp Normal file
View File

@ -0,0 +1,51 @@
{ %target=darwin,iphonesim}
{$mode objfpc}
{$modeswitch blocks}
type
tblock = reference to procedure(j: longint); cdecl;
tc = class
i: longint;
procedure callme(j: longint);
end;
var
b: tblock;
c: tc;
procedure tc.callme(j: longint);
const
invocationcount: longint = 0;
begin
writeln('self: ',hexstr(pointer(self)),', i: ',i,', j: ',j);
if self<>c then
halt(1);
if i<>12345 then
halt(2);
if invocationcount=0 then
begin
if j<>1 then
halt(3)
end
else if j<>2 then
halt(4);
inc(invocationcount);
end;
procedure test(b: tblock);
begin
b(2);
end;
begin
c:=tc.create;
c.i:=12345;
b:=@c.callme;
b(1);
test(@c.callme);
test(b);
end.

51
tests/test/tblock2a.pp Normal file
View File

@ -0,0 +1,51 @@
{ %target=darwin,iphonesim}
{$mode delphi}
{$modeswitch blocks}
type
tblock = reference to procedure(j: longint); cdecl;
tc = class
i: longint;
procedure callme(j: longint);
end;
var
b: tblock;
p: procedure(j: longint) of object;
c: tc;
procedure tc.callme(j: longint);
const
invocationcount: longint = 0;
begin
writeln('self: ',hexstr(pointer(self)),', i: ',i,', j: ',j);
if self<>c then
halt(1);
if i<>12345 then
halt(2);
if invocationcount=0 then
begin
if j<>1 then
halt(3)
end
else if j<>2 then
halt(4);
inc(invocationcount);
end;
procedure test(b: tblock);
begin
b(2);
end;
begin
c:=tc.create;
c.i:=12345;
b:=c.callme;
b(1);
test(c.callme);
test(b);
end.