diff options
author | Heejin Ahn <aheejin@gmail.com> | 2018-12-11 01:11:04 +0000 |
---|---|---|
committer | Heejin Ahn <aheejin@gmail.com> | 2018-12-11 01:11:04 +0000 |
commit | be5e5874f612adf6c64d06263776ec72349d3f4d (patch) | |
tree | f22ed0390ab4c12b5d71a64b7572fda198cc8543 /llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp | |
parent | 6d6ff2e0d720b2b50c7a7566363d45b7706a6433 (diff) | |
download | bcm5719-llvm-be5e5874f612adf6c64d06263776ec72349d3f4d.tar.gz bcm5719-llvm-be5e5874f612adf6c64d06263776ec72349d3f4d.zip |
[WebAssembly] Add '.eventtype' directive support
Summary:
This patch supports `.eventtype` directive printing and parsing in the
same syntax with `.functype`.
Reviewers: aardappel, sbc100
Subscribers: dschuff, sbc100, jgravelle-google, sunfish, llvm-commits
Differential Revision: https://reviews.llvm.org/D55353
llvm-svn: 348818
Diffstat (limited to 'llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp | 49 |
1 files changed, 36 insertions, 13 deletions
diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp index bf7580617c8..9688090cab7 100644 --- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -367,6 +367,24 @@ public: CurrentState = Label; } + bool parseSignature(wasm::WasmSignature *Signature) { + if (expect(AsmToken::LParen, "(")) + return true; + if (parseRegTypeList(Signature->Params)) + return true; + if (expect(AsmToken::RParen, ")")) + return true; + if (expect(AsmToken::MinusGreater, "->")) + return true; + if (expect(AsmToken::LParen, "(")) + return true; + if (parseRegTypeList(Signature->Returns)) + return true; + if (expect(AsmToken::RParen, ")")) + return true; + return false; + } + // This function processes wasm-specific directives streamed to // WebAssemblyTargetStreamer, all others go to the generic parser // (see WasmAsmParser). @@ -424,19 +442,7 @@ public: CurrentState = FunctionStart; } auto Signature = make_unique<wasm::WasmSignature>(); - if (expect(AsmToken::LParen, "(")) - return true; - if (parseRegTypeList(Signature->Params)) - return true; - if (expect(AsmToken::RParen, ")")) - return true; - if (expect(AsmToken::MinusGreater, "->")) - return true; - if (expect(AsmToken::LParen, "(")) - return true; - if (parseRegTypeList(Signature->Returns)) - return true; - if (expect(AsmToken::RParen, ")")) + if (parseSignature(Signature.get())) return true; WasmSym->setSignature(Signature.get()); addSignature(std::move(Signature)); @@ -446,6 +452,23 @@ public: return expect(AsmToken::EndOfStatement, "EOL"); } + if (DirectiveID.getString() == ".eventtype") { + auto SymName = expectIdent(); + if (SymName.empty()) + return true; + auto WasmSym = cast<MCSymbolWasm>( + TOut.getStreamer().getContext().getOrCreateSymbol(SymName)); + auto Signature = make_unique<wasm::WasmSignature>(); + if (parseRegTypeList(Signature->Params)) + return true; + WasmSym->setSignature(Signature.get()); + addSignature(std::move(Signature)); + WasmSym->setType(wasm::WASM_SYMBOL_TYPE_EVENT); + TOut.emitEventType(WasmSym); + // TODO: backend also calls TOut.emitIndIdx, but that is not implemented. + return expect(AsmToken::EndOfStatement, "EOL"); + } + if (DirectiveID.getString() == ".local") { if (CurrentState != FunctionStart) return error(".local directive should follow the start of a function", |