Index: lld/trunk/test/wasm/data-segment-merging.ll =================================================================== --- lld/trunk/test/wasm/data-segment-merging.ll +++ lld/trunk/test/wasm/data-segment-merging.ll @@ -0,0 +1,48 @@ +target triple = "wasm32-unknown-unknown" + +@a = hidden global [6 x i8] c"hello\00", align 1 +@b = hidden global [8 x i8] c"goodbye\00", align 1 +@c = hidden global [9 x i8] c"whatever\00", align 1 +@d = hidden global i32 42, align 4 + +; RUN: llc -filetype=obj %s -o %t.data-segment-merging.o + +; RUN: wasm-ld -no-gc-sections --allow-undefined -o %t.merged.wasm %t.data-segment-merging.o +; RUN: obj2yaml %t.merged.wasm | FileCheck %s --check-prefix=MERGE +; MERGE: - Type: DATA +; MERGE-NEXT: Segments: +; MERGE-NEXT: - SectionOffset: 7 +; MERGE-NEXT: MemoryIndex: 0 +; MERGE-NEXT: Offset: +; MERGE-NEXT: Opcode: I32_CONST +; MERGE-NEXT: Value: 1024 +; MERGE-NEXT: Content: 68656C6C6F00676F6F6462796500776861746576657200002A000000 + +; RUN: wasm-ld -no-gc-sections --allow-undefined --no-merge-data-segments -o %t.separate.wasm %t.data-segment-merging.o +; RUN: obj2yaml %t.separate.wasm | FileCheck %s --check-prefix=SEPARATE +; SEPARATE: - Type: DATA +; SEPARATE-NEXT: Segments: +; SEPARATE-NEXT: - SectionOffset: 7 +; SEPARATE-NEXT: MemoryIndex: 0 +; SEPARATE-NEXT: Offset: +; SEPARATE-NEXT: Opcode: I32_CONST +; SEPARATE-NEXT: Value: 1024 +; SEPARATE-NEXT: Content: 68656C6C6F00 +; SEPARATE-NEXT: - SectionOffset: 19 +; SEPARATE-NEXT: MemoryIndex: 0 +; SEPARATE-NEXT: Offset: +; SEPARATE-NEXT: Opcode: I32_CONST +; SEPARATE-NEXT: Value: 1030 +; SEPARATE-NEXT: Content: 676F6F6462796500 +; SEPARATE-NEXT: - SectionOffset: 33 +; SEPARATE-NEXT: MemoryIndex: 0 +; SEPARATE-NEXT: Offset: +; SEPARATE-NEXT: Opcode: I32_CONST +; SEPARATE-NEXT: Value: 1038 +; SEPARATE-NEXT: Content: '776861746576657200' +; SEPARATE-NEXT: - SectionOffset: 48 +; SEPARATE-NEXT: MemoryIndex: 0 +; SEPARATE-NEXT: Offset: +; SEPARATE-NEXT: Opcode: I32_CONST +; SEPARATE-NEXT: Value: 1048 +; SEPARATE-NEXT: Content: 2A000000 Index: lld/trunk/wasm/Config.h =================================================================== --- lld/trunk/wasm/Config.h +++ lld/trunk/wasm/Config.h @@ -24,6 +24,7 @@ bool GcSections; bool ImportMemory; bool ImportTable; + bool MergeDataSegments; bool PrintGcSections; bool Relocatable; bool StripAll; Index: lld/trunk/wasm/Driver.cpp =================================================================== --- lld/trunk/wasm/Driver.cpp +++ lld/trunk/wasm/Driver.cpp @@ -292,6 +292,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: lld/trunk/wasm/Options.td =================================================================== --- lld/trunk/wasm/Options.td +++ lld/trunk/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: lld/trunk/wasm/Writer.cpp =================================================================== --- lld/trunk/wasm/Writer.cpp +++ lld/trunk/wasm/Writer.cpp @@ -914,7 +914,7 @@ } static StringRef getOutputDataSegmentName(StringRef Name) { - if (Config->Relocatable) + if (!Config->MergeDataSegments) return Name; if (Name.startswith(".text.")) return ".text";