Successfully identified regression in *llvm* in CI configuration 
tcwg_bmk_llvm_tx1/llvm-master-aarch64-spec2k6-O3_LTO.  So far, this commit has 
regressed CI configurations:
 - tcwg_bmk_llvm_tx1/llvm-master-aarch64-spec2k6-O3_LTO

Culprit:
<cut>
commit 45b7cf995551a0c0743e5d69f611bba7e4072ddf
Author: Sam Clegg <s...@chromium.org>
Date:   Wed May 12 16:48:34 2021 -0700

    [lld][WebAssembly] Enable string tail merging in debug sections
    
    This is a followup to https://reviews.llvm.org/D97657 which
    applied string tail merging to data segments.
    
    Fixes: https://bugs.llvm.org/show_bug.cgi?id=48828
    
    Differential Revision: https://reviews.llvm.org/D102436
</cut>

Results regressed to (for first_bad == 45b7cf995551a0c0743e5d69f611bba7e4072ddf)
# reset_artifacts:
-10
# build_abe binutils:
-9
# build_abe stage1 -- --set gcc_override_configure=--disable-libsanitizer:
-8
# build_abe linux:
-7
# build_abe glibc:
-6
# build_abe stage2 -- --set gcc_override_configure=--disable-libsanitizer:
-5
# build_llvm true:
-3
# true:
0
# benchmark -O3_LTO -- 
artifacts/build-45b7cf995551a0c0743e5d69f611bba7e4072ddf/results_id:
1
# 433.milc,milc_base.default                                    regressed by 104

from (for last_good == 8dd5ef01ef13e402784bba47f7a24175f5f00325)
# reset_artifacts:
-10
# build_abe binutils:
-9
# build_abe stage1 -- --set gcc_override_configure=--disable-libsanitizer:
-8
# build_abe linux:
-7
# build_abe glibc:
-6
# build_abe stage2 -- --set gcc_override_configure=--disable-libsanitizer:
-5
# build_llvm true:
-3
# true:
0
# benchmark -O3_LTO -- 
artifacts/build-8dd5ef01ef13e402784bba47f7a24175f5f00325/results_id:
1

Artifacts of last_good build: 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tx1-llvm-master-aarch64-spec2k6-O3_LTO/26/artifact/artifacts/build-8dd5ef01ef13e402784bba47f7a24175f5f00325/
Results ID of last_good: 
tx1_64/tcwg_bmk_llvm_tx1/bisect-llvm-master-aarch64-spec2k6-O3_LTO/2681
Artifacts of first_bad build: 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tx1-llvm-master-aarch64-spec2k6-O3_LTO/26/artifact/artifacts/build-45b7cf995551a0c0743e5d69f611bba7e4072ddf/
Results ID of first_bad: 
tx1_64/tcwg_bmk_llvm_tx1/bisect-llvm-master-aarch64-spec2k6-O3_LTO/2637
Build top page/logs: 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tx1-llvm-master-aarch64-spec2k6-O3_LTO/26/

Configuration details:


Reproduce builds:
<cut>
mkdir investigate-llvm-45b7cf995551a0c0743e5d69f611bba7e4072ddf
cd investigate-llvm-45b7cf995551a0c0743e5d69f611bba7e4072ddf

git clone https://git.linaro.org/toolchain/jenkins-scripts

mkdir -p artifacts/manifests
curl -o artifacts/manifests/build-baseline.sh 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tx1-llvm-master-aarch64-spec2k6-O3_LTO/26/artifact/artifacts/manifests/build-baseline.sh
 --fail
curl -o artifacts/manifests/build-parameters.sh 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tx1-llvm-master-aarch64-spec2k6-O3_LTO/26/artifact/artifacts/manifests/build-parameters.sh
 --fail
curl -o artifacts/test.sh 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tx1-llvm-master-aarch64-spec2k6-O3_LTO/26/artifact/artifacts/test.sh
 --fail
