|
@@ -398,13 +398,10 @@ unit cgobj;
|
|
|
|
|
|
}
|
|
|
procedure g_copyshortstring(list : TAsmList;const source,dest : treference;len:byte);
|
|
|
- procedure g_copyvariant(list : TAsmList;const source,dest : treference);
|
|
|
|
|
|
procedure g_incrrefcount(list : TAsmList;t: tdef; const ref: treference);
|
|
|
procedure g_array_rtti_helper(list: TAsmList; t: tdef; const ref: treference; const highloc: tlocation;
|
|
|
const name: string);
|
|
|
- procedure g_initialize(list : TAsmList;t : tdef;const ref : treference);
|
|
|
- procedure g_finalize(list : TAsmList;t : tdef;const ref : treference);
|
|
|
|
|
|
{# Generates overflow checking code for a node }
|
|
|
procedure g_overflowcheck(list: TAsmList; const Loc:tlocation; def:tdef); virtual;abstract;
|
|
@@ -2073,12 +2070,12 @@ implementation
|
|
|
cgpara1.init;
|
|
|
cgpara2.init;
|
|
|
cgpara3.init;
|
|
|
- paramanager.getintparaloc(pocall_default,1,cgpara1);
|
|
|
- paramanager.getintparaloc(pocall_default,2,cgpara2);
|
|
|
- paramanager.getintparaloc(pocall_default,3,cgpara3);
|
|
|
+ paramanager.getintparaloc(pocall_default,1,voidpointertype,cgpara1);
|
|
|
+ paramanager.getintparaloc(pocall_default,2,voidpointertype,cgpara2);
|
|
|
+ paramanager.getintparaloc(pocall_default,3,s32inttype,cgpara3);
|
|
|
a_loadaddr_ref_cgpara(list,dest,cgpara3);
|
|
|
a_loadaddr_ref_cgpara(list,source,cgpara2);
|
|
|
- a_load_const_cgpara(list,OS_INT,len,cgpara1);
|
|
|
+ a_load_const_cgpara(list,OS_S32,len,cgpara1);
|
|
|
paramanager.freecgpara(list,cgpara3);
|
|
|
paramanager.freecgpara(list,cgpara2);
|
|
|
paramanager.freecgpara(list,cgpara1);
|
|
@@ -2091,26 +2088,6 @@ implementation
|
|
|
end;
|
|
|
|
|
|
|
|
|
- procedure tcg.g_copyvariant(list : TAsmList;const source,dest : treference);
|
|
|
- var
|
|
|
- cgpara1,cgpara2 : TCGPara;
|
|
|
- begin
|
|
|
- cgpara1.init;
|
|
|
- cgpara2.init;
|
|
|
- paramanager.getintparaloc(pocall_default,1,cgpara1);
|
|
|
- paramanager.getintparaloc(pocall_default,2,cgpara2);
|
|
|
- a_loadaddr_ref_cgpara(list,dest,cgpara2);
|
|
|
- a_loadaddr_ref_cgpara(list,source,cgpara1);
|
|
|
- paramanager.freecgpara(list,cgpara2);
|
|
|
- paramanager.freecgpara(list,cgpara1);
|
|
|
- allocallcpuregisters(list);
|
|
|
- a_call_name(list,'FPC_VARIANT_COPY_OVERWRITE',false);
|
|
|
- deallocallcpuregisters(list);
|
|
|
- cgpara2.done;
|
|
|
- cgpara1.done;
|
|
|
- end;
|
|
|
-
|
|
|
-
|
|
|
procedure tcg.g_incrrefcount(list : TAsmList;t: tdef; const ref: treference);
|
|
|
var
|
|
|
href : treference;
|
|
@@ -2119,8 +2096,8 @@ implementation
|
|
|
begin
|
|
|
cgpara1.init;
|
|
|
cgpara2.init;
|
|
|
- paramanager.getintparaloc(pocall_default,1,cgpara1);
|
|
|
- paramanager.getintparaloc(pocall_default,2,cgpara2);
|
|
|
+ paramanager.getintparaloc(pocall_default,1,voidpointertype,cgpara1);
|
|
|
+ paramanager.getintparaloc(pocall_default,2,voidpointertype,cgpara2);
|
|
|
if is_interfacecom_or_dispinterface(t) then
|
|
|
incrfunc:='FPC_INTF_INCR_REF'
|
|
|
else if is_ansistring(t) then
|
|
@@ -2175,9 +2152,9 @@ implementation
|
|
|
cgpara1.init;
|
|
|
cgpara2.init;
|
|
|
cgpara3.init;
|
|
|
- paramanager.getintparaloc(pocall_default,1,cgpara1);
|
|
|
- paramanager.getintparaloc(pocall_default,2,cgpara2);
|
|
|
- paramanager.getintparaloc(pocall_default,3,cgpara3);
|
|
|
+ paramanager.getintparaloc(pocall_default,1,voidpointertype,cgpara1);
|
|
|
+ paramanager.getintparaloc(pocall_default,2,voidpointertype,cgpara2);
|
|
|
+ paramanager.getintparaloc(pocall_default,3,ptrsinttype,cgpara3);
|
|
|
|
|
|
reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0,sizeof(pint));
|
|
|
if highloc.loc=LOC_CONSTANT then
|
|
@@ -2188,13 +2165,13 @@ implementation
|
|
|
hreg:=highloc.register
|
|
|
else
|
|
|
begin
|
|
|
- hreg:=getintregister(list,OS_INT);
|
|
|
- a_load_loc_reg(list,OS_INT,highloc,hreg);
|
|
|
+ hreg:=getintregister(list,OS_SINT);
|
|
|
+ a_load_loc_reg(list,OS_SINT,highloc,hreg);
|
|
|
end;
|
|
|
{ increment, converts high(x) to length(x) }
|
|
|
- lenreg:=getintregister(list,OS_INT);
|
|
|
- a_op_const_reg_reg(list,OP_ADD,OS_INT,1,hreg,lenreg);
|
|
|
- a_load_reg_cgpara(list,OS_INT,lenreg,cgpara3);
|
|
|
+ lenreg:=getintregister(list,OS_SINT);
|
|
|
+ a_op_const_reg_reg(list,OP_ADD,OS_SINT,1,hreg,lenreg);
|
|
|
+ a_load_reg_cgpara(list,OS_SINT,lenreg,cgpara3);
|
|
|
end;
|
|
|
|
|
|
a_loadaddr_ref_cgpara(list,href,cgpara2);
|
|
@@ -2211,93 +2188,6 @@ implementation
|
|
|
cgpara1.done;
|
|
|
end;
|
|
|
|
|
|
- procedure tcg.g_initialize(list : TAsmList;t : tdef;const ref : treference);
|
|
|
- var
|
|
|
- href : treference;
|
|
|
- cgpara1,cgpara2 : TCGPara;
|
|
|
- begin
|
|
|
- cgpara1.init;
|
|
|
- cgpara2.init;
|
|
|
- if is_ansistring(t) or
|
|
|
- is_widestring(t) or
|
|
|
- is_unicodestring(t) or
|
|
|
- is_interfacecom_or_dispinterface(t) or
|
|
|
- is_dynamic_array(t) then
|
|
|
- a_load_const_ref(list,OS_ADDR,0,ref)
|
|
|
- else if t.typ=variantdef then
|
|
|
- begin
|
|
|
- paramanager.getintparaloc(pocall_default,1,cgpara1);
|
|
|
- a_loadaddr_ref_cgpara(list,ref,cgpara1);
|
|
|
- paramanager.freecgpara(list,cgpara1);
|
|
|
- allocallcpuregisters(list);
|
|
|
- a_call_name(list,'FPC_VARIANT_INIT',false);
|
|
|
- deallocallcpuregisters(list);
|
|
|
- end
|
|
|
- else
|
|
|
- begin
|
|
|
- if is_open_array(t) then
|
|
|
- InternalError(201103052);
|
|
|
- paramanager.getintparaloc(pocall_default,1,cgpara1);
|
|
|
- paramanager.getintparaloc(pocall_default,2,cgpara2);
|
|
|
- reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0,sizeof(pint));
|
|
|
- a_loadaddr_ref_cgpara(list,href,cgpara2);
|
|
|
- a_loadaddr_ref_cgpara(list,ref,cgpara1);
|
|
|
- paramanager.freecgpara(list,cgpara1);
|
|
|
- paramanager.freecgpara(list,cgpara2);
|
|
|
- allocallcpuregisters(list);
|
|
|
- a_call_name(list,'FPC_INITIALIZE',false);
|
|
|
- deallocallcpuregisters(list);
|
|
|
- end;
|
|
|
- cgpara1.done;
|
|
|
- cgpara2.done;
|
|
|
- end;
|
|
|
-
|
|
|
-
|
|
|
- procedure tcg.g_finalize(list : TAsmList;t : tdef;const ref : treference);
|
|
|
- var
|
|
|
- href : treference;
|
|
|
- cgpara1,cgpara2 : TCGPara;
|
|
|
- decrfunc : string;
|
|
|
- begin
|
|
|
- if is_interfacecom_or_dispinterface(t) then
|
|
|
- decrfunc:='FPC_INTF_DECR_REF'
|
|
|
- else if is_ansistring(t) then
|
|
|
- decrfunc:='FPC_ANSISTR_DECR_REF'
|
|
|
- else if is_widestring(t) then
|
|
|
- decrfunc:='FPC_WIDESTR_DECR_REF'
|
|
|
- else if is_unicodestring(t) then
|
|
|
- decrfunc:='FPC_UNICODESTR_DECR_REF'
|
|
|
- else if t.typ=variantdef then
|
|
|
- decrfunc:='FPC_VARIANT_CLEAR'
|
|
|
- else
|
|
|
- begin
|
|
|
- cgpara1.init;
|
|
|
- cgpara2.init;
|
|
|
- if is_open_array(t) then
|
|
|
- InternalError(201103051);
|
|
|
- paramanager.getintparaloc(pocall_default,1,cgpara1);
|
|
|
- paramanager.getintparaloc(pocall_default,2,cgpara2);
|
|
|
- reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0,sizeof(pint));
|
|
|
- a_loadaddr_ref_cgpara(list,href,cgpara2);
|
|
|
- a_loadaddr_ref_cgpara(list,ref,cgpara1);
|
|
|
- paramanager.freecgpara(list,cgpara1);
|
|
|
- paramanager.freecgpara(list,cgpara2);
|
|
|
- if is_dynamic_array(t) then
|
|
|
- g_call(list,'FPC_DYNARRAY_CLEAR')
|
|
|
- else
|
|
|
- g_call(list,'FPC_FINALIZE');
|
|
|
- cgpara1.done;
|
|
|
- cgpara2.done;
|
|
|
- exit;
|
|
|
- end;
|
|
|
- cgpara1.init;
|
|
|
- paramanager.getintparaloc(pocall_default,1,cgpara1);
|
|
|
- a_loadaddr_ref_cgpara(list,ref,cgpara1);
|
|
|
- paramanager.freecgpara(list,cgpara1);
|
|
|
- g_call(list,decrfunc);
|
|
|
- cgpara1.done;
|
|
|
- end;
|
|
|
-
|
|
|
|
|
|
procedure tcg.g_overflowCheck_loc(List:TAsmList;const Loc:TLocation;def:TDef;ovloc : tlocation);
|
|
|
begin
|
|
@@ -2329,8 +2219,8 @@ implementation
|
|
|
current_asmdata.getjumplabel(oklabel);
|
|
|
a_cmp_const_reg_label(list,OS_ADDR,OC_NE,0,reg,oklabel);
|
|
|
cgpara1.init;
|
|
|
- paramanager.getintparaloc(pocall_default,1,cgpara1);
|
|
|
- a_load_const_cgpara(list,OS_INT,tcgint(210),cgpara1);
|
|
|
+ paramanager.getintparaloc(pocall_default,1,s32inttype,cgpara1);
|
|
|
+ a_load_const_cgpara(list,OS_S32,tcgint(210),cgpara1);
|
|
|
paramanager.freecgpara(list,cgpara1);
|
|
|
a_call_name(list,'FPC_HANDLEERROR',false);
|
|
|
a_label(list,oklabel);
|
|
@@ -2346,10 +2236,10 @@ implementation
|
|
|
begin
|
|
|
cgpara1.init;
|
|
|
cgpara2.init;
|
|
|
- paramanager.getintparaloc(pocall_default,1,cgpara1);
|
|
|
- paramanager.getintparaloc(pocall_default,2,cgpara2);
|
|
|
+ paramanager.getintparaloc(pocall_default,1,voidpointertype,cgpara1);
|
|
|
if (cs_check_object in current_settings.localswitches) then
|
|
|
begin
|
|
|
+ paramanager.getintparaloc(pocall_default,2,voidpointertype,cgpara2);
|
|
|
reference_reset_symbol(hrefvmt,current_asmdata.RefAsmSymbol(objdef.vmt_mangledname),0,sizeof(pint));
|
|
|
a_loadaddr_ref_cgpara(list,hrefvmt,cgpara2);
|
|
|
a_load_reg_cgpara(list,OS_ADDR,reg,cgpara1);
|
|
@@ -2406,7 +2296,7 @@ implementation
|
|
|
|
|
|
{ do getmem call }
|
|
|
cgpara1.init;
|
|
|
- paramanager.getintparaloc(pocall_default,1,cgpara1);
|
|
|
+ paramanager.getintparaloc(pocall_default,1,ptruinttype,cgpara1);
|
|
|
a_load_reg_cgpara(list,OS_INT,sizereg,cgpara1);
|
|
|
paramanager.freecgpara(list,cgpara1);
|
|
|
allocallcpuregisters(list);
|
|
@@ -2420,11 +2310,11 @@ implementation
|
|
|
cgpara1.init;
|
|
|
cgpara2.init;
|
|
|
cgpara3.init;
|
|
|
- paramanager.getintparaloc(pocall_default,1,cgpara1);
|
|
|
- paramanager.getintparaloc(pocall_default,2,cgpara2);
|
|
|
- paramanager.getintparaloc(pocall_default,3,cgpara3);
|
|
|
+ paramanager.getintparaloc(pocall_default,1,voidpointertype,cgpara1);
|
|
|
+ paramanager.getintparaloc(pocall_default,2,voidpointertype,cgpara2);
|
|
|
+ paramanager.getintparaloc(pocall_default,3,ptrsinttype,cgpara3);
|
|
|
{ load size }
|
|
|
- a_load_reg_cgpara(list,OS_INT,sizereg,cgpara3);
|
|
|
+ a_load_reg_cgpara(list,OS_SINT,sizereg,cgpara3);
|
|
|
{ load destination }
|
|
|
a_load_reg_cgpara(list,OS_ADDR,destreg,cgpara2);
|
|
|
{ load source }
|
|
@@ -2447,7 +2337,7 @@ implementation
|
|
|
begin
|
|
|
{ do move call }
|
|
|
cgpara1.init;
|
|
|
- paramanager.getintparaloc(pocall_default,1,cgpara1);
|
|
|
+ paramanager.getintparaloc(pocall_default,1,voidpointertype,cgpara1);
|
|
|
{ load source }
|
|
|
a_load_loc_cgpara(list,l,cgpara1);
|
|
|
paramanager.freecgpara(list,cgpara1);
|