Sfoglia il codice sorgente

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

git-svn-id: branches/wasm@46698 -
nickysn 4 anni fa
parent
commit
2d39ddf85e
2 ha cambiato i file con 72 aggiunte e 1 eliminazioni
  1. 12 0
      compiler/aggas.pas
  2. 60 1
      compiler/wasm32/agllvmmc.pas

+ 12 - 0
compiler/aggas.pas

@@ -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);

+ 60 - 1
compiler/wasm32/agllvmmc.pas

@@ -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 }