chmod +x artifacts/test.sh

# Reproduce the baseline build (build all pre-requisites)
./jenkins-scripts/tcwg_bmk-build.sh @@ artifacts/manifests/build-baseline.sh

# Save baseline build state (which is then restored in artifacts/test.sh)
mkdir -p ./bisect
rsync -a --del --delete-excluded --exclude /bisect/ --exclude /artifacts/ 
--exclude /llvm/ ./ ./bisect/baseline/

cd llvm

# Reproduce first_bad build
git checkout --detach 45b7cf995551a0c0743e5d69f611bba7e4072ddf
../artifacts/test.sh

# Reproduce last_good build
git checkout --detach 8dd5ef01ef13e402784bba47f7a24175f5f00325
../artifacts/test.sh

cd ..
</cut>

History of pending regressions and results: 
https://git.linaro.org/toolchain/ci/base-artifacts.git/log/?h=linaro-local/ci/tcwg_bmk_llvm_tx1/llvm-master-aarch64-spec2k6-O3_LTO

Artifacts: 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tx1-llvm-master-aarch64-spec2k6-O3_LTO/26/artifact/artifacts/
Build log: 
https://ci.linaro.org/job/tcwg_bmk_ci_llvm-bisect-tcwg_bmk_tx1-llvm-master-aarch64-spec2k6-O3_LTO/26/consoleText

Full commit (up to 1000 lines):
<cut>
commit 45b7cf995551a0c0743e5d69f611bba7e4072ddf
Author: Sam Clegg <s...@chromium.org>
Date:   Wed May 12 16:48:34 2021 -0700

    [lld][WebAssembly] Enable string tail merging in debug sections
    
    This is a followup to https://reviews.llvm.org/D97657 which
    applied string tail merging to data segments.
    
    Fixes: https://bugs.llvm.org/show_bug.cgi?id=48828
    
    Differential Revision: https://reviews.llvm.org/D102436
---
 lld/test/wasm/Inputs/merge-string-debug2.s |  4 +++
 lld/test/wasm/merge-string-debug.s         | 22 ++++++++++++++
 lld/wasm/Driver.cpp                        |  6 +++-
 lld/wasm/InputChunks.cpp                   | 16 +++++-----
 lld/wasm/InputChunks.h                     | 49 +++++++++++++++++-------------
 lld/wasm/InputFiles.cpp                    | 23 +++++++++++---
 lld/wasm/InputFiles.h                      |  4 +--
 lld/wasm/OutputSections.cpp                | 38 ++++++++++++++++++++---
 lld/wasm/OutputSections.h                  |  5 +--
 lld/wasm/OutputSegment.cpp                 |  7 ++---
 lld/wasm/Symbols.cpp                       |  2 +-
 lld/wasm/Symbols.h                         |  4 +--
 lld/wasm/Writer.cpp                        |  4 +--
 llvm/include/llvm/MC/MCContext.h           |  5 +--
 llvm/lib/MC/MCObjectFileInfo.cpp           | 11 ++++---
 15 files changed, 143 insertions(+), 57 deletions(-)

