Index: wasm/Config.h =================================================================== --- wasm/Config.h +++ wasm/Config.h @@ -25,6 +25,7 @@ bool GcSections; bool ImportMemory; bool ImportTable; + bool MergeDataSegments; bool PrintGcSections; bool Relocatable; bool StripAll; Index: wasm/Driver.cpp =================================================================== --- wasm/Driver.cpp +++ wasm/Driver.cpp @@ -293,6 +293,9 @@ Config->Relocatable = Args.hasArg(OPT_relocatable); Config->GcSections = Args.hasFlag(OPT_gc_sections, OPT_no_gc_sections, !Config->Relocatable); + Config->MergeDataSegments = + Args.hasFlag(OPT_merge_data_segments, OPT_no_merge_data_segments, + !Config->Relocatable); Config->PrintGcSections = Args.hasFlag(OPT_print_gc_sections, OPT_no_print_gc_sections, false); Config->SearchPaths = args::getStrings(Args, OPT_L); Index: wasm/Options.td =================================================================== --- wasm/Options.td +++ wasm/Options.td @@ -40,6 +40,10 @@ "Enable garbage collection of unused sections", "Disable garbage collection of unused sections">; +defm merge_data_segments: B<"merge-data-segments", + "Enable merging data segments", + "Disable merging data segments">; + def help: F<"help">, HelpText<"Print option help">; def l: JoinedOrSeparate<["-"], "l">, MetaVarName<"">, Index: wasm/Writer.cpp =================================================================== --- wasm/Writer.cpp +++ wasm/Writer.cpp @@ -870,19 +870,33 @@ } void Writer::createOutputSegments() { - for (ObjFile *File : Symtab->ObjectFiles) { - for (InputSegment *Segment : File->Segments) { - if (!Segment->Live) - continue; - StringRef Name = getOutputDataSegmentName(Segment->getName()); - OutputSegment *&S = SegmentMap[Name]; - if (S == nullptr) { - DEBUG(dbgs() << "new segment: " << Name << "\n"); - S = make(Name, Segments.size()); + if (!Config->MergeDataSegments) { + for (ObjFile *File : Symtab->ObjectFiles) { + for (InputSegment *Segment : File->Segments) { + if (!Segment->Live) + continue; + StringRef Name = getOutputDataSegmentName(Segment->getName()); + OutputSegment *S = make(Name, Segments.size()); Segments.push_back(S); + S->addInputSegment(Segment); + DEBUG(dbgs() << "added data: " << Name << ": " << S->Size << "\n"); + } + } + } else { + for (ObjFile *File : Symtab->ObjectFiles) { + for (InputSegment *Segment : File->Segments) { + if (!Segment->Live) + continue; + StringRef Name = getOutputDataSegmentName(Segment->getName()); + OutputSegment *&S = SegmentMap[Name]; + if (S == nullptr) { + DEBUG(dbgs() << "new segment: " << Name << "\n"); + S = make(Name, Segments.size()); + Segments.push_back(S); + } + S->addInputSegment(Segment); + DEBUG(dbgs() << "added data: " << Name << ": " << S->Size << "\n"); } - S->addInputSegment(Segment); - DEBUG(dbgs() << "added data: " << Name << ": " << S->Size << "\n"); } } }