@@ -132,13 +132,12 @@ struct WebAssemblyOperand : public MCParsedAsmOperand {
132
132
class WebAssemblyAsmParser final : public MCTargetAsmParser {
133
133
MCAsmParser &Parser;
134
134
MCAsmLexer &Lexer;
135
- MCSymbolWasm *LastSymbol;
136
135
137
136
public:
138
137
WebAssemblyAsmParser (const MCSubtargetInfo &STI, MCAsmParser &Parser,
139
138
const MCInstrInfo &MII, const MCTargetOptions &Options)
140
139
: MCTargetAsmParser(Options, STI, MII), Parser(Parser),
141
- Lexer (Parser.getLexer()), LastSymbol( nullptr ) {
140
+ Lexer (Parser.getLexer()) {
142
141
setAvailableFeatures (ComputeAvailableFeatures (STI.getFeatureBits ()));
143
142
}
144
143
@@ -191,6 +190,19 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser {
191
190
.Default ({MVT::INVALID_SIMPLE_VALUE_TYPE, wasm::WASM_TYPE_NORESULT});
192
191
}
193
192
193
+ bool ParseRegTypeList (std::vector<MVT> &Types) {
194
+ while (Lexer.is (AsmToken::Identifier)) {
195
+ auto RegType = ParseRegType (Lexer.getTok ().getString ()).first ;
196
+ if (RegType == MVT::INVALID_SIMPLE_VALUE_TYPE)
197
+ return true ;
198
+ Types.push_back (RegType);
199
+ Parser.Lex ();
200
+ if (!IsNext (AsmToken::Comma))
201
+ break ;
202
+ }
203
+ return Expect (AsmToken::EndOfStatement, " EOL" );
204
+ }
205
+
194
206
void ParseSingleInteger (bool IsNegative, OperandVector &Operands) {
195
207
auto &Int = Lexer.getTok ();
196
208
int64_t Val = Int.getIntVal ();
@@ -314,10 +326,9 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser {
314
326
return false ;
315
327
}
316
328
317
- void onLabelParsed (MCSymbol *Symbol) override {
318
- LastSymbol = cast<MCSymbolWasm>(Symbol);
319
- }
320
-
329
+ // This function processes wasm-specific directives streamed to
330
+ // WebAssemblyTargetStreamer, all others go to the generic parser
331
+ // (see WasmAsmParser).
321
332
bool ParseDirective (AsmToken DirectiveID) override {
322
333
// This function has a really weird return value behavior that is different
323
334
// from all the other parsing functions:
@@ -331,44 +342,7 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser {
331
342
reinterpret_cast <WebAssemblyTargetStreamer &>(*Out.getTargetStreamer ());
332
343
// TODO: any time we return an error, at least one token must have been
333
344
// consumed, otherwise this will not signal an error to the caller.
334
- if (DirectiveID.getString () == " .type" ) {
335
- // This could be the start of a function, check if followed by
336
- // "label,@function"
337
- if (!Lexer.is (AsmToken::Identifier))
338
- return Error (" Expected label after .type directive, got: " ,
339
- Lexer.getTok ());
340
- auto WasmSym = cast<MCSymbolWasm>(
341
- TOut.getStreamer ().getContext ().getOrCreateSymbol (
342
- Lexer.getTok ().getString ()));
343
- Parser.Lex ();
344
- if (!(IsNext (AsmToken::Comma) && IsNext (AsmToken::At) &&
345
- Lexer.is (AsmToken::Identifier)))
346
- return Error (" Expected label,@type declaration, got: " , Lexer.getTok ());
347
- auto TypeName = Lexer.getTok ().getString ();
348
- if (TypeName == " function" )
349
- WasmSym->setType (wasm::WASM_SYMBOL_TYPE_FUNCTION);
350
- else if (TypeName == " global" )
351
- WasmSym->setType (wasm::WASM_SYMBOL_TYPE_GLOBAL);
352
- else
353
- return Error (" Unknown WASM symbol type: " , Lexer.getTok ());
354
- Parser.Lex ();
355
- return Expect (AsmToken::EndOfStatement, " EOL" );
356
- } else if (DirectiveID.getString () == " .size" ) {
357
- if (!Lexer.is (AsmToken::Identifier))
358
- return Error (" Expected label after .size directive, got: " ,
359
- Lexer.getTok ());
360
- auto WasmSym = cast<MCSymbolWasm>(
361
- TOut.getStreamer ().getContext ().getOrCreateSymbol (
362
- Lexer.getTok ().getString ()));
363
- Parser.Lex ();
364
- if (!IsNext (AsmToken::Comma))
365
- return Error (" Expected `,`, got: " , Lexer.getTok ());
366
- const MCExpr *Exp;
367
- if (Parser.parseExpression (Exp))
368
- return Error (" Cannot parse .size expression: " , Lexer.getTok ());
369
- WasmSym->setSize (Exp);
370
- return Expect (AsmToken::EndOfStatement, " EOL" );
371
- } else if (DirectiveID.getString () == " .globaltype" ) {
345
+ if (DirectiveID.getString () == " .globaltype" ) {
372
346
if (!Lexer.is (AsmToken::Identifier))
373
347
return Error (" Expected symbol name after .globaltype directive, got: " ,
374
348
Lexer.getTok ());
@@ -392,40 +366,23 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser {
392
366
// And emit the directive again.
393
367
TOut.emitGlobalType (WasmSym);
394
368
return Expect (AsmToken::EndOfStatement, " EOL" );
395
- } else if (DirectiveID.getString () == " .param" ||
396
- DirectiveID.getString () == " .local" ) {
397
- // Track the number of locals, needed for correct virtual register
398
- // assignment elsewhere.
399
- // Also output a directive to the streamer.
369
+ } else if (DirectiveID.getString () == " .param" ) {
400
370
std::vector<MVT> Params;
371
+ if (ParseRegTypeList (Params)) return true ;
372
+ TOut.emitParam (nullptr /* unused */ , Params);
373
+ return false ;
374
+ } else if (DirectiveID.getString () == " .result" ) {
375
+ std::vector<MVT> Results;
376
+ if (ParseRegTypeList (Results)) return true ;
377
+ TOut.emitResult (nullptr /* unused */ , Results);
378
+ return false ;
379
+ } else if (DirectiveID.getString () == " .local" ) {
401
380
std::vector<MVT> Locals;
402
- while (Lexer.is (AsmToken::Identifier)) {
403
- auto RegType = ParseRegType (Lexer.getTok ().getString ()).first ;
404
- if (RegType == MVT::INVALID_SIMPLE_VALUE_TYPE)
405
- return true ;
406
- if (DirectiveID.getString () == " .param" ) {
407
- Params.push_back (RegType);
408
- } else {
409
- Locals.push_back (RegType);
410
- }
411
- Parser.Lex ();
412
- if (!IsNext (AsmToken::Comma))
413
- break ;
414
- }
415
- assert (LastSymbol);
416
- // TODO: LastSymbol isn't even used by emitParam, so could be removed.
417
- TOut.emitParam (LastSymbol, Params);
381
+ if (ParseRegTypeList (Locals)) return true ;
418
382
TOut.emitLocal (Locals);
419
- return Expect (AsmToken::EndOfStatement, " EOL" );
420
- } else {
421
- // TODO: remove.
422
- while (Lexer.isNot (AsmToken::EndOfStatement))
423
- Parser.Lex ();
424
- return Expect (AsmToken::EndOfStatement, " EOL" );
383
+ return false ;
425
384
}
426
- // TODO: current ELF directive parsing is broken, fix this is a followup.
427
- // return true; // We didn't process this directive.
428
- return false ;
385
+ return true ; // We didn't process this directive.
429
386
}
430
387
431
388
bool MatchAndEmitInstruction (SMLoc IDLoc, unsigned & /* Opcode*/ ,
0 commit comments