[lld] r317307 - [ELF] - Linkerscript: fixed non-determinism when handling MEMORY.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 3 01:21:51 PDT 2017
Author: grimar
Date: Fri Nov 3 01:21:51 2017
New Revision: 317307
URL: http://llvm.org/viewvc/llvm-project?rev=317307&view=rev
Log:
[ELF] - Linkerscript: fixed non-determinism when handling MEMORY.
When findMemoryRegion do search to find a region for output section it
iterates over MemoryRegions which is DenseMap and so does not
guarantee iteration in insertion order. As a result selected region depends
on its name and not on its definition position
Testcase shows the issue, patch fixes it. Behavior after applying the patch
seems consistent with bfd.
Differential revision: https://reviews.llvm.org/D39544
Added:
lld/trunk/test/ELF/linkerscript/memory3.s
Modified:
lld/trunk/ELF/LinkerScript.h
lld/trunk/ELF/ScriptParser.cpp
Modified: lld/trunk/ELF/LinkerScript.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.h?rev=317307&r1=317306&r2=317307&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.h (original)
+++ lld/trunk/ELF/LinkerScript.h Fri Nov 3 01:21:51 2017
@@ -277,7 +277,7 @@ public:
std::vector<InputSectionDescription *> KeptSections;
// A map from memory region name to a memory region descriptor.
- llvm::DenseMap<llvm::StringRef, MemoryRegion *> MemoryRegions;
+ llvm::MapVector<llvm::StringRef, MemoryRegion *> MemoryRegions;
// A list of symbols referenced by the script.
std::vector<llvm::StringRef> ReferencedSymbols;
Modified: lld/trunk/ELF/ScriptParser.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/ScriptParser.cpp?rev=317307&r1=317306&r2=317307&view=diff
==============================================================================
--- lld/trunk/ELF/ScriptParser.cpp (original)
+++ lld/trunk/ELF/ScriptParser.cpp Fri Nov 3 01:21:51 2017
@@ -422,7 +422,7 @@ void ScriptParser::readRegionAlias() {
setError("redefinition of memory region '" + Alias + "'");
if (!Script->MemoryRegions.count(Name))
setError("memory region '" + Name + "' is not defined");
- Script->MemoryRegions[Alias] = Script->MemoryRegions[Name];
+ Script->MemoryRegions.insert({Alias, Script->MemoryRegions[Name]});
}
void ScriptParser::readSearchDir() {
Added: lld/trunk/test/ELF/linkerscript/memory3.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/memory3.s?rev=317307&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/memory3.s (added)
+++ lld/trunk/test/ELF/linkerscript/memory3.s Fri Nov 3 01:21:51 2017
@@ -0,0 +1,23 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
+# RUN: echo "MEMORY { ram2 (ax) : ORIGIN = 0x1000, LENGTH = 1K \
+# RUN: ram1 (ax) : ORIGIN = 0x4000, LENGTH = 1K } \
+# RUN: SECTIONS {}" > %t1.script
+# RUN: ld.lld -o %t1 --script %t1.script %t
+# RUN: llvm-objdump -section-headers %t1 | FileCheck %s
+
+# RUN: echo "MEMORY { ram1 (ax) : ORIGIN = 0x1000, LENGTH = 1K \
+# RUN: ram2 (ax) : ORIGIN = 0x4000, LENGTH = 1K } \
+# RUN: SECTIONS {}" > %t2.script
+# RUN: ld.lld -o %t2 --script %t2.script %t
+# RUN: llvm-objdump -section-headers %t2 | FileCheck %s
+
+## Check we place .text into first defined memory region with appropriate flags.
+# CHECK: Sections:
+# CHECK: Idx Name Size Address
+# CHECK: 0 00000000 0000000000000000
+# CHECK: 1 .text 00000001 0000000000001000
+
+.section .text.foo,"ax",%progbits
+foo:
+ nop
More information about the llvm-commits
mailing list