Skip to content

Commit 58d13ae

Browse files
authored
Fuzzer: create and use globals in fuzz programs (#1217)
1 parent 874fc08 commit 58d13ae

File tree

2 files changed

+974
-373
lines changed

2 files changed

+974
-373
lines changed

src/tools/translate-to-fuzz.h

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ class TranslateToFuzzReader {
141141
void build() {
142142
setupMemory();
143143
setupTable();
144+
setupGlobals();
144145
// keep adding functions until we run out of input
145146
while (!finishedInput) {
146147
addFunction();
@@ -172,6 +173,24 @@ class TranslateToFuzzReader {
172173
wasm.table.segments.emplace_back(builder.makeConst(Literal(int32_t(0))));
173174
}
174175

176+
std::map<WasmType, std::vector<Name>> globalsByType;
177+
178+
void setupGlobals() {
179+
size_t index = 0;
180+
for (auto type : { i32, i64, f32, f64 }) {
181+
auto num = upTo(3);
182+
for (size_t i = 0; i < num; i++) {
183+
auto* glob = new Global;
184+
glob->name = std::string("global$") + std::to_string(index++);
185+
glob->type = type;
186+
glob->init = makeConst(type);
187+
glob->mutable_ = true;
188+
wasm.addGlobal(glob);
189+
globalsByType[type].push_back(glob->name);
190+
}
191+
}
192+
}
193+
175194
void finalizeTable() {
176195
wasm.table.initial = wasm.table.segments[0].data.size();
177196
wasm.table.max = oneIn(2) ? Address(Table::kMaxSize) : wasm.table.initial;
@@ -369,7 +388,7 @@ class TranslateToFuzzReader {
369388
}
370389

371390
Expression* _makei32() {
372-
switch (upTo(13)) {
391+
switch (upTo(14)) {
373392
case 0: return makeBlock(i32);
374393
case 1: return makeIf(i32);
375394
case 2: return makeLoop(i32);
@@ -383,12 +402,13 @@ class TranslateToFuzzReader {
383402
case 10: return makeUnary(i32);
384403
case 11: return makeBinary(i32);
385404
case 12: return makeSelect(i32);
405+
case 13: return makeGetGlobal(i32);
386406
}
387407
WASM_UNREACHABLE();
388408
}
389409

390410
Expression* _makei64() {
391-
switch (upTo(13)) {
411+
switch (upTo(14)) {
392412
case 0: return makeBlock(i64);
393413
case 1: return makeIf(i64);
394414
case 2: return makeLoop(i64);
@@ -402,12 +422,13 @@ class TranslateToFuzzReader {
402422
case 10: return makeUnary(i64);
403423
case 11: return makeBinary(i64);
404424
case 12: return makeSelect(i64);
425+
case 13: return makeGetGlobal(i64);
405426
}
406427
WASM_UNREACHABLE();
407428
}
408429

409430
Expression* _makef32() {
410-
switch (upTo(13)) {
431+
switch (upTo(14)) {
411432
case 0: return makeBlock(f32);
412433
case 1: return makeIf(f32);
413434
case 2: return makeLoop(f32);
@@ -421,12 +442,13 @@ class TranslateToFuzzReader {
421442
case 10: return makeUnary(f32);
422443
case 11: return makeBinary(f32);
423444
case 12: return makeSelect(f32);
445+
case 13: return makeGetGlobal(f32);
424446
}
425447
WASM_UNREACHABLE();
426448
}
427449

428450
Expression* _makef64() {
429-
switch (upTo(13)) {
451+
switch (upTo(14)) {
430452
case 0: return makeBlock(f64);
431453
case 1: return makeIf(f64);
432454
case 2: return makeLoop(f64);
@@ -440,12 +462,13 @@ class TranslateToFuzzReader {
440462
case 10: return makeUnary(f64);
441463
case 11: return makeBinary(f64);
442464
case 12: return makeSelect(f64);
465+
case 13: return makeGetGlobal(f64);
443466
}
444467
WASM_UNREACHABLE();
445468
}
446469

447470
Expression* _makenone() {
448-
switch (upTo(10)) {
471+
switch (upTo(11)) {
449472
case 0: return makeBlock(none);
450473
case 1: return makeIf(none);
451474
case 2: return makeLoop(none);
@@ -456,6 +479,7 @@ class TranslateToFuzzReader {
456479
case 7: return makeStore(none);
457480
case 8: return makeDrop(none);
458481
case 9: return makeNop(none);
482+
case 10: return makeSetGlobal(none);
459483
}
460484
WASM_UNREACHABLE();
461485
}
@@ -766,6 +790,21 @@ class TranslateToFuzzReader {
766790
}
767791
}
768792

793+
Expression* makeGetGlobal(WasmType type) {
794+
auto& globals = globalsByType[type];
795+
if (globals.empty()) return makeConst(type);
796+
return builder.makeGetGlobal(vectorPick(globals), type);
797+
}
798+
799+
Expression* makeSetGlobal(WasmType type) {
800+
assert(type == none);
801+
type = getConcreteType();
802+
auto& globals = globalsByType[type];
803+
if (globals.empty()) return makeTrivial(none);
804+
auto* value = make(type);
805+
return builder.makeSetGlobal(vectorPick(globals), value);
806+
}
807+
769808
Expression* makePointer() {
770809
auto* ret = make(i32);
771810
// with high probability, mask the pointer so it's in a reasonable

0 commit comments

Comments
 (0)