Browse Source

[PATCH 181/188] using assembler parameters

From 351ab862f931830be30643473e2d073092e1de40 Mon Sep 17 00:00:00 2001
From: Dmitry Boyarintsev <[email protected]>
Date: Wed, 8 Apr 2020 13:15:49 -0400

git-svn-id: branches/wasm@46177 -
nickysn 5 years ago
parent
commit
ba7661e6f2
1 changed files with 41 additions and 51 deletions
  1. 41 51
      utils/wasmbin/wasa.pas

+ 41 - 51
utils/wasmbin/wasa.pas

@@ -6,34 +6,34 @@ uses
   SysUtils, Classes, watparser, watscanner, wasmmodule, wasmbinwriter,
   wasmnormalize;
 
-procedure Traverse(p: TWatScanner);
-begin
-  while p.Next do begin
-    write(p.token,' ', p.resText);
-    if p.token = weInstr then
-      write('; inst = $', IntToHex(p.instrCode,2))
-    else if p.token = weError then begin
-      writeln('offset = ',p.ofs,' ',p.resText);
-      break;
-    end;
-    writeln;
+type
+  TAsmParams = record
+    SrcFile    : string;
+    Reloc      : Boolean;
+    DstObjFile : string;
   end;
+
+procedure DefaultParams(out p: TAsmParams);
+begin
+  p.SrcFile := '';
+  p.Reloc := true;
+  p.DstObjFile := '';
 end;
 
-procedure WriteBin(const fndst: string; m: TWasmModule; WriteReloc: Boolean);
+procedure WriteBin(const p: TAsmParams; m: TWasmModule);
 var
   f : TFileStream;
 begin
-  f := TFileStream.Create(fndst, fmCreate);
+  f := TFileStream.Create(p.DstObjFile, fmCreate);
   try
     Normalize(m);
-    WriteModule(m, f, WriteReloc, WriteReloc);
+    WriteModule(m, f, p.Reloc, p.Reloc);
   finally
     f.Free;
   end;
 end;
 
-procedure Run(const fn: string; const doTraverse: Boolean; doReloc: Boolean);
+procedure Run(const prm: TAsmParams);
 var
   st : TFileStream;
   s  : string;
@@ -41,22 +41,18 @@ var
   m  : TWasmModule;
   err : string;
 begin
-  st := TFileStream.Create(fn, fmOpenRead or fmShareDenyNone);
+  st := TFileStream.Create(prm.SrcFile, fmOpenRead or fmShareDenyNone);
   p := TWatScanner.Create;
   try
     SetLength(s, st.Size);
     if length(s)>0 then st.Read(s[1], length(s));
     p.SetSource(s);
-    if doTraverse then begin
-      Traverse(p);
-      Exit;
-    end;
     m := TWasmModule.Create;
     try
       if not ParseModule(p, m, err) then
         writeln('Error: ', err)
       else
-        WriteBin( ChangeFileExt(fn,'.wasm'), m, doReloc);
+        WriteBin(prm, m);
     finally
       m.Free;
     end;
@@ -66,13 +62,7 @@ begin
   end;
 end;
 
-var
-  gFn      : string;
-  gCommand : string = '';
-  gReloc   : Boolean = true;
-  gCatch   : Boolean = false;
-
-procedure ParseParams;
+procedure ParseParams(var p: TAsmParams);
 var
   i : integer;
   s : string;
@@ -83,39 +73,39 @@ begin
     s := ParamStr(i);
     if (s<>'') and (s[1]='-') then begin
       ls := AnsiLowerCase(s);
-      if ls = '-noreloc' then gReloc := false
-      else if ls = '-catch' then gCatch := true
-      else gCommand:=ls;
+      if ls = '-o' then begin
+        inc(i);
+        if (i<=ParamCount) then
+          p.DstObjFile:=ParamStr(i);
+      end;
     end else
-      gFn := s;
+      p.SrcFile := s;
     inc(i);
   end;
+
+  if (p.SrcFile<>'') and (p.DstObjFile = '') then
+    p.DstObjFile := ChangeFileExt(p.SrcFile, '.wasm')
 end;
 
+var
+  prm  : TAsmParams;
 begin
-  ParseParams;
-  if (gFn='') then begin
-    writeln('please sepcify the input .wat file');
-    writeln('other use:');
-    writeln(' -compile  %inpfn%');
-    writeln('   -noreloc - prevents relocation information from being written');
-    writeln(' -traverse %inpfn%');
+  DefaultParams(prm);
+  ParseParams(prm);
+  if (prm.SrcFile='') then begin
+    writeln('please specify the input .wat file');
     exit;
   end;
-  if not FileExists(gFn) then begin
-    writeln('file doesn''t exist: ', gFn);
+  if not FileExists(prm.SrcFile) then begin
+    writeln('file doesn''t exist: ', prm.SrcFile);
     exit;
   end;
 
-  if gCatch then
-    try
-      Run(gFn, gCommand = '-traverse', gReloc);
-    except
-      on e: exception do
-        writeln(e.message);
-    end
-  else
-    Run(gFn, gCommand = '-traverse', gReloc);
-
+  try
+    Run(prm);
+  except
+    on e: exception do
+      writeln(e.message);
+  end
 end.