* fixed LLVM memory leaks

git-svn-id: trunk@40732 -
This commit is contained in:
Jonas Maebe 2019-01-01 16:22:31 +00:00
parent 22365a1f57
commit 4d03f3a65e
5 changed files with 40 additions and 27 deletions

View File

@ -58,6 +58,7 @@ type
fval: tai;
public
constructor create(_adetyp: ttypedconstkind; _def: tdef; _val: tai);
destructor destroy; override;
property val: tai read fval write setval;
end;
@ -646,6 +647,13 @@ implementation
end;
destructor tai_simpletypedconst.destroy;
begin
fval.free;
inherited destroy;
end;
{****************************************************************************
tai_aggregatetypedconst.tadeenumerator
****************************************************************************}
@ -820,7 +828,11 @@ implementation
destructor tai_aggregatetypedconst.destroy;
var
ai: tai_abstracttypedconst;
begin
for ai in self do
ai.free;
fvalues.free;
inherited destroy;
end;

View File

@ -3186,7 +3186,7 @@ implementation
paramanager.getintparaloc(list,pd,1,cgpara1);
a_load_const_cgpara(list,s32inttype,aint(210),cgpara1);
paramanager.freecgpara(list,cgpara1);
g_call_system_proc(list,pd,[@cgpara1],nil);
g_call_system_proc(list,pd,[@cgpara1],nil).resetiftemp;
cgpara1.done;
a_label(list,oklabel);
end;
@ -3234,7 +3234,7 @@ implementation
paramanager.freecgpara(list,cgpara3);
paramanager.freecgpara(list,cgpara2);
paramanager.freecgpara(list,cgpara1);
g_call_system_proc(list,pd,[@cgpara1,@cgpara2,@cgpara3],nil);
g_call_system_proc(list,pd,[@cgpara1,@cgpara2,@cgpara3],nil).resetiftemp;
cgpara3.done;
cgpara2.done;
cgpara1.done;
@ -3262,7 +3262,7 @@ implementation
end;
paramanager.freecgpara(list,cgpara2);
paramanager.freecgpara(list,cgpara1);
g_call_system_proc(list,pd,[@cgpara1,@cgpara2],nil);
g_call_system_proc(list,pd,[@cgpara1,@cgpara2],nil).resetiftemp;
cgpara2.done;
cgpara1.done;
end;
@ -3301,7 +3301,7 @@ implementation
{ these functions get the pointer by value }
a_load_ref_cgpara(list,t,ref,cgpara1);
paramanager.freecgpara(list,cgpara1);
g_call_system_proc(list,pd,[@cgpara1],nil);
g_call_system_proc(list,pd,[@cgpara1],nil).resetiftemp;
end
else
begin
@ -3323,7 +3323,7 @@ implementation
end;
paramanager.freecgpara(list,cgpara1);
paramanager.freecgpara(list,cgpara2);
g_call_system_proc(list,pd,[@cgpara1,@cgpara2],nil);
g_call_system_proc(list,pd,[@cgpara1,@cgpara2],nil).resetiftemp;
end;
cgpara2.done;
cgpara1.done;
@ -3349,7 +3349,7 @@ implementation
paramanager.getintparaloc(list,pd,1,cgpara1);
a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
paramanager.freecgpara(list,cgpara1);
g_call_system_proc(list,pd,[@cgpara1],nil);
g_call_system_proc(list,pd,[@cgpara1],nil).resetiftemp;
end
else
begin
@ -3371,7 +3371,7 @@ implementation
end;
paramanager.freecgpara(list,cgpara1);
paramanager.freecgpara(list,cgpara2);
g_call_system_proc(list,pd,[@cgpara1,@cgpara2],nil);
g_call_system_proc(list,pd,[@cgpara1,@cgpara2],nil).resetiftemp;
end;
cgpara1.done;
cgpara2.done;
@ -3421,7 +3421,7 @@ implementation
end;
paramanager.freecgpara(list,cgpara1);
paramanager.freecgpara(list,cgpara2);
g_call_system_proc(list,pd,[@cgpara1,@cgpara2],nil);
g_call_system_proc(list,pd,[@cgpara1,@cgpara2],nil).resetiftemp;
cgpara1.done;
cgpara2.done;
exit;
@ -3431,7 +3431,7 @@ implementation
paramanager.getintparaloc(list,pd,1,cgpara1);
a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
paramanager.freecgpara(list,cgpara1);
g_call_system_proc(list,pd,[@cgpara1],nil);
g_call_system_proc(list,pd,[@cgpara1],nil).resetiftemp;
cgpara1.done;
end;
@ -3485,7 +3485,7 @@ implementation
paramanager.freecgpara(list,cgpara1);
paramanager.freecgpara(list,cgpara2);
paramanager.freecgpara(list,cgpara3);
g_call_system_proc(list,pd,[@cgpara1,@cgpara2,@cgpara3],nil);
g_call_system_proc(list,pd,[@cgpara1,@cgpara2,@cgpara3],nil).resetiftemp;
cgpara3.done;
cgpara2.done;
@ -3664,7 +3664,7 @@ implementation
{ if low(to) > maxlongint also range error }
(lto > aintmax) then
begin
g_call_system_proc(list,'fpc_rangeerror',[],nil);
g_call_system_proc(list,'fpc_rangeerror',[],nil).resetiftemp;
exit
end;
{ from is signed and to is unsigned -> when looking at to }
@ -3679,7 +3679,7 @@ implementation
if (lfrom > aintmax) or
(hto < 0) then
begin
g_call_system_proc(list,'fpc_rangeerror',[],nil);
g_call_system_proc(list,'fpc_rangeerror',[],nil).resetiftemp;
exit
end;
{ from is unsigned and to is signed -> when looking at to }
@ -3702,7 +3702,7 @@ implementation
a_cmp_const_reg_label(list,maxdef,OC_BE,aintmax,hreg,neglabel)
else
a_cmp_const_reg_label(list,maxdef,OC_BE,tcgint(int64(hto-lto)),hreg,neglabel);
g_call_system_proc(list,'fpc_rangeerror',[],nil);
g_call_system_proc(list,'fpc_rangeerror',[],nil).resetiftemp;
a_label(list,neglabel);
end;
@ -3781,7 +3781,7 @@ implementation
paramanager.freecgpara(list,cgpara3);
paramanager.freecgpara(list,cgpara2);
paramanager.freecgpara(list,cgpara1);
g_call_system_proc(list,pd,[@cgpara1,@cgpara2,@cgpara3],nil);
g_call_system_proc(list,pd,[@cgpara1,@cgpara2,@cgpara3],nil).resetiftemp;
cgpara3.done;
cgpara2.done;
cgpara1.done;
@ -3800,7 +3800,7 @@ implementation
{ load source }
a_load_loc_cgpara(list,cpointerdef.getreusable(arrdef),l,cgpara1);
paramanager.freecgpara(list,cgpara1);
g_call_system_proc(list,pd,[@cgpara1],nil);
g_call_system_proc(list,pd,[@cgpara1],nil).resetiftemp;
cgpara1.done;
end;
@ -4639,10 +4639,10 @@ implementation
{$ifdef AVR}
cg.a_call_name(list,'FPC_INIT_FUNC_TABLE',false)
{$else AVR}
g_call_system_proc(list,'fpc_initializeunits',[],nil)
g_call_system_proc(list,'fpc_initializeunits',[],nil).resetiftemp
{$endif AVR}
else
g_call_system_proc(list,'fpc_libinitializeunits',[],nil);
g_call_system_proc(list,'fpc_libinitializeunits',[],nil).resetiftemp;
end;
list.concat(Tai_force_line.Create);
@ -4660,7 +4660,7 @@ implementation
{ call __EXIT for main program }
if (not current_module.islibrary) and
(current_procinfo.procdef.proctypeoption=potype_proginit) then
g_call_system_proc(list,'fpc_do_exit',[],nil);
g_call_system_proc(list,'fpc_do_exit',[],nil).resetiftemp;
end;
procedure thlcgobj.inittempvariables(list: TAsmList);
@ -5236,7 +5236,7 @@ implementation
paramanager.getintparaloc(list,pd,1,paraloc1);
paramanager.freecgpara(list,paraloc1);
{ Call the helper }
hlcg.g_call_system_proc(list,pd,[@paraloc1],nil);
g_call_system_proc(list,pd,[@paraloc1],nil).resetiftemp;
paraloc1.done;
end;

