Browse Source

[PATCH 063/188] adding parsing symbol information in a module

From 1177ab082c26a61e6a9942e7f6feda8cb9b13362 Mon Sep 17 00:00:00 2001
From: Dmitry Boyarintsev <[email protected]>
Date: Tue, 3 Mar 2020 10:57:19 -0500

git-svn-id: branches/wasm@46059 -
nickysn 5 years ago
parent
commit
347803d631
1 changed files with 72 additions and 13 deletions
  1. 72 13
      utils/wasmbin/watparser.pas

+ 72 - 13
utils/wasmbin/watparser.pas

@@ -20,7 +20,7 @@ const
      'uknown', 'error',
      'uknown', 'error',
      'index',
      'index',
      'string', 'number', '(', ')',
      'string', 'number', '(', ')',
-     'linksymbol',
+     'assembler symbol',
 
 
      'instruction',
      'instruction',
      'func',
      'func',
@@ -49,6 +49,20 @@ type
     constructor Create(const amsg: string; aofs: integer);
     constructor Create(const amsg: string; aofs: integer);
   end;
   end;
 
 
+  TAsmSym = record
+    name  : string;
+    value : string;
+  end;
+
+  { TAsmSymList }
+
+  TAsmSymList = class(TObject)
+    syms  : array of TAsmSym;
+    count : integer;
+    procedure Push(const AName, AValue: string);
+    procedure Clear;
+  end;
+
 const
 const
   WAT_DEFTYPES='iN or fN';
   WAT_DEFTYPES='iN or fN';
 
 
@@ -296,27 +310,46 @@ begin
   ConsumeToken(sc, weCloseBrace);
   ConsumeToken(sc, weCloseBrace);
 end;
 end;
 
 
+procedure ConsumeAsmSym(sc: TWatScanner; dst: TAsmSymList);
+begin
+  dst.Push(sc.asmCmd, sc.resText);
+  sc.Next;
+end;
+
 procedure ParseModuleInt(sc: TWatScanner; dst: TWasmModule);
 procedure ParseModuleInt(sc: TWatScanner; dst: TWasmModule);
 var
 var
   tk : TWatToken;
   tk : TWatToken;
+  symlist : TAsmSymList;
 begin
 begin
   if not ConsumeOpenToken(sc, weModule) then
   if not ConsumeOpenToken(sc, weModule) then
     ErrorExpectButFound(sc, 'module');
     ErrorExpectButFound(sc, 'module');
 
 
-  sc.Next;
-  ConsumeAnyOpenToken(sc, tk);
-  while tk <> weCloseBrace do begin
-    case tk of
-      weFunc:
-        ParseFunc(sc, dst.AddFunc);
-      weExport:
-        ParseExport(sc, dst.AddExport);
-    else
-      ErrorExpectButFound(sc, 'func', TokenStr[sc.token]);
-    end;
+  symlist := TAsmSymList.Create;
+  try
+    sc.Next;
     ConsumeAnyOpenToken(sc, tk);
     ConsumeAnyOpenToken(sc, tk);
+    while tk <> weCloseBrace do begin
+      case tk of
+        weAsmSymbol:
+          ConsumeAsmSym(sc, symlist);
+        weFunc: begin
+          ParseFunc(sc, dst.AddFunc);
+          symlist.Clear;
+        end;
+        weExport:
+        begin
+          ParseExport(sc, dst.AddExport);
+          symlist.Clear;
+        end;
+      else
+        ErrorExpectButFound(sc, 'func', TokenStr[sc.token]);
+      end;
+      ConsumeAnyOpenToken(sc, tk);
+    end;
+    ConsumeToken(sc, weCloseBrace);
+  finally
+    symlist.Free;
   end;
   end;
-  ConsumeToken(sc, weCloseBrace);
 end;
 end;
 
 
 function ParseModule(sc: TWatScanner; dst: TWasmModule; var errMsg: string): Boolean;
 function ParseModule(sc: TWatScanner; dst: TWasmModule; var errMsg: string): Boolean;
@@ -369,6 +402,32 @@ begin
   end;
   end;
 end;
 end;
 
 
+{ TAsmSymList }
+
+procedure TAsmSymList.Push(const AName, AValue: string);
+var
+  i : integer;
+begin
+  for i:=0 to count-1 do
+    if syms[i].name = Aname then begin
+      syms[i].value := AValue;
+      Exit;
+    end;
+
+  if count=length(syms) then begin
+    if count=0 then SetLength(syms, 4)
+    else SetLength(syms, count*2);
+  end;
+  syms[count].name:=AName;
+  syms[count].value:=Avalue;
+  inc(count);
+end;
+
+procedure TAsmSymList.Clear;
+begin
+  count:=0;
+end;
+
 { EParserError }
 { EParserError }
 
 
 constructor EParserError.Create(const amsg: string; aofs: integer);
 constructor EParserError.Create(const amsg: string; aofs: integer);