@@ -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