diff --git a/lld/test/wasm/Inputs/merge-string-debug2.s 
b/lld/test/wasm/Inputs/merge-string-debug2.s
new file mode 100644
index 000000000000..1f4979056ac8
--- /dev/null
+++ b/lld/test/wasm/Inputs/merge-string-debug2.s
@@ -0,0 +1,4 @@
+.section .debug_str,"S",@
+  .asciz "clang version 13.0.0"
+  .asciz "bar"
+  .asciz "foo"
diff --git a/lld/test/wasm/merge-string-debug.s 
b/lld/test/wasm/merge-string-debug.s
new file mode 100644
index 000000000000..4a663501959f
--- /dev/null
+++ b/lld/test/wasm/merge-string-debug.s
@@ -0,0 +1,22 @@
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %s -o %t.o
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown 
%p/Inputs/merge-string-debug2.s -o %t2.o
+
+# RUN: wasm-ld %t.o %t2.o -o %t.wasm --no-entry
+# RUN: llvm-readobj -x .debug_str %t.wasm | FileCheck %s --check-prefixes 
CHECK,CHECK-O1
+
+# RUN: wasm-ld -O0 %t.o %t2.o -o %tO0.wasm --no-entry
+# RUN: llvm-readobj -x .debug_str %tO0.wasm | FileCheck %s --check-prefixes 
CHECK,CHECK-O0
+
+.section .debug_str,"S",@
+  .asciz "clang version 13.0.0"
+  .asciz "foobar"
+
+# CHECK: Hex dump of section '.debug_str':
+
+# CHECK-O0: 0x00000000 636c616e 67207665 7273696f 6e203133 clang version 13
+# CHECK-O0: 0x00000010 2e302e30 00666f6f 62617200 636c616e .0.0.foobar.clan
+# CHECK-O0: 0x00000020 67207665 7273696f 6e203133 2e302e30 g version 13.0.0
+# CHECK-O0: 0x00000030 00626172 00666f6f 00                .bar.foo.
+
+# CHECK-O1: 0x00000000 666f6f62 61720066 6f6f0063 6c616e67 foobar.foo.clang
+# CHECK-O1: 0x00000010 20766572 73696f6e 2031332e 302e3000  version 13.0.0.
diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp
index 6fec9d5b2278..9b01a84f7812 100644
--- a/lld/wasm/Driver.cpp
+++ b/lld/wasm/Driver.cpp
@@ -796,7 +796,7 @@ static void wrapSymbols(ArrayRef<WrappedSymbol> wrapped) {
 }
 
 static void splitSections() {
-  // splitIntoPieces needs to be called on each MergeInputSection
+  // splitIntoPieces needs to be called on each MergeInputChunk
   // before calling finalizeContents().
   LLVM_DEBUG(llvm::dbgs() << "splitSections\n");
   parallelForEach(symtab->objectFiles, [](ObjFile *file) {
@@ -804,6 +804,10 @@ static void splitSections() {
       if (auto *s = dyn_cast<MergeInputChunk>(seg))
         s->splitIntoPieces();
     }
+    for (InputChunk *sec : file->customSections) {
+      if (auto *s = dyn_cast<MergeInputChunk>(sec))
+        s->splitIntoPieces();
+    }
   });
 }
 
diff --git a/lld/wasm/InputChunks.cpp b/lld/wasm/InputChunks.cpp
index b7d1aa25e9c8..279cd41d1ff2 100644
--- a/lld/wasm/InputChunks.cpp
+++ b/lld/wasm/InputChunks.cpp
@@ -328,24 +328,24 @@ void InputFunction::writeCompressed(uint8_t *buf) const {
   LLVM_DEBUG(dbgs() << "  total: " << (buf + chunkSize - orig) << "\n");
 }
 
