aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2022-12-05 03:44:35 -0500
committerAndrew Kelley <andrew@ziglang.org>2022-12-06 12:15:04 -0700
commit9f4ef4de23927f724413efa6ef54c2cd08a05976 (patch)
tree8463c0e7dbbb4d1c4410a8a568b620e46cb0800b
parentfdb98c5ce121e80582aee9854bbe2543af725a74 (diff)
downloadzig-9f4ef4de23927f724413efa6ef54c2cd08a05976.tar.gz
zig-9f4ef4de23927f724413efa6ef54c2cd08a05976.zip
wasm2c: remove unnecessary brackets to reduce max bracket depth
This avoids the need to pass `-fbracket-depth=512` to clang.
-rw-r--r--CMakeLists.txt3
-rw-r--r--stage1/FuncGen.h20
-rw-r--r--stage1/wasm2c.c20
3 files changed, 29 insertions, 14 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 956a44482a..f08e95bae9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -731,9 +731,6 @@ else()
set(ZIG_WASM2C_COMPILE_FLAGS "-std=c99 -O2")
set(ZIG1_COMPILE_FLAGS "-std=c99 -Os")
set(ZIG2_COMPILE_FLAGS "-std=c99 -O0")
- if(CMAKE_C_COMPILER_ID MATCHES "Clang")
- set(ZIG1_COMPILE_FLAGS "${ZIG1_COMPILE_FLAGS} -fbracket-depth=512")
- endif()
if(CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
set(ZIG2_LINK_FLAGS "-Wl,-stack_size,0x10000000")
else()
diff --git a/stage1/FuncGen.h b/stage1/FuncGen.h
index 11bd4198f0..41717c3d49 100644
--- a/stage1/FuncGen.h
+++ b/stage1/FuncGen.h
@@ -119,9 +119,15 @@ static void FuncGen_blockBegin(struct FuncGen *self, FILE *out, enum WasmOpcode
if (self->block == NULL) panic("out of memory");
}
uint32_t label = FuncGen_localAlloc(self, type < 0 ? ~(int8_t)kind : (int8_t)kind);
- FuncGen_indent(self, out);
- if (kind == WasmOpcode_if) fprintf(out, "if (l%" PRIu32 ") ", FuncGen_stackPop(self));
- fputs("{\n", out);
+
+ if (kind == WasmOpcode_if) {
+ FuncGen_indent(self, out);
+ fprintf(out, "if (l%" PRIu32 ") {\n", FuncGen_stackPop(self));
+ } else if (EXTRA_BRACES) {
+ FuncGen_indent(self, out);
+ fputs("{\n", out);
+ }
+
self->block[self->block_i].type = type < 0 ? ~type : type;
self->block[self->block_i].label = label;
self->block[self->block_i].stack_i = self->stack_i;
@@ -148,8 +154,12 @@ static void FuncGen_blockEnd(struct FuncGen *self, FILE *out) {
uint32_t label = FuncGen_blockLabel(self, 0);
if (kind != WasmOpcode_loop) FuncGen_label(self, out, label);
self->block_i -= 1;
- FuncGen_indent(self, out);
- fputs("}\n", out);
+
+ if (EXTRA_BRACES || kind == WasmOpcode_if) {
+ FuncGen_indent(self, out);
+ fputs("}\n", out);
+ }
+
if (self->stack_i != self->block[self->block_i].stack_i) {
FuncGen_indent(self, out);
fprintf(out, "// stack mismatch %u != %u\n", self->stack_i, self->block[self->block_i].stack_i);
diff --git a/stage1/wasm2c.c b/stage1/wasm2c.c
index 30258bd736..26705a51d3 100644
--- a/stage1/wasm2c.c
+++ b/stage1/wasm2c.c
@@ -1,3 +1,5 @@
+#define EXTRA_BRACES 0
+
#include "FuncGen.h"
#include "InputStream.h"
#include "panic.h"
@@ -800,10 +802,14 @@ int main(int argc, char **argv) {
FuncType_blockType(types, FuncGen_blockType(&fg, label_idx));
uint32_t label = FuncGen_blockLabel(&fg, label_idx);
- FuncGen_indent(&fg, out);
- if (opcode == WasmOpcode_br_if)
- fprintf(out, "if (l%" PRIu32 ") ", FuncGen_stackPop(&fg));
- fputs("{\n", out);
+ if (opcode == WasmOpcode_br_if) {
+ FuncGen_indent(&fg, out);
+ fprintf(out, "if (l%" PRIu32 ") {\n", FuncGen_stackPop(&fg));
+ } else if (EXTRA_BRACES) {
+ FuncGen_indent(&fg, out);
+ fputs("{\n", out);
+ }
+
const struct ResultType *label_type;
uint32_t lhs;
switch (kind) {
@@ -833,8 +839,10 @@ int main(int argc, char **argv) {
}
FuncGen_cont(&fg, out);
fprintf(out, "goto l%" PRIu32 ";\n", label);
- FuncGen_indent(&fg, out);
- fprintf(out, "}\n");
+ if (EXTRA_BRACES || opcode == WasmOpcode_br_if) {
+ FuncGen_indent(&fg, out);
+ fputs("}\n", out);
+ }
if (opcode == WasmOpcode_br) unreachable_depth += 1;
}
break;