mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-02 23:50:24 +02:00
[PATCH 181/188] using assembler parameters
From 351ab862f931830be30643473e2d073092e1de40 Mon Sep 17 00:00:00 2001 From: Dmitry Boyarintsev <skalogryz.lists@gmail.com> Date: Wed, 8 Apr 2020 13:15:49 -0400 git-svn-id: branches/wasm@46177 -
This commit is contained in:
parent
dbde36f012
commit
ba7661e6f2
@ -6,34 +6,34 @@ uses
|
|||||||
SysUtils, Classes, watparser, watscanner, wasmmodule, wasmbinwriter,
|
SysUtils, Classes, watparser, watscanner, wasmmodule, wasmbinwriter,
|
||||||
wasmnormalize;
|
wasmnormalize;
|
||||||
|
|
||||||
procedure Traverse(p: TWatScanner);
|
type
|
||||||
|
TAsmParams = record
|
||||||
|
SrcFile : string;
|
||||||
|
Reloc : Boolean;
|
||||||
|
DstObjFile : string;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure DefaultParams(out p: TAsmParams);
|
||||||
begin
|
begin
|
||||||
while p.Next do begin
|
p.SrcFile := '';
|
||||||
write(p.token,' ', p.resText);
|
p.Reloc := true;
|
||||||
if p.token = weInstr then
|
p.DstObjFile := '';
|
||||||
write('; inst = $', IntToHex(p.instrCode,2))
|
|
||||||
else if p.token = weError then begin
|
|
||||||
writeln('offset = ',p.ofs,' ',p.resText);
|
|
||||||
break;
|
|
||||||
end;
|
|
||||||
writeln;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure WriteBin(const fndst: string; m: TWasmModule; WriteReloc: Boolean);
|
procedure WriteBin(const p: TAsmParams; m: TWasmModule);
|
||||||
var
|
var
|
||||||
f : TFileStream;
|
f : TFileStream;
|
||||||
begin
|
begin
|
||||||
f := TFileStream.Create(fndst, fmCreate);
|
f := TFileStream.Create(p.DstObjFile, fmCreate);
|
||||||
try
|
try
|
||||||
Normalize(m);
|
Normalize(m);
|
||||||
WriteModule(m, f, WriteReloc, WriteReloc);
|
WriteModule(m, f, p.Reloc, p.Reloc);
|
||||||
finally
|
finally
|
||||||
f.Free;
|
f.Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure Run(const fn: string; const doTraverse: Boolean; doReloc: Boolean);
|
procedure Run(const prm: TAsmParams);
|
||||||
var
|
var
|
||||||
st : TFileStream;
|
st : TFileStream;
|
||||||
s : string;
|
s : string;
|
||||||
@ -41,22 +41,18 @@ var
|
|||||||
m : TWasmModule;
|
m : TWasmModule;
|
||||||
err : string;
|
err : string;
|
||||||
begin
|
begin
|
||||||
st := TFileStream.Create(fn, fmOpenRead or fmShareDenyNone);
|
st := TFileStream.Create(prm.SrcFile, fmOpenRead or fmShareDenyNone);
|
||||||
p := TWatScanner.Create;
|
p := TWatScanner.Create;
|
||||||
try
|
try
|
||||||
SetLength(s, st.Size);
|
SetLength(s, st.Size);
|
||||||
if length(s)>0 then st.Read(s[1], length(s));
|
if length(s)>0 then st.Read(s[1], length(s));
|
||||||
p.SetSource(s);
|
p.SetSource(s);
|
||||||
if doTraverse then begin
|
|
||||||
Traverse(p);
|
|
||||||
Exit;
|
|
||||||
end;
|
|
||||||
m := TWasmModule.Create;
|
m := TWasmModule.Create;
|
||||||
try
|
try
|
||||||
if not ParseModule(p, m, err) then
|
if not ParseModule(p, m, err) then
|
||||||
writeln('Error: ', err)
|
writeln('Error: ', err)
|
||||||
else
|
else
|
||||||
WriteBin( ChangeFileExt(fn,'.wasm'), m, doReloc);
|
WriteBin(prm, m);
|
||||||
finally
|
finally
|
||||||
m.Free;
|
m.Free;
|
||||||
end;
|
end;
|
||||||
@ -66,13 +62,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
procedure ParseParams(var p: TAsmParams);
|
||||||
gFn : string;
|
|
||||||
gCommand : string = '';
|
|
||||||
gReloc : Boolean = true;
|
|
||||||
gCatch : Boolean = false;
|
|
||||||
|
|
||||||
procedure ParseParams;
|
|
||||||
var
|
var
|
||||||
i : integer;
|
i : integer;
|
||||||
s : string;
|
s : string;
|
||||||
@ -83,39 +73,39 @@ begin
|
|||||||
s := ParamStr(i);
|
s := ParamStr(i);
|
||||||
if (s<>'') and (s[1]='-') then begin
|
if (s<>'') and (s[1]='-') then begin
|
||||||
ls := AnsiLowerCase(s);
|
ls := AnsiLowerCase(s);
|
||||||
if ls = '-noreloc' then gReloc := false
|
if ls = '-o' then begin
|
||||||
else if ls = '-catch' then gCatch := true
|
inc(i);
|
||||||
else gCommand:=ls;
|
if (i<=ParamCount) then
|
||||||
|
p.DstObjFile:=ParamStr(i);
|
||||||
|
end;
|
||||||
end else
|
end else
|
||||||
gFn := s;
|
p.SrcFile := s;
|
||||||
inc(i);
|
inc(i);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
if (p.SrcFile<>'') and (p.DstObjFile = '') then
|
||||||
|
p.DstObjFile := ChangeFileExt(p.SrcFile, '.wasm')
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
prm : TAsmParams;
|
||||||
begin
|
begin
|
||||||
ParseParams;
|
DefaultParams(prm);
|
||||||
if (gFn='') then begin
|
ParseParams(prm);
|
||||||
writeln('please sepcify the input .wat file');
|
if (prm.SrcFile='') then begin
|
||||||
writeln('other use:');
|
writeln('please specify the input .wat file');
|
||||||
writeln(' -compile %inpfn%');
|
|
||||||
writeln(' -noreloc - prevents relocation information from being written');
|
|
||||||
writeln(' -traverse %inpfn%');
|
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
if not FileExists(gFn) then begin
|
if not FileExists(prm.SrcFile) then begin
|
||||||
writeln('file doesn''t exist: ', gFn);
|
writeln('file doesn''t exist: ', prm.SrcFile);
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if gCatch then
|
|
||||||
try
|
try
|
||||||
Run(gFn, gCommand = '-traverse', gReloc);
|
Run(prm);
|
||||||
except
|
except
|
||||||
on e: exception do
|
on e: exception do
|
||||||
writeln(e.message);
|
writeln(e.message);
|
||||||
end
|
end
|
||||||
else
|
|
||||||
Run(gFn, gCommand = '-traverse', gReloc);
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user