-uint64_t InputChunk::getOffset(uint64_t offset) const {
-  return outSecOff + offset;
-}
-
-uint64_t InputChunk::getSegmentOffset(uint64_t offset) const {
+uint64_t InputChunk::getChunkOffset(uint64_t offset) const {
   if (const auto *ms = dyn_cast<MergeInputChunk>(this)) {
-    LLVM_DEBUG(dbgs() << "getSegmentOffset(merged): " << getName() << "\n");
+    LLVM_DEBUG(dbgs() << "getChunkOffset(merged): " << getName() << "\n");
     LLVM_DEBUG(dbgs() << "offset: " << offset << "\n");
     LLVM_DEBUG(dbgs() << "parentOffset: " << ms->getParentOffset(offset)
                       << "\n");
     assert(ms->parent);
-    return ms->parent->getSegmentOffset(ms->getParentOffset(offset));
+    return ms->parent->getChunkOffset(ms->getParentOffset(offset));
   }
   return outputSegmentOffset + offset;
 }
 
+uint64_t InputChunk::getOffset(uint64_t offset) const {
+  return outSecOff + getChunkOffset(offset);
+}
+
 uint64_t InputChunk::getVA(uint64_t offset) const {
-  return (outputSeg ? outputSeg->startVA : 0) + getSegmentOffset(offset);
+  return (outputSeg ? outputSeg->startVA : 0) + getChunkOffset(offset);
 }
 
 // Generate code to apply relocations to the data section at runtime.
diff --git a/lld/wasm/InputChunks.h b/lld/wasm/InputChunks.h
index 47ed7ccaadcb..f1174d937ad3 100644
--- a/lld/wasm/InputChunks.h
+++ b/lld/wasm/InputChunks.h
@@ -43,7 +43,7 @@ public:
     MergedChunk,
     Function,
     SyntheticFunction,
-    Section
+    Section,
   };
 
   StringRef name;
@@ -62,12 +62,15 @@ public:
   ArrayRef<WasmRelocation> getRelocations() const { return relocations; }
   void setRelocations(ArrayRef<WasmRelocation> rs) { relocations = rs; }
 
-  // Translate an offset in the input section to an offset in the output
+  // Translate an offset into the input chunk to an offset in the output
   // section.
   uint64_t getOffset(uint64_t offset) const;
-  // For data segments, translate and offset into the input segment into
-  // an offset into the output segment
-  uint64_t getSegmentOffset(uint64_t offset) const;
+  // Translate an offset into the input chunk into an offset into the output
+  // chunk.  For data segments (InputSegment) this will return and offset into
+  // the output segment.  For MergeInputChunk, this will return an offset into
+  // the parent merged chunk.  For other chunk types this is no-op and we just
+  // return unmodified offset.
+  uint64_t getChunkOffset(uint64_t offset) const;
   uint64_t getVA(uint64_t offset = 0) const;
 
   uint32_t getComdat() const { return comdat; }
@@ -132,22 +135,19 @@ protected:
 // each global variable.
 class InputSegment : public InputChunk {
 public:
-  InputSegment(const WasmSegment *seg, ObjFile *f)
-      : InputChunk(f, InputChunk::DataSegment, seg->Data.Name,
-                   seg->Data.Alignment, seg->Data.LinkingFlags),
+  InputSegment(const WasmSegment &seg, ObjFile *f)
+      : InputChunk(f, InputChunk::DataSegment, seg.Data.Name,
+                   seg.Data.Alignment, seg.Data.LinkingFlags),
         segment(seg) {
-    rawData = segment->Data.Content;
-    comdat = segment->Data.Comdat;
-    inputSectionOffset = segment->SectionOffset;
+    rawData = segment.Data.Content;
+    comdat = segment.Data.Comdat;
+    inputSectionOffset = segment.SectionOffset;
   }
 
-  InputSegment(StringRef name, uint32_t alignment, uint32_t flags)
-      : InputChunk(nullptr, InputChunk::DataSegment, name, alignment, flags) {}
-
   static bool classof(const InputChunk *c) { return c->kind() == DataSegment; }
 
 protected:
-  const WasmSegment *segment = nullptr;
+  const WasmSegment &segment;
 };
 
 class SyntheticMergedChunk;
