From 0275232f16235d9a2d3e7fc03841ef26d6c4376d Mon Sep 17 00:00:00 2001 From: nickysn Date: Wed, 29 Jul 2020 17:38:18 +0000 Subject: [PATCH] [PATCH 37/83] update writing out of symbols, using FPC mangled names From 0158592d68b22162f95cfdf07f0219cce8c262e8 Mon Sep 17 00:00:00 2001 From: Dmitry Boyarintsev Date: Mon, 16 Sep 2019 16:00:20 -0400 git-svn-id: branches/wasm@45914 - --- compiler/systems/t_wasm.pas | 13 ++++--- compiler/wasm/agwat.pas | 71 +++++++++++++++++++++++++++++++++---- compiler/wasm/hlcgcpu.pas | 5 ++- 3 files changed, 77 insertions(+), 12 deletions(-) diff --git a/compiler/systems/t_wasm.pas b/compiler/systems/t_wasm.pas index ffcbf87c02..339d74a157 100644 --- a/compiler/systems/t_wasm.pas +++ b/compiler/systems/t_wasm.pas @@ -5,8 +5,12 @@ interface uses systems, + globtype, + export, aasmdata, aasmcpu, + symsym, symdef, + link, i_wasm, tgcpu; @@ -51,25 +55,24 @@ end; procedure texportlibwasm.preparelib(const s: string); begin - writeln('preparelib: ', s); //nothing to happen. wasm files are modules - //inherited preparelib(s); end; procedure texportlibwasm.exportprocedure(hp: texported_item); +var + nm : TSymStr; begin - current_asmdata.asmlists[al_exports].Concat( tai_impexp.create(hp.name^, hp.sym.RealName, ie_Func)); + nm := tprocdef(tprocsym(hp.sym).ProcdefList[0]).mangledname; + current_asmdata.asmlists[al_exports].Concat(tai_impexp.create(hp.name^, nm, ie_Func)); end; procedure texportlibwasm.exportvar(hp: texported_item); begin - writeln('exportvar: ', PtrUInt(hp)); //inherited exportvar(hp); end; procedure texportlibwasm.generatelib; begin - writeln('gen lib'); //inherited generatelib; end; diff --git a/compiler/wasm/agwat.pas b/compiler/wasm/agwat.pas index 5e34972ab7..9043dd37c4 100644 --- a/compiler/wasm/agwat.pas +++ b/compiler/wasm/agwat.pas @@ -54,6 +54,7 @@ interface procedure WriteProcParams(pd: tprocdef); procedure WriteProcResult(pd: tprocdef); procedure WriteSymtableProcdefs(st: TSymtable); + procedure WriteSymtableVarSyms(st: TSymtable); procedure WriteTempAlloc(p:TAsmList); procedure WriteExports(p: TAsmList); public @@ -144,7 +145,7 @@ implementation function constsingle(s: single): ansistring; begin - result:='0fx'+hexstr(longint(t32bitarray(s)),8); + result:='0x'+hexstr(longint(t32bitarray(s)),8); end; function constdouble(d: double): ansistring; @@ -205,7 +206,6 @@ implementation i : integer; begin //writer.AsmWriteLn('instr'); - //writeln('>',taicpu(hp).opcode); cpu := taicpu(hp); writer.AsmWrite(#9); writer.AsmWrite(wasm_op2str[cpu.opcode] ); @@ -240,12 +240,12 @@ implementation (not is_javainterface(pd.struct) or (pd.proctypeoption in [potype_unitinit,potype_unitfinalize])) then begin - //writeln('mordoy ne vyshel! ',pd.procsym.RealName ); exit; end; writer.AsmWrite('(func '); - writer.AsmWrite( GetWasmName( pd.procsym.RealName )); + writer.AsmWrite( GetWasmName( pd.mangledname )); + //procsym.RealName )); //writer.AsmWriteln(MethodDefinition(pd)); {if jvmtypeneedssignature(pd) then begin @@ -549,8 +549,10 @@ implementation writer.AsmWriteLn('(memory 32768) ;; todo: this should be imported or based on the directives '); { print all global variables } - //WriteSymtableVarSyms(current_module.globalsymtable); - //WriteSymtableVarSyms(current_module.localsymtable); + //current_asmdata.AsmSymbolDict + WriteSymtableVarSyms(current_module.globalsymtable); + WriteSymtableVarSyms(current_module.localsymtable); + //writer.AsmLn; { print all global procedures/functions } WriteSymtableProcdefs(current_module.globalsymtable); @@ -603,6 +605,63 @@ implementation end; end; + procedure TWabtTextAssembler.WriteSymtableVarSyms(st: TSymtable); + var + i : integer; + sym : tsym; + sz : integer; + begin + if not assigned(st) then + exit; + + sz := 0; + for i:=0 to st.SymList.Count-1 do + begin + sym:=tsym(st.SymList[i]); + case sym.typ of + staticvarsym: + begin + //WriteFieldSym(tabstractvarsym(sym)); + //if (sym.typ=staticvarsym) and + // assigned(tstaticvarsym(sym).defaultconstsym) then + // WriteFieldSym(tabstractvarsym(tstaticvarsym(sym).defaultconstsym)); + writer.AsmWrite(#9); + writer.AsmWrite('(global $'); + writer.AsmWrite(tcpustaticvarsym(sym).mangledname); + writer.AsmWrite(' i32 (i32.const '); + writer.AsmWrite( tostr(sz)); + writer.AsmWrite(')'); + writer.AsmWrite(') '); + writer.AsmWriteLn(';; static or field'); + inc(sz, tcpustaticvarsym(sym).getsize); + end; + fieldvarsym: + begin + writer.AsmWriteLn(';; field'); + end; + constsym: + begin + //if (sym.typ=staticvarsym) and + // assigned(tstaticvarsym(sym).defaultconstsym) then + // WriteFieldSym(tabstractvarsym(tstaticvarsym(sym).defaultconstsym)); + //{ multiple procedures can have constants with the same name } + //if not assigned(sym.owner.defowner) or + // (tdef(sym.owner.defowner).typ<>procdef) then + // WriteConstSym(tconstsym(sym)); + writer.AsmWriteLn(';; constant'); + end; + {procsym: + begin + for j:=0 to tprocsym(sym).procdeflist.count-1 do + if not(df_generic in tprocdef(tprocsym(sym).procdeflist[j]).defoptions) then + WriteSymtableVarSyms(tprocdef(tprocsym(sym).procdeflist[j]).localst); + end;} + else + ; + end; + end; + end; + procedure TWabtTextAssembler.WriteTempAlloc(p: TAsmList); var hp: tai; diff --git a/compiler/wasm/hlcgcpu.pas b/compiler/wasm/hlcgcpu.pas index bf66605ff9..3994a9d75c 100644 --- a/compiler/wasm/hlcgcpu.pas +++ b/compiler/wasm/hlcgcpu.pas @@ -1001,7 +1001,10 @@ implementation exit; // setting up memory offset - list.Concat(taicpu.op_const(a_i32_const, 0)); //todo: this should not be 0, this should be reference to a global "memory" + if assigned(ref.symbol) then + list.Concat(taicpu.op_sym(a_get_global, ref.symbol)) + else + list.Concat(taicpu.op_const(a_i32_const, 0)); //todo: this should not be 0, this should be reference to a global "memory" { non-array accesses cannot have an index reg } if ref.index<>NR_NO then