diff options
author | Justin Cady <desk@justincady.com> | 2023-03-06 09:35:39 -0500 |
---|---|---|
committer | Justin Cady <desk@justincady.com> | 2023-03-07 12:44:02 -0500 |
commit | 447aa48b4a02fa9e22fa45b2fb7a85c12df2e6c3 (patch) | |
tree | f113c8926475b5bf37c14afd9e82f64348b004be /lld/ELF | |
parent | ba45f63782fa04a530d451dedb3cd58ed6e99664 (diff) | |
download | llvm-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.h | 9 | ||||
-rw-r--r-- | lld/ELF/LinkerScript.cpp | 2 | ||||
-rw-r--r-- | lld/ELF/ScriptParser.cpp | 1 |
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) |