Index: llvm/trunk/lib/MC/MCParser/WasmAsmParser.cpp =================================================================== --- llvm/trunk/lib/MC/MCParser/WasmAsmParser.cpp +++ llvm/trunk/lib/MC/MCParser/WasmAsmParser.cpp @@ -114,13 +114,17 @@ if (Lexer->isNot(AsmToken::String)) return error("expected string in directive, instead got: ", Lexer->getTok()); - SectionKind Kind = StringSwitch(Name) - .StartsWith(".data", SectionKind::getData()) - .StartsWith(".rodata", SectionKind::getReadOnly()) - .StartsWith(".text", SectionKind::getText()) - .StartsWith(".custom_section", SectionKind::getMetadata()); + auto Kind = StringSwitch>(Name) + .StartsWith(".data", SectionKind::getData()) + .StartsWith(".rodata", SectionKind::getReadOnly()) + .StartsWith(".text", SectionKind::getText()) + .StartsWith(".custom_section", SectionKind::getMetadata()) + .StartsWith(".bss", SectionKind::getBSS()) + .Default(Optional()); + 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 @@ 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; } Index: llvm/trunk/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp =================================================================== --- llvm/trunk/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ llvm/trunk/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -748,6 +748,10 @@ 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(getStreamer().getCurrentSection().first); + if (!CWS || !CWS->getKind().isText()) + return; auto SecName = ".text." + SymName; auto WS = getContext().getWasmSection(SecName, SectionKind::getText()); getStreamer().SwitchSection(WS);