t_wasi.pas 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. {
  2. Copyright (c) 2019 by Dmitry Boyarintsev
  3. This unit implements support import,export,link routines
  4. for the WASI target
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************
  17. }
  18. unit t_wasi;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. systems,
  23. globtype, globals,
  24. aasmbase,
  25. cfileutl, cutils, cclasses,
  26. import, export, aasmdata, aasmcpu,
  27. fmodule, ogbase,
  28. symsym, symdef,
  29. link,
  30. i_wasi, tgcpu;
  31. type
  32. { texportlibwasi }
  33. texportlibwasi=class(texportlib)
  34. procedure preparelib(const s : string);override;
  35. procedure exportprocedure(hp : texported_item);override;
  36. procedure exportvar(hp : texported_item);override;
  37. procedure generatelib;override;
  38. end;
  39. { timportlibwasi }
  40. timportlibwasi = class(timportlib)
  41. procedure generatelib;override;
  42. end;
  43. { tlinkerwasi }
  44. tlinkerwasi=class(texternallinker)
  45. public
  46. constructor Create;override;
  47. procedure SetDefaultInfo;override;
  48. function MakeExecutable:boolean;override;
  49. function MakeSharedLibrary:boolean;override;
  50. end;
  51. implementation
  52. { timportlibwasi }
  53. procedure timportlibwasi.generatelib;
  54. begin
  55. end;
  56. { tlinkerwasi }
  57. constructor tlinkerwasi.Create;
  58. begin
  59. inherited Create;
  60. end;
  61. procedure tlinkerwasi.SetDefaultInfo;
  62. begin
  63. Info.DllCmd[1] := 'wasm-ld $SONAME $GCSECTIONS -o $EXE';
  64. //Info.DllCmd[2] := 'wasmtool --exportrename $INPUT $EXE';
  65. end;
  66. function tlinkerwasi.MakeExecutable:boolean;
  67. var
  68. GCSectionsStr : ansistring;
  69. binstr, cmdstr : Tcmdstr;
  70. InitStr,
  71. FiniStr,
  72. SoNameStr : string[80];
  73. mapstr,ltostr : TCmdStr;
  74. success : Boolean;
  75. tmp : TCmdStrListItem;
  76. tempFileName : ansistring;
  77. begin
  78. if (cs_link_smart in current_settings.globalswitches) and
  79. create_smartlink_sections then
  80. GCSectionsStr:='--gc-sections'
  81. else
  82. GCSectionsStr:='';
  83. SoNameStr:='';
  84. SplitBinCmd(Info.DllCmd[1],binstr,cmdstr);
  85. Replace(cmdstr,'$EXE',maybequoted(current_module.exefilename));
  86. tmp := TCmdStrListItem(ObjectFiles.First);
  87. while Assigned(tmp) do begin
  88. cmdstr := tmp.Str+ ' ' + cmdstr;
  89. tmp := TCmdStrListItem(tmp.Next);
  90. end;
  91. // if HasExports then
  92. // cmdstr := cmdstr + ' --export-dynamic'; //' --export-dynamic';
  93. cmdstr := cmdstr + ' --no-entry --allow-undefined';
  94. if (cs_link_strip in current_settings.globalswitches) then
  95. begin
  96. { only remove non global symbols and debugging info for a library }
  97. cmdstr := cmdstr + ' --strip-all';
  98. end;
  99. //Replace(cmdstr,'$OPT',Info.ExtraOptions);
  100. //Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
  101. //Replace(cmdstr,'$INIT',InitStr);
  102. //Replace(cmdstr,'$FINI',FiniStr);
  103. Replace(cmdstr,'$SONAME',SoNameStr);
  104. //Replace(cmdstr,'$MAP',mapstr);
  105. //Replace(cmdstr,'$LTO',ltostr);
  106. Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
  107. writeln(utilsprefix+binstr,' ',cmdstr);
  108. success:=DoExec(FindUtil(utilsprefix+binstr),cmdstr,true,false);
  109. //SplitBinCmd(Info.DllCmd[2],binstr,cmdstr);
  110. //Replace(cmdstr,'$INPUT',current_module.objfilename );
  111. //Replace(cmdstr,'$EXE',maybequoted(current_module.exefilename));
  112. //DoExec(FindUtil(utilsprefix+binstr),cmdstr,false,false);
  113. MakeExecutable:=success;
  114. end;
  115. function tlinkerwasi.MakeSharedLibrary: boolean;
  116. var
  117. GCSectionsStr : ansistring;
  118. binstr, cmdstr : Tcmdstr;
  119. InitStr,
  120. FiniStr,
  121. SoNameStr : string[80];
  122. mapstr,ltostr : TCmdStr;
  123. success : Boolean;
  124. tmp : TCmdStrListItem;
  125. tempFileName : ansistring;
  126. begin
  127. //Result := true;
  128. //Result:=inherited MakeSharedLibrary;
  129. if (cs_link_smart in current_settings.globalswitches) and
  130. create_smartlink_sections then
  131. GCSectionsStr:='--gc-sections'
  132. else
  133. GCSectionsStr:='';
  134. SoNameStr:='';
  135. SplitBinCmd(Info.DllCmd[1],binstr,cmdstr);
  136. Replace(cmdstr,'$EXE',maybequoted(current_module.exefilename));
  137. tmp := TCmdStrListItem(ObjectFiles.First);
  138. while Assigned(tmp) do begin
  139. cmdstr := tmp.Str+ ' ' + cmdstr;
  140. tmp := TCmdStrListItem(tmp.Next);
  141. end;
  142. if HasExports then
  143. cmdstr := cmdstr + ' --export-dynamic'; //' --export-dynamic';
  144. cmdstr := cmdstr + ' --no-entry --allow-undefined';
  145. if (cs_link_strip in current_settings.globalswitches) then
  146. begin
  147. { only remove non global symbols and debugging info for a library }
  148. cmdstr := cmdstr + ' --strip-all';
  149. end;
  150. //Replace(cmdstr,'$OPT',Info.ExtraOptions);
  151. //Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
  152. //Replace(cmdstr,'$INIT',InitStr);
  153. //Replace(cmdstr,'$FINI',FiniStr);
  154. Replace(cmdstr,'$SONAME',SoNameStr);
  155. //Replace(cmdstr,'$MAP',mapstr);
  156. //Replace(cmdstr,'$LTO',ltostr);
  157. Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
  158. writeln(utilsprefix+binstr,' ',cmdstr);
  159. success:=DoExec(FindUtil(utilsprefix+binstr),cmdstr,true,false);
  160. //SplitBinCmd(Info.DllCmd[2],binstr,cmdstr);
  161. //Replace(cmdstr,'$INPUT',current_module.objfilename );
  162. //Replace(cmdstr,'$EXE',maybequoted(current_module.exefilename));
  163. //DoExec(FindUtil(utilsprefix+binstr),cmdstr,false,false);
  164. MakeSharedLibrary:=success;
  165. end;
  166. { texportlibwasi }
  167. procedure texportlibwasi.preparelib(const s: string);
  168. begin
  169. //nothing to happen. wasm files are modules
  170. end;
  171. procedure texportlibwasi.exportprocedure(hp: texported_item);
  172. var
  173. nm : TSymStr;
  174. begin
  175. nm := tprocdef(tprocsym(hp.sym).ProcdefList[0]).mangledname;
  176. current_asmdata.asmlists[al_exports].Concat(tai_impexp.create(hp.name^, nm, ie_Func));
  177. end;
  178. procedure texportlibwasi.exportvar(hp: texported_item);
  179. begin
  180. //inherited exportvar(hp);
  181. end;
  182. procedure texportlibwasi.generatelib;
  183. begin
  184. //inherited generatelib;
  185. end;
  186. initialization
  187. RegisterTarget(system_wasi_info);
  188. RegisterImport(system_wasm32_wasi, timportlibwasi);
  189. RegisterExport(system_wasm32_wasi, texportlibwasi);
  190. RegisterLinker(ld_wasi, tlinkerwasi);
  191. end.