[lld/mac] Move output segment rename logic into OutputSegment
authorNico Weber <thakis@chromium.org>
Sun, 25 Jul 2021 14:09:37 +0000 (10:09 -0400)
committerNico Weber <thakis@chromium.org>
Sun, 25 Jul 2021 22:20:09 +0000 (18:20 -0400)
Fixes the output segment name if both -rename_section and
-rename_segment are used and the post-section-rename segment
name is the same as the pre-segment-rename segment name to
match ld64's behavior.

The motivation is that segment$start$ can create section-less segments,
and this makes a corner case in the interaction between segment$start and
-rename_segment in the upcoming segment$start patch.

Differential Revision: https://reviews.llvm.org/D106766

lld/MachO/ConcatOutputSection.cpp
lld/MachO/OutputSegment.cpp
lld/test/MachO/rename.s

index b98af92..78590cf 100644 (file)
@@ -339,7 +339,7 @@ void ConcatOutputSection::writeTo(uint8_t *buf) const {
 void ConcatOutputSection::finalizeFlags(InputSection *input) {
   switch (sectionType(input->getFlags())) {
   default /*type-unspec'ed*/:
-    // FIXME: Add additional logics here when supporting emitting obj files.
+    // FIXME: Add additional logic here when supporting emitting obj files.
     break;
   case S_4BYTE_LITERALS:
   case S_8BYTE_LITERALS:
@@ -373,8 +373,5 @@ NamePair macho::maybeRenameSection(NamePair key) {
   auto newNames = config->sectionRenameMap.find(key);
   if (newNames != config->sectionRenameMap.end())
     return newNames->second;
-  auto newName = config->segmentRenameMap.find(key.first);
-  if (newName != config->segmentRenameMap.end())
-    return std::make_pair(newName->second, key.second);
   return key;
 }
index 7345bf0..7d9544d 100644 (file)
@@ -153,7 +153,16 @@ void macho::sortOutputSegments() {
 static DenseMap<StringRef, OutputSegment *> nameToOutputSegment;
 std::vector<OutputSegment *> macho::outputSegments;
 
+static StringRef maybeRenameSegment(StringRef name) {
+  auto newName = config->segmentRenameMap.find(name);
+  if (newName != config->segmentRenameMap.end())
+    return newName->second;
+  return name;
+}
+
 OutputSegment *macho::getOrCreateOutputSegment(StringRef name) {
+  name = maybeRenameSegment(name);
+
   OutputSegment *&segRef = nameToOutputSegment[name];
   if (segRef)
     return segRef;
index 7ce8204..94c3afd 100644 (file)
@@ -71,8 +71,7 @@
 # SECTSEGYES-NEXT:    segname __TEXT
 # SECTSEGYES:      Section
 # SECTSEGYES-NEXT:   sectname __to_sect
-# SECTSEGYES-NEXT:    segname __TO_SECT
-## FIXME: ^ This should use __SEG like ld64 does.
+# SECTSEGYES-NEXT:    segname __SEG
 ## ...but rename_segment has no effect if it doesn't match the name after
 ## rename_section is applied.
 # RUN: %lld -dylib \