summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/support/CMakeLists.txt1
-rw-r--r--src/support/path.cpp65
-rw-r--r--src/support/path.h37
-rw-r--r--src/tools/wasm-reduce.cpp60
4 files changed, 109 insertions, 54 deletions
diff --git a/src/support/CMakeLists.txt b/src/support/CMakeLists.txt
index b12ef6edd..b3373d076 100644
--- a/src/support/CMakeLists.txt
+++ b/src/support/CMakeLists.txt
@@ -4,6 +4,7 @@ SET(support_SOURCES
colors.cpp
command-line.cpp
file.cpp
+ path.cpp
safe_integer.cpp
threads.cpp
)
diff --git a/src/support/path.cpp b/src/support/path.cpp
new file mode 100644
index 000000000..322099a95
--- /dev/null
+++ b/src/support/path.cpp
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2018 WebAssembly Community Group participants
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//
+// Command line helpers.
+//
+
+#include "support/path.h"
+
+namespace wasm {
+
+namespace Path {
+
+std::string getPathSeparator() {
+ // TODO: use c++17's path separator
+ // http://en.cppreference.com/w/cpp/experimental/fs/path
+#if defined(WIN32) || defined(_WIN32)
+ return "\\";
+#else
+ return "/";
+#endif
+}
+
+std::string getBinaryenRoot() {
+ auto* envVar = getenv("BINARYEN_ROOT");
+ if (envVar) return envVar;
+ return ".";
+}
+
+static std::string binDir;
+
+std::string getBinaryenBinDir() {
+ if (binDir.empty()) {
+ return getBinaryenRoot() + getPathSeparator() + "bin" + getPathSeparator();
+ } else {
+ return binDir;
+ }
+}
+
+void setBinaryenBinDir(std::string dir) {
+ binDir = dir;
+}
+
+// Gets the path to a binaryen binary tool, like wasm-opt
+std::string getBinaryenBinaryTool(std::string name) {
+ return getBinaryenBinDir() + name;
+}
+
+} // namespace Path
+
+} // namespace wasm
+
diff --git a/src/support/path.h b/src/support/path.h
index 5852fcc4d..505ba0d88 100644
--- a/src/support/path.h
+++ b/src/support/path.h
@@ -28,30 +28,19 @@ namespace wasm {
namespace Path {
-inline std::string getPathSeparator() {
- // TODO: use c++17's path separator
- // http://en.cppreference.com/w/cpp/experimental/fs/path
-#if defined(WIN32) || defined(_WIN32)
- return "\\";
-#else
- return "/";
-#endif
-}
-
-inline std::string getBinaryenRoot() {
- auto* envVar = getenv("BINARYEN_ROOT");
- if (envVar) return envVar;
- return ".";
-}
-
-inline std::string getBinaryenBinDir() {
- return getBinaryenRoot() + getPathSeparator() + "bin" + getPathSeparator();
-}
-
-// Gets the path to a binaryen binary tool, like wasm-opt
-inline std::string getBinaryenBinaryTool(std::string name) {
- return getBinaryenBinDir() + name;
-}
+std::string getPathSeparator();
+
+// Get the binaryen root dor.
+std::string getBinaryenRoot();
+
+// Get the binaryen bin dir.
+std::string getBinaryenBinDir();
+
+// Set the binaryen bin dir (allows tools to change it based on user input).
+void setBinaryenBinDir(std::string dir);
+
+// Gets the path to a binaryen binary tool, like wasm-opt.
+std::string getBinaryenBinaryTool(std::string name);
} // namespace Path
diff --git a/src/tools/wasm-reduce.cpp b/src/tools/wasm-reduce.cpp
index f8ed04abb..4a941156d 100644
--- a/src/tools/wasm-reduce.cpp
+++ b/src/tools/wasm-reduce.cpp
@@ -41,28 +41,28 @@
#define NOMINMAX
#endif
#include <Windows.h>
-// Create a string with last error message
-std::string GetLastErrorStdStr() {
- DWORD error = GetLastError();
- if (error) {
- LPVOID lpMsgBuf;
- DWORD bufLen = FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- error,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPTSTR) &lpMsgBuf,
- 0, NULL );
- if (bufLen) {
- LPCSTR lpMsgStr = (LPCSTR)lpMsgBuf;
- std::string result(lpMsgStr, lpMsgStr+bufLen);
- LocalFree(lpMsgBuf);
- return result;
- }
- }
- return std::string();
+// Create a string with last error message
+std::string GetLastErrorStdStr() {
+ DWORD error = GetLastError();
+ if (error) {
+ LPVOID lpMsgBuf;
+ DWORD bufLen = FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ error,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) &lpMsgBuf,
+ 0, NULL );
+ if (bufLen) {
+ LPCSTR lpMsgStr = (LPCSTR)lpMsgBuf;
+ std::string result(lpMsgStr, lpMsgStr+bufLen);
+ LocalFree(lpMsgBuf);
+ return result;
+ }
+ }
+ return std::string();
}
#endif
using namespace wasm;
@@ -216,12 +216,12 @@ ProgramResult expected;
static std::unordered_set<Name> functionsWeTriedToRemove;
struct Reducer : public WalkerPass<PostWalker<Reducer, UnifiedExpressionVisitor<Reducer>>> {
- std::string command, test, working, binaryenBinDir;
+ std::string command, test, working;
bool verbose, debugInfo;
// test is the file we write to that the command will operate on
// working is the current temporary state, the reduction so far
- Reducer(std::string command, std::string test, std::string working, bool verbose, bool debugInfo, std::string binaryenBinDir) : command(command), test(test), working(working), binaryenBinDir(binaryenBinDir), verbose(verbose), debugInfo(debugInfo) {}
+ Reducer(std::string command, std::string test, std::string working, bool verbose, bool debugInfo) : command(command), test(test), working(working), verbose(verbose), debugInfo(debugInfo) {}
// runs passes in order to reduce, until we can't reduce any more
// the criterion here is wasm binary size
@@ -261,7 +261,7 @@ struct Reducer : public WalkerPass<PostWalker<Reducer, UnifiedExpressionVisitor<
// try both combining with a generic shrink (so minor pass overhead is compensated for), and without
for (auto shrinking : { false, true }) {
for (auto pass : passes) {
- std::string currCommand = binaryenBinDir + "wasm-opt" + " ";
+ std::string currCommand = Path::getBinaryenBinaryTool("wasm-opt") + " ";
if (shrinking) currCommand += " --dce --vacuum ";
currCommand += working + " -o " + test + " " + pass;
if (debugInfo) currCommand += " -g ";
@@ -726,7 +726,7 @@ struct Reducer : public WalkerPass<PostWalker<Reducer, UnifiedExpressionVisitor<
//
int main(int argc, const char* argv[]) {
- std::string input, test, working, command, binaryenBinDir = Path::getBinaryenBinDir();
+ std::string input, test, working, command;
bool verbose = false,
debugInfo = false,
force = false;
@@ -750,11 +750,11 @@ int main(int argc, const char* argv[]) {
[&](Options* o, const std::string& argument) {
working = argument;
})
- .add("--binaries", "-b", "binaryen binaries location",
+ .add("--binaries", "-b", "binaryen binaries location (bin/ directory)",
Options::Arguments::One,
[&](Options* o, const std::string& argument) {
// Add separator just in case
- binaryenBinDir = argument + Path::getPathSeparator();
+ Path::setBinaryenBinDir(argument + Path::getPathSeparator());
})
.add("--verbose", "-v", "Verbose output mode",
Options::Arguments::Zero,
@@ -824,7 +824,7 @@ int main(int argc, const char* argv[]) {
std::cerr << "|checking that command has expected behavior on canonicalized (read-written) binary\n";
{
// read and write it
- ProgramResult readWrite(binaryenBinDir + "wasm-opt" + " " + input + " -o " + test);
+ ProgramResult readWrite(Path::getBinaryenBinaryTool("wasm-opt") + " " + input + " -o " + test);
if (readWrite.failed()) {
stopIfNotForced("failed to read and write the binary", readWrite);
} else {
@@ -848,7 +848,7 @@ int main(int argc, const char* argv[]) {
bool stopping = false;
while (1) {
- Reducer reducer(command, test, working, verbose, debugInfo, binaryenBinDir);
+ Reducer reducer(command, test, working, verbose, debugInfo);
// run binaryen optimization passes to reduce. passes are fast to run
// and can often reduce large amounts of code efficiently, as opposed