[WebAssembly] Add support for data sections in the assembler.
Summary:
This is quite minimal so far, introduce them with .section,
fill them with .int8 or .asciz, end with .size
Reviewers: dschuff, sbc100, aheejin
Subscribers: jgravelle-google, sunfish, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D58660
llvm-svn: 355321
diff --git a/llvm/lib/MC/MCParser/WasmAsmParser.cpp b/llvm/lib/MC/MCParser/WasmAsmParser.cpp
index a8a48d1..197e905 100644
--- a/llvm/lib/MC/MCParser/WasmAsmParser.cpp
+++ b/llvm/lib/MC/MCParser/WasmAsmParser.cpp
@@ -130,11 +130,27 @@
if (expect(AsmToken::Comma, ",") || expect(AsmToken::At, "@") ||
expect(AsmToken::EndOfStatement, "eol"))
return true;
- // This is done automatically by the assembler for text sections currently,
- // so we don't need to emit that here. This is what it would do (and may
- // be needed later for other section types):
- // auto WS = getContext().getWasmSection(Name, SectionKind::getText());
- // getStreamer().SwitchSection(WS);
+ struct SectionType {
+ const char *Name;
+ SectionKind Kind;
+ };
+ static SectionType SectionTypes[] = {
+ { ".text", SectionKind::getText() },
+ { ".rodata", SectionKind::getReadOnly() },
+ { ".data", SectionKind::getData() },
+ // 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.
return false;
}
@@ -153,9 +169,8 @@
if (expect(AsmToken::EndOfStatement, "eol"))
return true;
// This is done automatically by the assembler for functions currently,
- // so we don't need to emit that here. This is what it would do:
- (void)Sym;
- // getStreamer().emitELFSize(Sym, Expr);
+ // so this is only currently needed for data sections:
+ getStreamer().emitELFSize(Sym, Expr);
return false;
}
diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp
index b985d4b..e82ed58 100644
--- a/llvm/lib/MC/WasmObjectWriter.cpp
+++ b/llvm/lib/MC/WasmObjectWriter.cpp
@@ -1348,7 +1348,7 @@
LLVM_DEBUG(dbgs() << " -> function index: " << Index << "\n");
} else if (WS.isData()) {
- if (WS.isTemporary() && !WS.getSize())
+ if (!isInSymtab(WS))
continue;
if (!WS.isDefined()) {