binaryed:first pisi release

This commit is contained in:
blue-devil
2020-09-09 01:40:25 +02:00
parent 164add2c31
commit 29be7b32f5
5 changed files with 293 additions and 0 deletions
+22
View File
@@ -0,0 +1,22 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Licensed under the GNU General Public License, version 3.
# See the file http://www.gnu.org/licenses/gpl.txt
from pisi.actionsapi import get
from pisi.actionsapi import pisitools
from pisi.actionsapi import cmaketools
from pisi.actionsapi import mesontools
def setup():
cmaketools.configure("-Bbuild \
-GNinja \
-DCMAKE_INSTALL_PREFIX=/usr")
def build():
mesontools.build()
def install():
mesontools.install()
pisitools.dodoc("LICENSE", "README*")
@@ -0,0 +1,193 @@
From b43807a835fc878e5eefcb8b4a18aff62d7f4540 Mon Sep 17 00:00:00 2001
From: Alon Zakai <azakai@google.com>
Date: Wed, 19 Aug 2020 14:55:46 -0700
Subject: [PATCH] wasm-emscripten-finalize: Make EM_ASM modifications optional
(#3044)
wasm-emscripten-finalize renames EM_ASM calls to have the signature in
the name. This isn't actually useful - emscripten doesn't benefit from that. I
think it was optimized in fastcomp, and in upstream we copied the general
form but not the optimizations, and then EM_JS came along which is
easier to optimize anyhow.
This PR makes those changes optional: when not doing them, it just
leaves the calls as they are. Emscripten will need some changes to
handle that, but those are simple.
For convenience this adds a flag to "minimize wasm changes". The idea
is that this flag avoids needing a double-roll or other inconvenience
as the changes need to happen in tandem on the emscripten side.
The same flag can be reused for later changes similar to this one.
When they are all done we can remove the flag. (Note how the code
ifdefed by the flag can be removed once we no longer need the old
way of doing things - that is, the new approach is simpler on the
binaryen side).
See #3043
---
src/tools/wasm-emscripten-finalize.cpp | 11 +++++++
src/wasm-emscripten.h | 4 +++
src/wasm/wasm-emscripten.cpp | 40 +++++++++++++++++---------
3 files changed, 42 insertions(+), 13 deletions(-)
diff --git a/src/tools/wasm-emscripten-finalize.cpp b/src/tools/wasm-emscripten-finalize.cpp
index ce1da4c9e1..960c6870cf 100644
--- a/src/tools/wasm-emscripten-finalize.cpp
+++ b/src/tools/wasm-emscripten-finalize.cpp
@@ -56,6 +56,7 @@ int main(int argc, const char* argv[]) {
bool checkStackOverflow = false;
uint64_t globalBase = INVALID_BASE;
bool standaloneWasm = false;
+ bool minimizeWasmChanges = false;
ToolOptions options("wasm-emscripten-finalize",
"Performs Emscripten-specific transforms on .wasm files");
@@ -163,6 +164,15 @@ int main(int argc, const char* argv[]) {
[&standaloneWasm](Options* o, const std::string&) {
standaloneWasm = true;
})
+ .add("--minimize-wasm-changes",
+ "",
+ "Modify the wasm as little as possible. This is useful during "
+ "development as we reduce the number of changes to the wasm, as it "
+ "lets emscripten control how much modifications to do.",
+ Options::Arguments::Zero,
+ [&minimizeWasmChanges](Options* o, const std::string&) {
+ minimizeWasmChanges = true;
+ })
.add_positional("INFILE",
Options::Arguments::One,
[&infile](Options* o, const std::string& argument) {
@@ -222,6 +232,7 @@ int main(int argc, const char* argv[]) {
EmscriptenGlueGenerator generator(wasm);
generator.setStandalone(standaloneWasm);
generator.setSideModule(sideModule);
+ generator.setMinimizeWasmChanges(minimizeWasmChanges);
generator.fixInvokeFunctionNames();
diff --git a/src/wasm-emscripten.h b/src/wasm-emscripten.h
index 395c76a160..fe8b8ed36a 100644
--- a/src/wasm-emscripten.h
+++ b/src/wasm-emscripten.h
@@ -35,6 +35,9 @@ class EmscriptenGlueGenerator {
void setStandalone(bool standalone_) { standalone = standalone_; }
void setSideModule(bool sideModule_) { sideModule = sideModule_; }
+ void setMinimizeWasmChanges(bool minimizeWasmChanges_) {
+ minimizeWasmChanges = minimizeWasmChanges_;
+ }
Function* generateMemoryGrowthFunction();
Function* generateAssignGOTEntriesFunction();
@@ -71,6 +74,7 @@ class EmscriptenGlueGenerator {
bool useStackPointerGlobal;
bool standalone;
bool sideModule;
+ bool minimizeWasmChanges;
// Used by generateDynCallThunk to track all the dynCall functions created
// so far.
std::unordered_set<Signature> sigs;
diff --git a/src/wasm/wasm-emscripten.cpp b/src/wasm/wasm-emscripten.cpp
index e4664e645c..f4da0e6e7a 100644
--- a/src/wasm/wasm-emscripten.cpp
+++ b/src/wasm/wasm-emscripten.cpp
@@ -320,6 +320,7 @@ std::string proxyingSuffix(Proxying proxy) {
struct AsmConstWalker : public LinearExecutionWalker<AsmConstWalker> {
Module& wasm;
+ bool minimizeWasmChanges;
std::vector<Address> segmentOffsets; // segment index => address offset
struct AsmConst {
@@ -334,8 +335,9 @@ struct AsmConstWalker : public LinearExecutionWalker<AsmConstWalker> {
// last sets in the current basic block, per index
std::map<Index, LocalSet*> sets;
- AsmConstWalker(Module& _wasm)
- : wasm(_wasm), segmentOffsets(getSegmentOffsets(wasm)) {}
+ AsmConstWalker(Module& _wasm, bool minimizeWasmChanges)
+ : wasm(_wasm), minimizeWasmChanges(minimizeWasmChanges),
+ segmentOffsets(getSegmentOffsets(wasm)) {}
void noteNonLinear(Expression* curr);
@@ -426,7 +428,9 @@ void AsmConstWalker::visitCall(Call* curr) {
int32_t address = value->value.geti32();
auto code = codeForConstAddr(wasm, segmentOffsets, address);
auto& asmConst = createAsmConst(address, code, sig, importName);
- fixupName(curr->target, baseSig, asmConst.proxy);
+ if (!minimizeWasmChanges) {
+ fixupName(curr->target, baseSig, asmConst.proxy);
+ }
}
Proxying AsmConstWalker::proxyType(Name name) {
@@ -439,6 +443,9 @@ Proxying AsmConstWalker::proxyType(Name name) {
}
void AsmConstWalker::visitTable(Table* curr) {
+ if (minimizeWasmChanges) {
+ return;
+ }
for (auto& segment : curr->segments) {
for (auto& name : segment.data) {
auto* func = wasm.getFunction(name);
@@ -515,24 +522,30 @@ void AsmConstWalker::addImports() {
}
}
-AsmConstWalker fixEmAsmConstsAndReturnWalker(Module& wasm) {
+static AsmConstWalker fixEmAsmConstsAndReturnWalker(Module& wasm,
+ bool minimizeWasmChanges) {
// Collect imports to remove
// This would find our generated functions if we ran it later
std::vector<Name> toRemove;
- for (auto& import : wasm.functions) {
- if (import->imported() && import->base.hasSubstring(EM_ASM_PREFIX)) {
- toRemove.push_back(import->name);
+ if (!minimizeWasmChanges) {
+ for (auto& import : wasm.functions) {
+ if (import->imported() && import->base.hasSubstring(EM_ASM_PREFIX)) {
+ toRemove.push_back(import->name);
+ }
}
}
// Walk the module, generate _sig versions of EM_ASM functions
- AsmConstWalker walker(wasm);
+ AsmConstWalker walker(wasm, minimizeWasmChanges);
walker.process();
- // Remove the base functions that we didn't generate
- for (auto importName : toRemove) {
- wasm.removeFunction(importName);
+ if (!minimizeWasmChanges) {
+ // Remove the base functions that we didn't generate
+ for (auto importName : toRemove) {
+ wasm.removeFunction(importName);
+ }
}
+
return walker;
}
@@ -754,7 +767,8 @@ std::string EmscriptenGlueGenerator::generateEmscriptenMetadata(
std::stringstream meta;
meta << "{\n";
- AsmConstWalker emAsmWalker = fixEmAsmConstsAndReturnWalker(wasm);
+ AsmConstWalker emAsmWalker =
+ fixEmAsmConstsAndReturnWalker(wasm, minimizeWasmChanges);
// print
commaFirst = true;
@@ -810,7 +824,7 @@ std::string EmscriptenGlueGenerator::generateEmscriptenMetadata(
commaFirst = true;
ModuleUtils::iterImportedFunctions(wasm, [&](Function* import) {
if (emJsWalker.codeByName.count(import->base.str) == 0 &&
- !import->base.startsWith(EM_ASM_PREFIX.str) &&
+ (minimizeWasmChanges || !import->base.startsWith(EM_ASM_PREFIX.str)) &&
!import->base.startsWith("invoke_")) {
if (declares.insert(import->base.str).second) {
meta << nextElement() << '"' << import->base.str << '"';
@@ -0,0 +1,3 @@
#!/bin/sh
export BINARYEN_ROOT="/usr"
+61
View File
@@ -0,0 +1,61 @@
<?xml version="1.0" ?>
<!DOCTYPE PISI SYSTEM "https://www.pisilinux.org/projeler/pisi/pisi-spec.dtd">
<PISI>
<Source>
<Name>binaryen</Name>
<Homepage>https://github.com/WebAssembly/binaryen</Homepage>
<Packager>
<Name>Blue Devil</Name>
<Email>bluedevil@sctzine.com</Email>
</Packager>
<PartOf>programming.library</PartOf>
<License>Apache2.0</License>
<IsA>app:console</IsA>
<IsA>library</IsA>
<Summary>Compiler infrastructure and toolchain library for WebAssembly</Summary>
<Description>Binaryen is a compiler and toolchain infrastructure library for WebAssembly, written in C++. It aims to make compiling to WebAssembly easy, fast, and effective.</Description>
<Archive sha1sum="199d0e0e5205332a64e21fc6308bf8e12b6ab831" type="targz">https://github.com/WebAssembly/binaryen/archive/version_96.tar.gz</Archive>
<BuildDependencies>
<Dependency>cmake</Dependency>
<Dependency>meson</Dependency>
</BuildDependencies>
<Patches>
<Patch level="1">b43807a835fc878e5eefcb8b4a18aff62d7f4540.patch</Patch>
</Patches>
</Source>
<Package>
<Name>binaryen</Name>
<Summary>Extremely fast hash algorithm</Summary>
<Files>
<Path fileType="library">/usr/lib</Path>
<Path fileType="doc">/usr/share/doc</Path>
<Path fileType="executable">/usr/bin</Path>
<Path fileType="config">/etc/profile.d/binaryen.sh</Path>
</Files>
<AdditionalFiles>
<AdditionalFile owner="root" target="/etc/profile.d/binaryen.sh" permission="0755">binaryen.sh</AdditionalFile>
</AdditionalFiles>
</Package>
<Package>
<Name>binaryen-devel</Name>
<Summary>Development files for binaryen</Summary>
<RuntimeDependencies>
<Dependency release="current">binaryen</Dependency>
</RuntimeDependencies>
<Files>
<Path fileType="header">/usr/include</Path>
</Files>
</Package>
<History>
<Update release="1">
<Date>2020-09-07</Date>
<Version>96</Version>
<Comment>First pisi release.</Comment>
<Name>Blue Devil</Name>
<Email>bluedevil@sctzine.com</Email>
</Update>
</History>
</PISI>
@@ -0,0 +1,14 @@
<?xml version="1.0" ?>
<PISI>
<Source>
<Name>binaryen</Name>
<Summary xml:lang="tr">C++ ile WebAssembly için yazılış derleyici altyapısı ve araç zinciri.</Summary>
<Description xml:lang="tr">binaryen, C++ ile WebAssembly için yazılış derleyici altyapısı ve araç zinciri sunar. Binaryen, WebAssembly ile derlemeyi kolay, hızlı ve verimli yapmayı amaçlar.</Description>
</Source>
<Package>
<Name>binaryen-devel</Name>
<Summary xml:lang="tr">binaryen için geliştirme dosyaları</Summary>
<Description xml:lang="tr">binaryen-devel, binaryen için geliştirme dosyalarını içerir.</Description>
</Package>
</PISI>