mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 07:29:25 +02:00
* also register symbols referenced from assembler via asolutevarsyms
git-svn-id: trunk@42307 -
This commit is contained in:
parent
c425c51963
commit
98f55b1d86
@ -1331,6 +1331,62 @@ end;
|
|||||||
Symbol table helper routines
|
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);
|
procedure AsmSearchSym(const s:string;out srsym:tsym;out srsymtable:TSymtable);
|
||||||
var
|
var
|
||||||
i : integer;
|
i : integer;
|
||||||
@ -1393,24 +1449,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
{ llvm can't catch symbol references from inline assembler blocks }
|
{ llvm can't catch symbol references from inline assembler blocks }
|
||||||
if assigned(srsym) then
|
if assigned(srsym) then
|
||||||
begin
|
MaybeAddSymRef(srsym);
|
||||||
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;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user