+ write the global procedures/functions in the llvm-mc assembler writer

git-svn-id: branches/wasm@46698 -
This commit is contained in:
nickysn 2020-08-26 16:58:17 +00:00
parent 44d8dd2d43
commit 2d39ddf85e
2 changed files with 72 additions and 1 deletions

View File

@ -1548,6 +1548,18 @@ implementation
end;
writer.AsmLn;
end;
{$ifdef WASM}
ait_local:
begin
writer.AsmWriteLn(asminfo^.comment+'TODO: ait_local');
end;
ait_importexport:
begin
writer.AsmWriteLn(asminfo^.comment+'TODO: ait_importexport');
end;
{$endif WASM}
else
if not WriteComments(hp) then
internalerror(2006012201);

View File

@ -30,6 +30,7 @@ interface
uses
systems,
globtype,globals,
symbase,symdef,symtype,symconst,symcpu,
aasmbase,aasmtai,aasmdata,
assemble,aggas;
@ -39,9 +40,13 @@ interface
TLLVMMachineCodePlaygroundAssembler=class(TGNUassembler)
protected
procedure WriteProcDef(pd: tprocdef);
procedure WriteSymtableProcdefs(st: TSymtable);
function sectionname(atype:TAsmSectiontype;const aname:string;aorder:TAsmSectionOrder):string;override;
public
constructor CreateWithWriter(info: pasminfo; wr: TExternalAssemblerOutputFile; freewriter, smart: boolean); override;
procedure WriteAsmList;override;
end;
{ TWASM32InstrWriter }
@ -54,12 +59,57 @@ implementation
uses
cutils,
finput,
fmodule,finput,
cpubase;
{ TLLVMMachineCodePlaygroundAssembler }
procedure TLLVMMachineCodePlaygroundAssembler.WriteProcDef(pd: tprocdef);
begin
if not assigned(tcpuprocdef(pd).exprasmlist) and
not(po_abstractmethod in pd.procoptions) and
(pd.proctypeoption in [potype_unitinit,potype_unitfinalize]) then
exit;
writer.AsmWriteLn(asminfo^.comment+'WriteProcDef('+pd.mangledname+')');
WriteTree(tcpuprocdef(pd).exprasmlist);
writer.AsmWriteLn(asminfo^.comment+'WriteProcDef('+pd.mangledname+') done');
end;
procedure TLLVMMachineCodePlaygroundAssembler.WriteSymtableProcdefs(st: TSymtable);
var
i : longint;
def : tdef;
begin
if not assigned(st) then
exit;
for i:=0 to st.DefList.Count-1 do
begin
def:=tdef(st.DefList[i]);
case def.typ of
procdef :
begin
{ methods are also in the static/globalsymtable of the unit
-> make sure they are only written for the objectdefs that
own them }
if (not(st.symtabletype in [staticsymtable,globalsymtable]) or
(def.owner=st)) and
not(df_generic in def.defoptions) then
begin
WriteProcDef(tprocdef(def));
if assigned(tprocdef(def).localst) then
WriteSymtableProcdefs(tprocdef(def).localst);
end;
end;
else
;
end;
end;
end;
function TLLVMMachineCodePlaygroundAssembler.sectionname(atype: TAsmSectiontype; const aname: string; aorder: TAsmSectionOrder): string;
begin
Result:=inherited sectionname(atype, aname, aorder)+',"",@';
@ -73,6 +123,15 @@ implementation
end;
procedure TLLVMMachineCodePlaygroundAssembler.WriteAsmList;
begin
inherited;
{ print all global procedures/functions }
WriteSymtableProcdefs(current_module.globalsymtable);
WriteSymtableProcdefs(current_module.localsymtable);
end;
{ TWASM32InstrWriter }