diff options
author | Wouter van Oortmerssen <aardappel@gmail.com> | 2019-01-17 18:14:09 +0000 |
---|---|---|
committer | Wouter van Oortmerssen <aardappel@gmail.com> | 2019-01-17 18:14:09 +0000 |
commit | f3b762a0b6cef251afef8907cb4cf5b35bffb0d8 (patch) | |
tree | af4c08803d459a5cf507925550e5913dc1db464d /llvm/lib/MC/MCParser/WasmAsmParser.cpp | |
parent | 194d00e1425c8aceefc82d4410285310868d74de (diff) | |
download | bcm5719-llvm-f3b762a0b6cef251afef8907cb4cf5b35bffb0d8.tar.gz bcm5719-llvm-f3b762a0b6cef251afef8907cb4cf5b35bffb0d8.zip |
[WebAssembly] Fixed objdump not parsing function headers.
Summary:
objdump was interpreting the function header containing the locals
declaration as instructions. To parse these without injecting target
specific code in objdump, MCDisassembler::onSymbolStart was added to
be implemented by the WebAssembly implemention.
WasmObjectFile now returns a code offset for the "address" of a symbol,
rather than the index. This is also more in-line with what other
targets do.
Also ensured that the AsmParser correctly puts each function
in its own segment to enable this test case.
Reviewers: sbc100, dschuff
Subscribers: jgravelle-google, aheejin, sunfish, rupprecht, llvm-commits
Differential Revision: https://reviews.llvm.org/D56684
llvm-svn: 351460
Diffstat (limited to 'llvm/lib/MC/MCParser/WasmAsmParser.cpp')
-rw-r--r-- | llvm/lib/MC/MCParser/WasmAsmParser.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/llvm/lib/MC/MCParser/WasmAsmParser.cpp b/llvm/lib/MC/MCParser/WasmAsmParser.cpp index 93bb0cb3c72..9c41c474dae 100644 --- a/llvm/lib/MC/MCParser/WasmAsmParser.cpp +++ b/llvm/lib/MC/MCParser/WasmAsmParser.cpp @@ -22,6 +22,7 @@ #include "llvm/MC/MCParser/MCAsmLexer.h" #include "llvm/MC/MCParser/MCAsmParser.h" #include "llvm/MC/MCParser/MCAsmParserExtension.h" +#include "llvm/MC/MCSectionWasm.h" #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCSymbolWasm.h" @@ -83,8 +84,16 @@ public: } bool parseSectionDirective(StringRef, SMLoc) { - // FIXME: .section currently no-op. - while (Lexer->isNot(AsmToken::EndOfStatement)) Parser->Lex(); + StringRef Name; + if (Parser->parseIdentifier(Name)) + return TokError("expected identifier in directive"); + // FIXME: currently requiring this very fixed format. + if (Expect(AsmToken::Comma, ",") || Expect(AsmToken::String, "string") || + Expect(AsmToken::Comma, ",") || Expect(AsmToken::At, "@") || + Expect(AsmToken::EndOfStatement, "eol")) + return true; + auto WS = getContext().getWasmSection(Name, SectionKind::getText()); + getStreamer().SwitchSection(WS); return false; } @@ -95,15 +104,13 @@ public: if (Parser->parseIdentifier(Name)) return TokError("expected identifier in directive"); auto Sym = getContext().getOrCreateSymbol(Name); - if (Lexer->isNot(AsmToken::Comma)) - return TokError("unexpected token in directive"); - Lex(); + if (Expect(AsmToken::Comma, ",")) + return true; const MCExpr *Expr; if (Parser->parseExpression(Expr)) return true; - if (Lexer->isNot(AsmToken::EndOfStatement)) - return TokError("unexpected token in directive"); - Lex(); + if (Expect(AsmToken::EndOfStatement, "eol")) + return true; // MCWasmStreamer implements this. getStreamer().emitELFSize(Sym, Expr); return false; |