@@ -174,12 +174,19 @@ static_assert(sizeof(SectionPiece) == 16, "SectionPiece 
is too big");
 // This corresponds segments marked as WASM_SEG_FLAG_STRINGS.
 class MergeInputChunk : public InputChunk {
 public:
-  MergeInputChunk(const WasmSegment *seg, ObjFile *f)
-      : InputChunk(f, Merge, seg->Data.Name, seg->Data.Alignment,
-                   seg->Data.LinkingFlags) {
-    rawData = seg->Data.Content;
-    comdat = seg->Data.Comdat;
-    inputSectionOffset = seg->SectionOffset;
+  MergeInputChunk(const WasmSegment &seg, ObjFile *f)
+      : InputChunk(f, Merge, seg.Data.Name, seg.Data.Alignment,
+                   seg.Data.LinkingFlags) {
+    rawData = seg.Data.Content;
+    comdat = seg.Data.Comdat;
+    inputSectionOffset = seg.SectionOffset;
+  }
+
+  MergeInputChunk(const WasmSection &s, ObjFile *f)
+      : InputChunk(f, Merge, s.Name, 0, llvm::wasm::WASM_SEG_FLAG_STRINGS) {
+    assert(s.Type == llvm::wasm::WASM_SEC_CUSTOM);
+    comdat = s.Comdat;
+    rawData = s.Content;
   }
 
   static bool classof(const InputChunk *s) { return s->kind() == Merge; }
diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp
index c65b05109c3d..7fd9215f1171 100644
--- a/lld/wasm/InputFiles.cpp
+++ b/lld/wasm/InputFiles.cpp
@@ -360,6 +360,17 @@ void ObjFile::addLegacyIndirectFunctionTableIfNeeded(
   config->legacyFunctionTable = true;
 }
 
+static bool shouldMerge(const WasmSection &sec) {
+  if (config->optimize == 0)
+    return false;
+  // Sadly we don't have section attributes yet for custom sections, so we
+  // currently go by the name alone.
+  // TODO(sbc): Add ability for wasm sections to carry flags so we don't
+  // need to use names here.
+  return sec.Name.startswith(".debug_str") ||
+         sec.Name.startswith(".debug_line_str");
+}
+
 static bool shouldMerge(const WasmSegment &seg) {
   // As of now we only support merging strings, and only with single byte
   // alignment (2^0).
@@ -445,7 +456,11 @@ void ObjFile::parse(bool ignoreComdats) {
       assert(!dataSection);
       dataSection = &section;
     } else if (section.Type == WASM_SEC_CUSTOM) {
-      auto *customSec = make<InputSection>(section, this);
+      InputChunk *customSec;
+      if (shouldMerge(section))
+        customSec = make<MergeInputChunk>(section, this);
+      else
+        customSec = make<InputSection>(section, this);
       customSec->discarded = isExcludedByComdat(customSec);
       customSections.emplace_back(customSec);
       customSections.back()->setRelocations(section.Relocations);
@@ -466,9 +481,9 @@ void ObjFile::parse(bool ignoreComdats) {
   for (const WasmSegment &s : wasmObj->dataSegments()) {
     InputChunk *seg;
     if (shouldMerge(s)) {
-      seg = make<MergeInputChunk>(&s, this);
+      seg = make<MergeInputChunk>(s, this);
     } else
-      seg = make<InputSegment>(&s, this);
+      seg = make<InputSegment>(s, this);
     seg->discarded = isExcludedByComdat(seg);
 
     segments.emplace_back(seg);
@@ -585,7 +600,7 @@ Symbol *ObjFile::createDefined(const WasmSymbol &sym) {
     return symtab->addDefinedGlobal(name, flags, this, global);
   }
   case WASM_SYMBOL_TYPE_SECTION: {
-    InputSection *section = customSectionsByIndex[sym.Info.ElementIndex];
+    InputChunk *section = customSectionsByIndex[sym.Info.ElementIndex];
     assert(sym.isBindingLocal());
     // Need to return null if discarded here? data and func only do that when
     // binding is not local.
diff --git a/lld/wasm/InputFiles.h b/lld/wasm/InputFiles.h
index b720b889adcc..49337bd0eb33 100644
--- a/lld/wasm/InputFiles.h
+++ b/lld/wasm/InputFiles.h
@@ -141,8 +141,8 @@ public:
   std::vector<InputGlobal *> globals;
   std::vector<InputEvent *> events;
   std::vector<InputTable *> tables;
-  std::vector<InputSection *> customSections;
-  llvm::DenseMap<uint32_t, InputSection *> customSectionsByIndex;
+  std::vector<InputChunk *> customSections;
+  llvm::DenseMap<uint32_t, InputChunk *> customSectionsByIndex;
 
   Symbol *getSymbol(uint32_t index) const { return symbols[index]; }
   FunctionSymbol *getFunctionSymbol(uint32_t index) const;
diff --git a/lld/wasm/OutputSections.cpp b/lld/wasm/OutputSections.cpp
index 780c8e4b2776..e39c3331641a 100644
--- a/lld/wasm/OutputSections.cpp
+++ b/lld/wasm/OutputSections.cpp
@@ -12,6 +12,7 @@
 #include "OutputSegment.h"
 #include "WriterUtils.h"
 #include "lld/Common/ErrorHandler.h"
+#include "lld/Common/Memory.h"
 #include "llvm/ADT/Twine.h"
 #include "llvm/Support/LEB128.h"
 #include "llvm/Support/Parallel.h"
@@ -234,13 +235,42 @@ bool DataSection::isNeeded() const {
   return false;
 }
 
+// Lots of duplication here with OutputSegment::finalizeInputSegments
+void CustomSection::finalizeInputSections() {
+  SyntheticMergedChunk *mergedSection = nullptr;
+  std::vector<InputChunk *> newSections;
+
+  for (InputChunk *s : inputSections) {
+    MergeInputChunk *ms = dyn_cast<MergeInputChunk>(s);
+    if (!ms) {
+      newSections.push_back(s);
+      continue;
+    }
+
+    if (!mergedSection) {
+      mergedSection =
+          make<SyntheticMergedChunk>(name, 0, WASM_SEG_FLAG_STRINGS);
+      newSections.push_back(mergedSection);
+    }
+    mergedSection->addMergeChunk(ms);
+  }
+
+  if (!mergedSection)
+    return;
+
+  mergedSection->finalizeContents();
+  inputSections = newSections;
+}
+
 void CustomSection::finalizeContents() {
+  finalizeInputSections();
+
   raw_string_ostream os(nameData);
   encodeULEB128(name.size(), os);
   os << name;
   os.flush();
 
-  for (InputSection *section : inputSections) {
+  for (InputChunk *section : inputSections) {
     assert(!section->discarded);
     section->outputSec = this;
     section->outSecOff = payloadSize;
@@ -264,19 +294,19 @@ void CustomSection::writeTo(uint8_t *buf) {
   buf += nameData.size();
 
   // Write custom sections payload
-  for (const InputSection *section : inputSections)
+  for (const InputChunk *section : inputSections)
     section->writeTo(buf);
 }
 
 uint32_t CustomSection::getNumRelocations() const {
   uint32_t count = 0;
-  for (const InputSection *inputSect : inputSections)
+  for (const InputChunk *inputSect : inputSections)
     count += inputSect->getNumRelocations();
   return count;
 }
 
 void CustomSection::writeRelocations(raw_ostream &os) const {
-  for (const InputSection *s : inputSections)
+  for (const InputChunk *s : inputSections)
     s->writeRelocations(os);
 }
 
diff --git a/lld/wasm/OutputSections.h b/lld/wasm/OutputSections.h
index 444116dac7d8..c3becf6ec240 100644
--- a/lld/wasm/OutputSections.h
+++ b/lld/wasm/OutputSections.h
@@ -111,7 +111,7 @@ protected:
 // separately and are instead synthesized by the linker.
 class CustomSection : public OutputSection {
 public:
-  CustomSection(std::string name, ArrayRef<InputSection *> inputSections)
+  CustomSection(std::string name, ArrayRef<InputChunk *> inputSections)
       : OutputSection(llvm::wasm::WASM_SEC_CUSTOM, name),
         inputSections(inputSections) {}
 
@@ -128,8 +128,9 @@ public:
   void finalizeContents() override;
 
 protected:
+  void finalizeInputSections();
   size_t payloadSize = 0;
-  ArrayRef<InputSection *> inputSections;
+  std::vector<InputChunk *> inputSections;
   std::string nameData;
 };
 
diff --git a/lld/wasm/OutputSegment.cpp b/lld/wasm/OutputSegment.cpp
index bf3e40c968a0..c09d5c30a0f6 100644
--- a/lld/wasm/OutputSegment.cpp
+++ b/lld/wasm/OutputSegment.cpp
@@ -55,16 +55,15 @@ void OutputSegment::finalizeInputSegments() {
       return seg->flags == ms->flags && seg->alignment == ms->alignment;
     });
     if (i == mergedSegments.end()) {
-      LLVM_DEBUG(llvm::dbgs() << "new merge section: " << name
+      LLVM_DEBUG(llvm::dbgs() << "new merge segment: " << name
                               << " alignment=" << ms->alignment << "\n");
-      SyntheticMergedChunk *syn =
-          make<SyntheticMergedChunk>(name, ms->alignment, ms->flags);
+      auto *syn = make<SyntheticMergedChunk>(name, ms->alignment, ms->flags);
       syn->outputSeg = this;
       mergedSegments.push_back(syn);
       i = std::prev(mergedSegments.end());
       newSegments.push_back(syn);
     } else {
-      LLVM_DEBUG(llvm::dbgs() << "adding to merge section: " << name << "\n");
+      LLVM_DEBUG(llvm::dbgs() << "adding to merge segment: " << name << "\n");
     }
     (*i)->addMergeChunk(ms);
   }
diff --git a/lld/wasm/Symbols.cpp b/lld/wasm/Symbols.cpp
index 24b7e10dc559..6d960b4cf7e6 100644
--- a/lld/wasm/Symbols.cpp
+++ b/lld/wasm/Symbols.cpp
@@ -301,7 +301,7 @@ void DefinedData::setVA(uint64_t value_) {
 
 uint64_t DefinedData::getOutputSegmentOffset() const {
   LLVM_DEBUG(dbgs() << "getOutputSegmentOffset: " << getName() << "\n");
-  return segment->getSegmentOffset(value);
+  return segment->getChunkOffset(value);
 }
 
 uint64_t DefinedData::getOutputSegmentIndex() const {
diff --git a/lld/wasm/Symbols.h b/lld/wasm/Symbols.h
index ff6eb0ae7ccb..0c557530236d 100644
--- a/lld/wasm/Symbols.h
+++ b/lld/wasm/Symbols.h
@@ -254,14 +254,14 @@ public:
 
 class SectionSymbol : public Symbol {
 public:
-  SectionSymbol(uint32_t flags, const InputSection *s, InputFile *f = nullptr)
+  SectionSymbol(uint32_t flags, const InputChunk *s, InputFile *f = nullptr)
       : Symbol("", SectionKind, flags, f), section(s) {}
 
   static bool classof(const Symbol *s) { return s->kind() == SectionKind; }
 
   const OutputSectionSymbol *getOutputSectionSymbol() const;
 
-  const InputSection *section;
+  const InputChunk *section;
 };
 
 class DataSymbol : public Symbol {
diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp
index 055972560b81..1705c205eca4 100644
--- a/lld/wasm/Writer.cpp
+++ b/lld/wasm/Writer.cpp
@@ -100,7 +100,7 @@ private:
   uint64_t fileSize = 0;
 
   std::vector<WasmInitEntry> initFunctions;
-  llvm::StringMap<std::vector<InputSection *>> customSectionMapping;
+  llvm::StringMap<std::vector<InputChunk *>> customSectionMapping;
 
   // Stable storage for command export wrapper function name strings.
   std::list<std::string> commandExportWrapperNames;
@@ -121,7 +121,7 @@ void Writer::calculateCustomSections() {
   log("calculateCustomSections");
   bool stripDebug = config->stripDebug || config->stripAll;
   for (ObjFile *file : symtab->objectFiles) {
-    for (InputSection *section : file->customSections) {
+    for (InputChunk *section : file->customSections) {
       // Exclude COMDAT sections that are not selected for inclusion
       if (section->discarded)
         continue;
diff --git a/llvm/include/llvm/MC/MCContext.h b/llvm/include/llvm/MC/MCContext.h
index c531aa851d1e..100befc48ecb 100644
--- a/llvm/include/llvm/MC/MCContext.h
+++ b/llvm/include/llvm/MC/MCContext.h
@@ -610,8 +610,9 @@ namespace llvm {
     getAssociativeCOFFSection(MCSectionCOFF *Sec, const MCSymbol *KeySym,
                               unsigned UniqueID = GenericSectionID);
 
-    MCSectionWasm *getWasmSection(const Twine &Section, SectionKind K) {
-      return getWasmSection(Section, K, 0, nullptr);
+    MCSectionWasm *getWasmSection(const Twine &Section, SectionKind K,
+                                  unsigned Flags = 0) {
+      return getWasmSection(Section, K, Flags, nullptr);
     }
 
     MCSectionWasm *getWasmSection(const Twine &Section, SectionKind K,
diff --git a/llvm/lib/MC/MCObjectFileInfo.cpp b/llvm/lib/MC/MCObjectFileInfo.cpp
index 92091ffcb746..1a448f040b3b 100644
--- a/llvm/lib/MC/MCObjectFileInfo.cpp
+++ b/llvm/lib/MC/MCObjectFileInfo.cpp
@@ -11,6 +11,7 @@
 #include "llvm/ADT/Triple.h"
 #include "llvm/BinaryFormat/COFF.h"
 #include "llvm/BinaryFormat/ELF.h"
+#include "llvm/BinaryFormat/Wasm.h"
 #include "llvm/MC/MCAsmInfo.h"
 #include "llvm/MC/MCContext.h"
 #include "llvm/MC/MCSection.h"
@@ -791,9 +792,10 @@ void MCObjectFileInfo::initWasmMCObjectFileInfo(const 
Triple &T) {
   DwarfLineSection =
       Ctx->getWasmSection(".debug_line", SectionKind::getMetadata());
   DwarfLineStrSection =
-      Ctx->getWasmSection(".debug_line_str", SectionKind::getMetadata());
-  DwarfStrSection =
-      Ctx->getWasmSection(".debug_str", SectionKind::getMetadata());
+      Ctx->getWasmSection(".debug_line_str", SectionKind::getMetadata(),
+                          wasm::WASM_SEG_FLAG_STRINGS);
+  DwarfStrSection = Ctx->getWasmSection(
+      ".debug_str", SectionKind::getMetadata(), wasm::WASM_SEG_FLAG_STRINGS);
   DwarfLocSection =
       Ctx->getWasmSection(".debug_loc", SectionKind::getMetadata());
   DwarfAbbrevSection =
@@ -836,7 +838,8 @@ void MCObjectFileInfo::initWasmMCObjectFileInfo(const 
Triple &T) {
   DwarfAbbrevDWOSection =
       Ctx->getWasmSection(".debug_abbrev.dwo", SectionKind::getMetadata());
   DwarfStrDWOSection =
-      Ctx->getWasmSection(".debug_str.dwo", SectionKind::getMetadata());
+      Ctx->getWasmSection(".debug_str.dwo", SectionKind::getMetadata(),
+                          wasm::WASM_SEG_FLAG_STRINGS);
   DwarfLineDWOSection =
       Ctx->getWasmSection(".debug_line.dwo", SectionKind::getMetadata());
   DwarfLocDWOSection =
</cut>
_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to