* also register symbols referenced from assembler via asolutevarsyms

git-svn-id: trunk@42307 -
This commit is contained in:
Jonas Maebe 2019-06-29 16:27:10 +00:00
parent c425c51963
commit 98f55b1d86

View File

@ -1331,6 +1331,62 @@ end;
Symbol table helper routines
****************************************************************************}
procedure AddAbsoluteSymRefs(sym: tabsolutevarsym); forward;
procedure MaybeAddSymRef(sym: tsym);
begin
case sym.typ of
absolutevarsym:
AddAbsoluteSymRefs(tabsolutevarsym(sym));
staticvarsym:
if not(vo_is_external in tstaticvarsym(sym).varoptions) then
cnodeutils.RegisterUsedAsmSym(current_asmdata.RefAsmSymbol(sym.mangledname,AT_DATA),tstaticvarsym(sym).vardef,true);
procsym:
begin
{ if it's a pure assembler routine, the definition of the symbol will also
be in assembler and it can't be removed by the compiler (and if we mark
it as used anyway, clang will get into trouble) }
if not(po_assembler in tprocdef(tprocsym(sym).ProcdefList[0]).procoptions) and
not(po_external in tprocdef(tprocsym(sym).ProcdefList[0]).procoptions) then
cnodeutils.RegisterUsedAsmSym(current_asmdata.RefAsmSymbol(tprocdef(tprocsym(sym).ProcdefList[0]).mangledname,AT_FUNCTION),tprocdef(tprocsym(sym).ProcdefList[0]),true);
end;
else
;
end;
end;
procedure AddAbsoluteSymRefs(sym: tabsolutevarsym);
var
symlist: ppropaccesslistitem;
begin
case sym.abstyp of
toaddr:
;
toasm:
begin
cnodeutils.RegisterUsedAsmSym(current_asmdata.RefAsmSymbol(sym.mangledname,AT_DATA),sym.vardef,true);
end;
tovar:
begin
symlist:=tabsolutevarsym(sym).ref.firstsym;
repeat
case symlist^.sltype of
sl_load:
MaybeAddSymRef(symlist^.sym);
sl_subscript,
sl_absolutetype,
sl_typeconv,
sl_vec:
;
else
internalerror(2009031401);
end;
symlist:=symlist^.next;
until not assigned(symlist);
end;
end;
end;
procedure AsmSearchSym(const s:string;out srsym:tsym;out srsymtable:TSymtable);
var
i : integer;
@ -1393,24 +1449,7 @@ begin
end;
{ llvm can't catch symbol references from inline assembler blocks }
if assigned(srsym) then
begin
case srsym.typ of
staticvarsym:
if not(vo_is_external in tstaticvarsym(srsym).varoptions) then
cnodeutils.RegisterUsedAsmSym(current_asmdata.RefAsmSymbol(srsym.mangledname,AT_DATA),tstaticvarsym(srsym).vardef,true);
procsym:
begin
{ if it's a pure assembler routine, the definition of the symbol will also
be in assembler and it can't be removed by the compiler (and if we mark
it as used anyway, clang will get into trouble) }
if not(po_assembler in tprocdef(tprocsym(srsym).ProcdefList[0]).procoptions) and
not(po_external in tprocdef(tprocsym(srsym).ProcdefList[0]).procoptions) then
cnodeutils.RegisterUsedAsmSym(current_asmdata.RefAsmSymbol(tprocdef(tprocsym(srsym).ProcdefList[0]).mangledname,AT_FUNCTION),tprocdef(tprocsym(srsym).ProcdefList[0]),true);
end;
else
;
end;
end;
MaybeAddSymRef(srsym);
end;