llvmtype: ensure all processed defs get recorded

This is necessary so they get reset as well, as they may be reprocessed while
compiling other units (both by llvmtype and dbgllvm)
This commit is contained in:
Jonas Maebe 2022-04-26 20:25:38 +02:00
parent f832444eaa
commit 13055bb58a

View File

@ -79,6 +79,8 @@ interface
procedure appendsym_const(list:TAsmList;sym:tconstsym);override; procedure appendsym_const(list:TAsmList;sym:tconstsym);override;
procedure appendsym_absolute(list:TAsmList;sym:tabsolutevarsym);override; procedure appendsym_absolute(list:TAsmList;sym:tabsolutevarsym);override;
procedure afterappenddef(list: TAsmList; def: tdef); override;
procedure enum_membersyms_callback(p:TObject;arg:pointer); procedure enum_membersyms_callback(p:TObject;arg:pointer);
procedure collect_llvmins_info(deftypelist: tasmlist; p: taillvm); procedure collect_llvmins_info(deftypelist: tasmlist; p: taillvm);
@ -561,7 +563,6 @@ implementation
procedure TLLVMTypeInfo.appenddef_array(list:TAsmList;def:tarraydef); procedure TLLVMTypeInfo.appenddef_array(list:TAsmList;def:tarraydef);
begin begin
record_def(def);
appenddef(list,def.elementdef); appenddef(list,def.elementdef);
end; end;
@ -571,7 +572,6 @@ implementation
symdeflist: tfpobjectlist; symdeflist: tfpobjectlist;
i: longint; i: longint;
begin begin
record_def(def);
symdeflist:=tabstractrecordsymtable(def.symtable).llvmst.symdeflist; symdeflist:=tabstractrecordsymtable(def.symtable).llvmst.symdeflist;
for i:=0 to symdeflist.Count-1 do for i:=0 to symdeflist.Count-1 do
record_def(tllvmshadowsymtableentry(symdeflist[i]).def); record_def(tllvmshadowsymtableentry(symdeflist[i]).def);
@ -587,7 +587,6 @@ implementation
procedure TLLVMTypeInfo.appenddef_pointer(list:TAsmList;def:tpointerdef); procedure TLLVMTypeInfo.appenddef_pointer(list:TAsmList;def:tpointerdef);
begin begin
record_def(def);
appenddef(list,def.pointeddef); appenddef(list,def.pointeddef);
end; end;
@ -596,7 +595,6 @@ implementation
var var
i: longint; i: longint;
begin begin
record_def(def);
{ todo: handle mantis #25551; there is no way to create a symbolic { todo: handle mantis #25551; there is no way to create a symbolic
la_type for a procvardef (unless it's a procedure of object/record), la_type for a procvardef (unless it's a procedure of object/record),
which means that recursive references should become plain "procedure" which means that recursive references should become plain "procedure"
@ -664,6 +662,12 @@ implementation
appenddef(list,sym.vardef); appenddef(list,sym.vardef);
end; end;
procedure TLLVMTypeInfo.afterappenddef(list: TAsmList; def: tdef);
begin
record_def(def);
inherited;
end;
procedure TLLVMTypeInfo.inserttypeinfo; procedure TLLVMTypeInfo.inserttypeinfo;
@ -771,7 +775,6 @@ implementation
begin begin
if is_interface(def) then if is_interface(def) then
begin begin
record_def(def);
record_def(def.vmt_def); record_def(def.vmt_def);
end end
else else
@ -781,7 +784,6 @@ implementation
procedure TLLVMTypeInfo.appenddef_classref(list: TAsmList; def: tclassrefdef); procedure TLLVMTypeInfo.appenddef_classref(list: TAsmList; def: tclassrefdef);
begin begin
record_def(def);
{ can also be an objcclass, which doesn't have a vmt } { can also be an objcclass, which doesn't have a vmt }
if is_class(tclassrefdef(def).pointeddef) then if is_class(tclassrefdef(def).pointeddef) then
record_def(tobjectdef(tclassrefdef(def).pointeddef).vmt_def); record_def(tobjectdef(tclassrefdef(def).pointeddef).vmt_def);
@ -790,14 +792,12 @@ implementation
procedure TLLVMTypeInfo.appenddef_variant(list:TAsmList;def: tvariantdef); procedure TLLVMTypeInfo.appenddef_variant(list:TAsmList;def: tvariantdef);
begin begin
record_def(def);
appenddef(list,tabstractrecorddef(search_system_type('TVARDATA').typedef)); appenddef(list,tabstractrecorddef(search_system_type('TVARDATA').typedef));
end; end;
procedure TLLVMTypeInfo.appenddef_file(list:TAsmList;def:tfiledef); procedure TLLVMTypeInfo.appenddef_file(list: TasmList; def: tfiledef);
begin begin
record_def(def);
case tfiledef(def).filetyp of case tfiledef(def).filetyp of
ft_text : ft_text :
appenddef(list,tabstractrecorddef(search_system_type('TEXTREC').typedef)); appenddef(list,tabstractrecorddef(search_system_type('TEXTREC').typedef));