View File

@ -1395,7 +1395,7 @@ implementation
internalerror(2015122504);
current_asmdata.getjumplabel(hl);
a_cmp_const_loc_label(list,llvmbool1type,OC_EQ,0,ovloc,hl);
g_call_system_proc(list,'fpc_overflow',[],nil);
g_call_system_proc(list,'fpc_overflow',[],nil).resetiftemp;
a_label(list,hl);
end;
@ -1621,8 +1621,12 @@ implementation
procedure thlcgllvm.gen_load_loc_function_result(list: TAsmList; vardef: tdef; const l: tlocation);
var
retlocpara: tcgpara;
begin
gen_load_loc_cgpara(list,vardef,l,get_call_result_cgpara(current_procinfo.procdef,nil));
retlocpara:=get_call_result_cgpara(current_procinfo.procdef,nil);
gen_load_loc_cgpara(list,vardef,l,retlocpara);
retlocpara.resetiftemp;
end;

View File

@ -311,7 +311,7 @@ implementation
begin
current_asmdata.getjumplabel(hl);
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,opsize,OC_NE,torddef(opsize).low.svalue,location.register,hl);
hlcg.g_call_system_proc(current_asmdata.CurrAsmList,'fpc_overflow',[],nil);
hlcg.g_call_system_proc(current_asmdata.CurrAsmList,'fpc_overflow',[],nil).resetiftemp;
hlcg.a_label(current_asmdata.CurrAsmList,hl);
end;
end;

View File

@ -1491,11 +1491,8 @@ implementation
newpd:=tprocdef(orgpd.getcopyas(procdef,pc_bareproc,''));
insert_funcret_para(newpd);
newpd.procoptions:=newpd.procoptions+orgpd.procoptions*[po_external,po_has_importname,po_has_importdll];
newpd.import_name:=orgpd.import_name;
orgpd.import_name:=nil;
newpd.import_dll:=orgpd.import_dll;
orgpd.import_dll:=nil;
newpd.import_nr:=orgpd.import_nr;
stringdispose(orgpd.import_name);
stringdispose(orgpd.import_dll);
orgpd.import_nr:=0;
newpd.setmangledname(newname);
finish_copied_procdef(newpd,'__FPC_IMPL_EXTERNAL_REDIRECT_'+newname,current_module.localsymtable,nil);