diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/emscripten-optimizer/colors.h | 72 | ||||
-rw-r--r-- | src/s2wasm.h | 19 | ||||
-rw-r--r-- | src/wasm-interpreter.h | 27 | ||||
-rw-r--r-- | src/wasm-validator.h | 30 | ||||
-rw-r--r-- | src/wasm.h | 1 |
5 files changed, 77 insertions, 72 deletions
diff --git a/src/emscripten-optimizer/colors.h b/src/emscripten-optimizer/colors.h index c3f48113f..bd12f0c6b 100644 --- a/src/emscripten-optimizer/colors.h +++ b/src/emscripten-optimizer/colors.h @@ -17,64 +17,32 @@ #ifndef wasm_color_h #define wasm_color_h -#include <unistd.h> #include <cstdlib> #include <ostream> -namespace Colors { - inline bool use() { - return (getenv("COLORS") && getenv("COLORS")[0] == '1') || // forced - (isatty(STDOUT_FILENO) && (!getenv("COLORS") || getenv("COLORS")[0] != '0')); // implicit - } - - inline void normal(std::ostream& stream) { - if (!use()) return; -#if defined(__linux__) || defined(__apple__) - stream << "\033[0m"; -#endif - } - inline void red(std::ostream& stream) { - if (!use()) return; -#if defined(__linux__) || defined(__apple__) - stream << "\033[31m"; -#endif - } - inline void magenta(std::ostream& stream) { - if (!use()) return; -#if defined(__linux__) || defined(__apple__) - stream << "\033[35m"; -#endif - } - inline void orange(std::ostream& stream) { - if (!use()) return; -#if defined(__linux__) || defined(__apple__) - stream << "\033[33m"; -#endif - } - inline void grey(std::ostream& stream) { - if (!use()) return; -#if defined(__linux__) || defined(__apple__) - stream << "\033[37m"; -#endif - } - inline void green(std::ostream& stream) { - if (!use()) return; #if defined(__linux__) || defined(__apple__) - stream << "\033[32m"; -#endif - } - inline void blue(std::ostream& stream) { - if (!use()) return; -#if defined(__linux__) || defined(__apple__) - stream << "\033[34m"; -#endif +#include <unistd.h> + +namespace Colors { + inline void outputColorCode(std::ostream& stream,const char* colorCode) { + if((getenv("COLORS") && getenv("COLORS")[0] == '1') || // forced + (isatty(STDOUT_FILENO) && (!getenv("COLORS") || getenv("COLORS")[0] != '0'))) { // implicit + stream << colorCode; + } } - inline void bold(std::ostream& stream) { - if (!use()) return; -#if defined(__linux__) || defined(__apple__) - stream << "\033[1m"; +#else +namespace Colors { + inline void outputColorCode(std::ostream& stream,const char* colorCode) {} #endif - } + + inline void normal(std::ostream& stream) { outputColorCode(stream,"\033[0m"); } + inline void red(std::ostream& stream) { outputColorCode(stream,"\033[31m"); } + inline void magenta(std::ostream& stream) { outputColorCode(stream,"\033[35m"); } + inline void orange(std::ostream& stream) { outputColorCode(stream,"\033[33m"); } + inline void grey(std::ostream& stream) { outputColorCode(stream,"\033[37m"); } + inline void green(std::ostream& stream) { outputColorCode(stream,"\033[32m"); } + inline void blue(std::ostream& stream) { outputColorCode(stream,"\033[34m"); } + inline void bold(std::ostream& stream) { outputColorCode(stream,"\033[1m"); } }; #endif // wasm_color_h diff --git a/src/s2wasm.h b/src/s2wasm.h index 57d5768b8..74387859e 100644 --- a/src/s2wasm.h +++ b/src/s2wasm.h @@ -76,6 +76,8 @@ private: std::map<size_t, size_t> addressSegments; // address => segment index + std::map<Name, size_t> functionIndexes; + // utilities void skipWhitespace() { @@ -972,11 +974,20 @@ private: Name name = triple.name; size_t offset = triple.offset; const auto &symbolAddress = staticAddresses.find(name); - if (symbolAddress == staticAddresses.end()) { - std::cerr << "Unknown symbol: " << name << '\n'; - abort_on("Unknown symbol"); + if (symbolAddress != staticAddresses.end()) { + curr->value = Literal(symbolAddress->second + offset); + } else { + // must be a function address + if (wasm.functionsMap.count(name) == 0) { + std::cerr << "Unknown symbol: " << name << '\n'; + abort_on("Unknown symbol"); + } + if (functionIndexes.count(name) == 0) { + functionIndexes[name] = functionIndexes.size(); + wasm.table.names.push_back(name); + } + curr->value = Literal(functionIndexes[name] + offset); } - curr->value = Literal(symbolAddress->second + offset); assert(curr->value.i32 > 0); curr->type = i32; } diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 97958b041..76c3f66ba 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -35,6 +35,24 @@ using namespace cashew; IString WASM("wasm"); + +#ifdef WIN32 +#include <intrin.h> + +int32_t safe_clz(int32_t v) { + unsigned long result; + return _BitScanReverse(&result,v) ? result : 32; +} + +int32_t safe_ctz(int32_t v) { + unsigned long result; + return _BitScanForward(&result,v) ? result : 32; +} + +int32_t platform_popcount(int32_t v) { + return __popcnt(v); +} +#else int32_t safe_clz(int32_t v) { if (v == 0) return 32; return __builtin_clz(v); @@ -45,6 +63,11 @@ int32_t safe_ctz(int32_t v) { return __builtin_ctz(v); } +int32_t platform_popcount(int32_t v) { + return __buildin_popcount(v); +} +#endif + enum { pageSize = 64*1024, maxCallDepth = 250 @@ -374,7 +397,7 @@ private: if (v == 0) return Literal(32); return Literal((int32_t)safe_ctz(v)); } - case Popcnt: return Literal((int32_t)__builtin_popcount(v)); + case Popcnt: return Literal((int32_t)platform_popcount(v)); case ReinterpretInt: { float v = value.reinterpretf32(); if (isnan(v)) { @@ -403,7 +426,7 @@ private: if (low == 0) return Literal(32+(int64_t)safe_ctz(high)); return Literal((int64_t)safe_ctz(low)); } - case Popcnt: return Literal(int64_t(__builtin_popcount(low) + __builtin_popcount(high))); + case Popcnt: return Literal(int64_t(platform_popcount(low) + platform_popcount(high))); case WrapInt64: return Literal(int32_t(value.geti64())); case ReinterpretInt: { return Literal(value.reinterpretf64()); diff --git a/src/wasm-validator.h b/src/wasm-validator.h index af0c4ba9d..f0e73fb85 100644 --- a/src/wasm-validator.h +++ b/src/wasm-validator.h @@ -39,20 +39,7 @@ public: void visitLoop(Loop *curr) override { if (curr->in.is()) { - // the "in" label has a none type, since no one can receive its value. make sure no one breaks to it with a value. - struct ChildChecker : public WasmWalker { - Name in; - bool valid = true; - - ChildChecker(Name in) : in(in) {} - - void visitBreak(Break *curr) override { - if (curr->name == in && curr->value) { - valid = false; - } - } - }; - ChildChecker childChecker(curr->in); + LoopChildChecker childChecker(curr->in); childChecker.walk(curr->body); shouldBeTrue(childChecker.valid); } @@ -109,6 +96,21 @@ public: } private: + + // the "in" label has a none type, since no one can receive its value. make sure no one breaks to it with a value. + struct LoopChildChecker : public WasmWalker { + Name in; + bool valid = true; + + LoopChildChecker(Name in) : in(in) {} + + void visitBreak(Break *curr) override { + if (curr->name == in && curr->value) { + valid = false; + } + } + }; + // helpers void shouldBeTrue(bool result) { diff --git a/src/wasm.h b/src/wasm.h index df7731094..86aca1fd3 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -51,6 +51,7 @@ #include <fstream> #include <map> #include <vector> +#include <string> #include "compiler-support.h" #include "emscripten-optimizer/simple_ast.h" |