* fixed resetting defs after generating the llvm "type" instructions: the

dbg_state is not sufficient to determine whether or not a def has
    already been processed or not -> use stab_number (and reset it)
   o also record all defs we don't emit "type" instruction for, but which
     we still process to find other defs, so we reset those too

git-svn-id: trunk@32520 -
This commit is contained in:
Jonas Maebe 2015-11-24 20:10:35 +00:00
parent ba92fdafcc
commit ef3bafd67c

View File

@ -143,10 +143,14 @@ implementation
function TLLVMTypeInfo.record_def(def:tdef): tdef;
begin
result:=def;
if def.dbg_state<>dbg_state_unused then
if def.stab_number<>0 then
exit;
def.dbg_state:=dbg_state_used;
deftowritelist.Add(def);
def.stab_number:=1;
if def.dbg_state=dbg_state_unused then
begin
def.dbg_state:=dbg_state_used;
deftowritelist.Add(def);
end;
defnumberlist.Add(def);
end;
@ -472,6 +476,7 @@ implementation
procedure TLLVMTypeInfo.appenddef_array(list:TAsmList;def:tarraydef);
begin
record_def(def);
appenddef(list,def.elementdef);
end;
@ -481,6 +486,7 @@ implementation
symdeflist: tfpobjectlist;
i: longint;
begin
record_def(def);
symdeflist:=tabstractrecordsymtable(def.symtable).llvmst.symdeflist;
for i:=0 to symdeflist.Count-1 do
record_def(tllvmshadowsymtableentry(symdeflist[i]).def);
@ -497,6 +503,7 @@ implementation
procedure TLLVMTypeInfo.appenddef_pointer(list:TAsmList;def:tpointerdef);
begin
record_def(def);
appenddef(list,def.pointeddef);
end;
@ -505,6 +512,7 @@ implementation
var
i: longint;
begin
record_def(def);
{ 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),
which means that recursive references should become plain "procedure"
@ -659,11 +667,9 @@ implementation
{ reset all def labels }
for i:=0 to defnumberlist.count-1 do
begin
def := tdef(defnumberlist[i]);
if assigned(def) then
begin
def.dbg_state:=dbg_state_unused;
end;
def:=tdef(defnumberlist[i]);
def.dbg_state:=dbg_state_unused;
def.stab_number:=0;
end;
defnumberlist.free;
@ -678,7 +684,10 @@ implementation
procedure TLLVMTypeInfo.appenddef_object(list:TAsmList;def: tobjectdef);
begin
if is_any_interface_kind(def) then
record_def(def.vmt_def)
begin
record_def(def);
record_def(def.vmt_def);
end
else
appenddef_abstractrecord(list,def);
end;
@ -686,18 +695,21 @@ implementation
procedure TLLVMTypeInfo.appenddef_classref(list: TAsmList; def: tclassrefdef);
begin
record_def(def);
record_def(tobjectdef(tclassrefdef(def).pointeddef).vmt_def);
end;
procedure TLLVMTypeInfo.appenddef_variant(list:TAsmList;def: tvariantdef);
begin
record_def(def);
appenddef(list,tabstractrecorddef(search_system_type('TVARDATA').typedef));
end;
procedure TLLVMTypeInfo.appenddef_file(list:TAsmList;def:tfiledef);
begin
record_def(def);
case tfiledef(def).filetyp of
ft_text :
appenddef(list,tabstractrecorddef(search_system_type('TEXTREC').typedef));