summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/MCParser/WasmAsmParser.cpp
diff options
context:
space:
mode:
authorWouter van Oortmerssen <aardappel@gmail.com>2019-01-17 18:14:09 +0000
committerWouter van Oortmerssen <aardappel@gmail.com>2019-01-17 18:14:09 +0000
commitf3b762a0b6cef251afef8907cb4cf5b35bffb0d8 (patch)
treeaf4c08803d459a5cf507925550e5913dc1db464d /llvm/lib/MC/MCParser/WasmAsmParser.cpp
parent194d00e1425c8aceefc82d4410285310868d74de (diff)
downloadbcm5719-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.cpp23
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;
OpenPOWER on IntegriCloud