summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
diff options
context:
space:
mode:
authorHeejin Ahn <aheejin@gmail.com>2018-12-11 01:11:04 +0000
committerHeejin Ahn <aheejin@gmail.com>2018-12-11 01:11:04 +0000
commitbe5e5874f612adf6c64d06263776ec72349d3f4d (patch)
treef22ed0390ab4c12b5d71a64b7572fda198cc8543 /llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
parent6d6ff2e0d720b2b50c7a7566363d45b7706a6433 (diff)
downloadbcm5719-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.cpp49
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",
OpenPOWER on IntegriCloud