[WebAssembly] Add support for custom sections
Copy user-defined custom sections into the output, concatenating
sections with the same name.
Differential Revision: https://reviews.llvm.org/D45340
llvm-svn: 329717
diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp
index a98cfc6..18d5d4a 100644
--- a/lld/wasm/Writer.cpp
+++ b/lld/wasm/Writer.cpp
@@ -20,6 +20,7 @@
#include "lld/Common/Strings.h"
#include "lld/Common/Threads.h"
#include "llvm/ADT/DenseSet.h"
+#include "llvm/ADT/StringMap.h"
#include "llvm/BinaryFormat/Wasm.h"
#include "llvm/Object/WasmTraits.h"
#include "llvm/Support/FileOutputBuffer.h"
@@ -85,6 +86,7 @@
void createElemSection();
void createCodeSection();
void createDataSection();
+ void createCustomSections();
// Custom sections
void createRelocSections();
@@ -111,6 +113,8 @@
std::vector<const Symbol *> SymtabEntries;
std::vector<WasmInitEntry> InitFunctions;
+ llvm::StringMap<std::vector<InputSection *>> CustomSectionMapping;
+
// Elements that are used to construct the final output
std::string Header;
std::vector<OutputSection *> OutputSections;
@@ -295,6 +299,23 @@
}
}
+void Writer::createCustomSections() {
+ log("createCustomSections");
+ for (ObjFile *File : Symtab->ObjectFiles)
+ for (InputSection *Section : File->CustomSections)
+ CustomSectionMapping[Section->getName()].push_back(Section);
+
+ for (auto &Pair : CustomSectionMapping) {
+ StringRef Name = Pair.first();
+ // These custom sections are known the linker and synthesized rather than
+ // blindly copied
+ if (Name == "linking" || Name == "name" || Name.startswith("reloc."))
+ continue;
+ DEBUG(dbgs() << "createCustomSection: " << Name << "\n");
+ OutputSections.push_back(make<CustomSection>(Name, Pair.second));
+ }
+}
+
void Writer::createElemSection() {
if (IndirectFunctions.empty())
return;
@@ -647,6 +668,7 @@
createElemSection();
createCodeSection();
createDataSection();
+ createCustomSections();
// Custom sections
if (Config->Relocatable) {