[llvm] r364681 - [WebAssembly] Assembler: Improve section parsing.
Wouter van Oortmerssen via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 28 13:29:16 PDT 2019
Author: aardappel
Date: Fri Jun 28 13:29:16 2019
New Revision: 364681
URL: http://llvm.org/viewvc/llvm-project?rev=364681&view=rev
Log:
[WebAssembly] Assembler: Improve section parsing.
Reviewers: sbc100
Subscribers: dschuff, jgravelle-google, aheejin, sunfish, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D63947
Modified:
llvm/trunk/lib/MC/MCParser/WasmAsmParser.cpp
llvm/trunk/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
Modified: llvm/trunk/lib/MC/MCParser/WasmAsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/WasmAsmParser.cpp?rev=364681&r1=364680&r2=364681&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCParser/WasmAsmParser.cpp (original)
+++ llvm/trunk/lib/MC/MCParser/WasmAsmParser.cpp Fri Jun 28 13:29:16 2019
@@ -114,13 +114,17 @@ public:
if (Lexer->isNot(AsmToken::String))
return error("expected string in directive, instead got: ", Lexer->getTok());
- SectionKind Kind = StringSwitch<SectionKind>(Name)
- .StartsWith(".data", SectionKind::getData())
- .StartsWith(".rodata", SectionKind::getReadOnly())
- .StartsWith(".text", SectionKind::getText())
- .StartsWith(".custom_section", SectionKind::getMetadata());
+ auto Kind = StringSwitch<Optional<SectionKind>>(Name)
+ .StartsWith(".data", SectionKind::getData())
+ .StartsWith(".rodata", SectionKind::getReadOnly())
+ .StartsWith(".text", SectionKind::getText())
+ .StartsWith(".custom_section", SectionKind::getMetadata())
+ .StartsWith(".bss", SectionKind::getBSS())
+ .Default(Optional<SectionKind>());
+ if (!Kind.hasValue())
+ return Parser->Error(Lexer->getLoc(), "unknown section kind: " + Name);
- MCSectionWasm* Section = getContext().getWasmSection(Name, Kind);
+ MCSectionWasm *Section = getContext().getWasmSection(Name, Kind.getValue());
// Update section flags if present in this .section directive
bool Passive = false;
@@ -139,28 +143,9 @@ public:
if (expect(AsmToken::Comma, ",") || expect(AsmToken::At, "@") ||
expect(AsmToken::EndOfStatement, "eol"))
return true;
- struct SectionType {
- const char *Name;
- SectionKind Kind;
- };
- static SectionType SectionTypes[] = {
- {".text", SectionKind::getText()},
- {".rodata", SectionKind::getReadOnly()},
- {".data", SectionKind::getData()},
- {".custom_section", SectionKind::getMetadata()},
- // TODO: add more types.
- };
- for (size_t I = 0; I < sizeof(SectionTypes) / sizeof(SectionType); I++) {
- if (Name.startswith(SectionTypes[I].Name)) {
- auto WS = getContext().getWasmSection(Name, SectionTypes[I].Kind);
- getStreamer().SwitchSection(WS);
- return false;
- }
- }
- // Not found, just ignore this section.
- // For code in a text section WebAssemblyAsmParser automatically adds
- // one section per function, so they're optional to be specified with
- // this directive.
+
+ auto WS = getContext().getWasmSection(Name, Kind.getValue());
+ getStreamer().SwitchSection(WS);
return false;
}
Modified: llvm/trunk/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp?rev=364681&r1=364680&r2=364681&view=diff
==============================================================================
--- llvm/trunk/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp (original)
+++ llvm/trunk/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp Fri Jun 28 13:29:16 2019
@@ -748,6 +748,10 @@ public:
auto SymName = Symbol->getName();
if (SymName.startswith(".L"))
return; // Local Symbol.
+ // Only create a new text section if we're already in one.
+ auto CWS = cast<MCSectionWasm>(getStreamer().getCurrentSection().first);
+ if (!CWS || !CWS->getKind().isText())
+ return;
auto SecName = ".text." + SymName;
auto WS = getContext().getWasmSection(SecName, SectionKind::getText());
getStreamer().SwitchSection(WS);
More information about the llvm-commits
mailing list