summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/MC/ELFObjectWriter.cpp9
-rw-r--r--llvm/test/MC/ARM/eh-directive-section-comdat.s4
-rw-r--r--llvm/test/MC/ARM/eh-directive-section.s6
-rw-r--r--llvm/test/MC/ARM/eh-link.s6
-rw-r--r--llvm/test/MC/ELF/comdat-reloc.s4
5 files changed, 18 insertions, 11 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp
index 8cb01c43edd..b293afc56a0 100644
--- a/llvm/lib/MC/ELFObjectWriter.cpp
+++ b/llvm/lib/MC/ELFObjectWriter.cpp
@@ -943,6 +943,8 @@ void ELFObjectWriter::computeIndexMap(MCAssembler &Asm,
SectionIndexMap[&Section] = Index++;
}
+ std::vector<const MCSectionELF *> RelSections;
+
for (MCAssembler::iterator it = Asm.begin(),
ie = Asm.end(); it != ie; ++it) {
const MCSectionData &SD = *it;
@@ -956,9 +958,14 @@ void ELFObjectWriter::computeIndexMap(MCAssembler &Asm,
if (MCSectionData *RelSD = createRelocationSection(Asm, SD)) {
const MCSectionELF *RelSection =
static_cast<const MCSectionELF *>(&RelSD->getSection());
- SectionIndexMap[RelSection] = Index++;
+ RelSections.push_back(RelSection);
}
}
+
+ // Put relocation sections close together. The linker reads them
+ // first, so this improves cache locality.
+ for (const MCSectionELF * Sec: RelSections)
+ SectionIndexMap[Sec] = Index++;
}
void ELFObjectWriter::computeSymbolTable(
diff --git a/llvm/test/MC/ARM/eh-directive-section-comdat.s b/llvm/test/MC/ARM/eh-directive-section-comdat.s
index 296718f096c..fb2a83b47e4 100644
--- a/llvm/test/MC/ARM/eh-directive-section-comdat.s
+++ b/llvm/test/MC/ARM/eh-directive-section-comdat.s
@@ -52,7 +52,7 @@ func1:
@ The second, third, and fourth word should correspond to the section index
@ of .TEST1, .ARM.extab.TEST1, and .ARM.exidx.TEST1.
@-------------------------------------------------------------------------------
-@ CHECK: 0000: 01000000 05000000 06000000 08000000 |................|
+@ CHECK: 0000: 01000000 05000000 06000000 07000000 |................|
@ CHECK: )
@ CHECK: }
@@ -96,7 +96,7 @@ func1:
@ Check the .ARM.exidx.TEST1 section
@-------------------------------------------------------------------------------
@ CHECK: Section {
-@ CHECK: Index: 8
+@ CHECK: Index: 7
@ CHECK: Name: .ARM.exidx.TEST1
@ CHECK: Type: SHT_ARM_EXIDX (0x70000001)
@-------------------------------------------------------------------------------
diff --git a/llvm/test/MC/ARM/eh-directive-section.s b/llvm/test/MC/ARM/eh-directive-section.s
index 671d10679d1..53ac48e848b 100644
--- a/llvm/test/MC/ARM/eh-directive-section.s
+++ b/llvm/test/MC/ARM/eh-directive-section.s
@@ -109,7 +109,7 @@ func2:
@ Check the TEST2 section (without the dot in the beginning)
@-------------------------------------------------------------------------------
@ CHECK: Section {
-@ CHECK: Index: 9
+@ CHECK: Index: 7
@ CHECK: Name: TEST2
@ CHECK: SectionData (
@ CHECK: 0000: 1EFF2FE1 |../.|
@@ -143,7 +143,7 @@ func2:
@-------------------------------------------------------------------------------
@ This section should linked with TEST2 section.
@-------------------------------------------------------------------------------
-@ CHECK: Link: 9
+@ CHECK: Link: 7
@-------------------------------------------------------------------------------
@ The first word should be relocated to the code address in TEST2 section.
@@ -175,6 +175,6 @@ func2:
@ CHECK: }
@ CHECK: Symbol {
@ CHECK: Name: func2
-@ CHECK: Section: TEST2 (0x9)
+@ CHECK: Section: TEST2 (0x7)
@ CHECK: }
@ CHECK: ]
diff --git a/llvm/test/MC/ARM/eh-link.s b/llvm/test/MC/ARM/eh-link.s
index 0c44c0e2c06..296f9072e0e 100644
--- a/llvm/test/MC/ARM/eh-link.s
+++ b/llvm/test/MC/ARM/eh-link.s
@@ -43,7 +43,7 @@
@ CHECK-NEXT: }
@ CHECK: Section {
-@ CHECK: Index: 9
+@ CHECK: Index: 8
@ CHECK-NEXT: Name: .text
@ CHECK-NEXT: Type: SHT_PROGBITS
@ CHECK-NEXT: Flags [
@@ -60,7 +60,7 @@
@ CHECK-NEXT: EntrySize: 0
@ CHECK-NEXT: }
@ CHECK-NEXT: Section {
-@ CHECK-NEXT: Index: 10
+@ CHECK-NEXT: Index: 9
@ CHECK-NEXT: Name: .ARM.exidx
@ CHECK-NEXT: Type: SHT_ARM_EXIDX
@ CHECK-NEXT: Flags [
@@ -71,7 +71,7 @@
@ CHECK-NEXT: Address: 0x0
@ CHECK-NEXT: Offset:
@ CHECK-NEXT: Size: 8
-@ CHECK-NEXT: Link: 9
+@ CHECK-NEXT: Link: 8
@ CHECK-NEXT: Info: 0
@ CHECK-NEXT: AddressAlignment: 4
@ CHECK-NEXT: EntrySize: 0
diff --git a/llvm/test/MC/ELF/comdat-reloc.s b/llvm/test/MC/ELF/comdat-reloc.s
index d893a7b149e..e7aa3d93738 100644
--- a/llvm/test/MC/ELF/comdat-reloc.s
+++ b/llvm/test/MC/ELF/comdat-reloc.s
@@ -16,9 +16,9 @@ world:
// CHECK: Name: .group
// CHECK-NOT: SectionData
// CHECK: SectionData
-// CHECK-NEXT: 0000: 01000000 06000000 07000000
+// CHECK-NEXT: 0000: 01000000 05000000 07000000
-// CHECK: Index: 6
+// CHECK: Index: 5
// CHECK-NEXT: Name: .text.world
// CHECK-NOT: Section {
// CHECK: SHF_GROUP
OpenPOWER on IntegriCloud