summaryrefslogtreecommitdiff
path: root/lld/ELF
diff options
context:
space:
mode:
authorJustin Cady <desk@justincady.com>2023-03-06 09:35:39 -0500
committerJustin Cady <desk@justincady.com>2023-03-07 12:44:02 -0500
commit447aa48b4a02fa9e22fa45b2fb7a85c12df2e6c3 (patch)
treef113c8926475b5bf37c14afd9e82f64348b004be /lld/ELF
parentba45f63782fa04a530d451dedb3cd58ed6e99664 (diff)
downloadllvm-447aa48b4a02fa9e22fa45b2fb7a85c12df2e6c3.tar.gz
[ELF] Add REVERSE input section description keyword
The `REVERSE` keyword is described here: https://sourceware.org/bugzilla/show_bug.cgi?id=27565 It complements `SORT` by allowing the order of input sections to be reversed. This is particularly useful for order-dependent sections such as .init_array, where `REVERSE` can be used to either detect static initialization order fiasco issues or as a mechanism to maintain .ctors element order while transitioning to the modern .init_array. Such a transition is described here: https://discourse.llvm.org/t/is-it-possible-to-manually-specify-init-array-order/68649 Differential Revision: https://reviews.llvm.org/D145381
Diffstat (limited to 'lld/ELF')
-rw-r--r--lld/ELF/Config.h9
-rw-r--r--lld/ELF/LinkerScript.cpp2
-rw-r--r--lld/ELF/ScriptParser.cpp1
3 files changed, 11 insertions, 1 deletions
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h
index 61faea4e9bce..249fe3c30ece 100644
--- a/lld/ELF/Config.h
+++ b/lld/ELF/Config.h
@@ -73,7 +73,14 @@ enum class UnresolvedPolicy { ReportError, Warn, Ignore };
enum class OrphanHandlingPolicy { Place, Warn, Error };
// For --sort-section and linkerscript sorting rules.
-enum class SortSectionPolicy { Default, None, Alignment, Name, Priority };
+enum class SortSectionPolicy {
+ Default,
+ None,
+ Alignment,
+ Name,
+ Priority,
+ Reverse,
+};
// For --target2
enum class Target2Policy { Abs, Rel, GotRel };
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index 668a79b5edd7..9207751cb7d2 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -457,6 +457,8 @@ static void sortSections(MutableArrayRef<InputSectionBase *> vec,
return llvm::stable_sort(vec, nameComparator);
case SortSectionPolicy::Priority:
return llvm::stable_sort(vec, priorityComparator);
+ case SortSectionPolicy::Reverse:
+ return std::reverse(vec.begin(), vec.end());
}
}
diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp
index e83779bcebff..db7f0268cef6 100644
--- a/lld/ELF/ScriptParser.cpp
+++ b/lld/ELF/ScriptParser.cpp
@@ -660,6 +660,7 @@ StringMatcher ScriptParser::readFilePatterns() {
SortSectionPolicy ScriptParser::peekSortKind() {
return StringSwitch<SortSectionPolicy>(peek())
+ .Case("REVERSE", SortSectionPolicy::Reverse)
.Cases("SORT", "SORT_BY_NAME", SortSectionPolicy::Name)
.Case("SORT_BY_ALIGNMENT", SortSectionPolicy::Alignment)
.Case("SORT_BY_INIT_PRIORITY", SortSectionPolicy::Priority)