[lld] r281646 - [ELF] - Linkerscript: implemented SORT_BY_INIT_PRIORITY.
Rafael EspĂndola via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 16 04:36:39 PDT 2016
Thanks!
On 15 September 2016 at 15:15, George Rimar via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: grimar
> Date: Thu Sep 15 14:15:12 2016
> New Revision: 281646
>
> URL: http://llvm.org/viewvc/llvm-project?rev=281646&view=rev
> Log:
> [ELF] - Linkerscript: implemented SORT_BY_INIT_PRIORITY.
>
> This is PR30386,
>
> SORT_BY_INIT_PRIORITY is a keyword can be used to sort sections by
> numerical value of the
> GCC init_priority attribute encoded in the section name.
>
> Differential revision: https://reviews.llvm.org/D24611
>
> Added:
> lld/trunk/test/ELF/linkerscript/sort-init.s
> Modified:
> lld/trunk/ELF/LinkerScript.cpp
> lld/trunk/ELF/LinkerScript.h
> lld/trunk/ELF/OutputSections.cpp
> lld/trunk/ELF/Strings.cpp
> lld/trunk/ELF/Strings.h
>
> Modified: lld/trunk/ELF/LinkerScript.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> LinkerScript.cpp?rev=281646&r1=281645&r2=281646&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/LinkerScript.cpp (original)
> +++ lld/trunk/ELF/LinkerScript.cpp Thu Sep 15 14:15:12 2016
> @@ -110,6 +110,10 @@ static bool fileMatches(const InputSecti
> !const_cast<Regex &>(Desc->ExcludedFileRe).match(Filename);
> }
>
> +static bool comparePriority(InputSectionData *A, InputSectionData *B) {
> + return getPriority(A->Name) < getPriority(B->Name);
> +}
> +
> static bool compareName(InputSectionData *A, InputSectionData *B) {
> return A->Name < B->Name;
> }
> @@ -123,6 +127,8 @@ static bool compareAlignment(InputSectio
>
> static std::function<bool(InputSectionData *, InputSectionData *)>
> getComparator(SortKind K) {
> + if (K == SortByPriority)
> + return comparePriority;
> if (K == SortByName)
> return compareName;
> return compareAlignment;
> @@ -967,6 +973,8 @@ SortKind ScriptParser::readSortKind() {
> return SortByName;
> if (skip("SORT_BY_ALIGNMENT"))
> return SortByAlignment;
> + if (skip("SORT_BY_INIT_PRIORITY"))
> + return SortByPriority;
> return SortNone;
> }
>
>
> Modified: lld/trunk/ELF/LinkerScript.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> LinkerScript.h?rev=281646&r1=281645&r2=281646&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/LinkerScript.h (original)
> +++ lld/trunk/ELF/LinkerScript.h Thu Sep 15 14:15:12 2016
> @@ -95,7 +95,7 @@ struct OutputSectionCommand : BaseComman
> ConstraintKind Constraint = ConstraintKind::NoConstraint;
> };
>
> -enum SortKind { SortNone, SortByName, SortByAlignment };
> +enum SortKind { SortNone, SortByPriority, SortByName, SortByAlignment };
>
> struct InputSectionDescription : BaseCommand {
> InputSectionDescription(StringRef FilePattern)
>
> Modified: lld/trunk/ELF/OutputSections.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> OutputSections.cpp?rev=281646&r1=281645&r2=281646&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/OutputSections.cpp (original)
> +++ lld/trunk/ELF/OutputSections.cpp Thu Sep 15 14:15:12 2016
> @@ -895,19 +895,6 @@ void OutputSection<ELFT>::addSection(Inp
> this->updateAlignment(S->Alignment);
> }
>
> -// If an input string is in the form of "foo.N" where N is a number,
> -// return N. Otherwise, returns 65536, which is one greater than the
> -// lowest priority.
> -static int getPriority(StringRef S) {
> - size_t Pos = S.rfind('.');
> - if (Pos == StringRef::npos)
> - return 65536;
> - int V;
> - if (S.substr(Pos + 1).getAsInteger(10, V))
> - return 65536;
> - return V;
> -}
> -
> // This function is called after we sort input sections
> // and scan relocations to setup sections' offsets.
> template <class ELFT> void OutputSection<ELFT>::assignOffsets() {
>
> Modified: lld/trunk/ELF/Strings.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Strings.
> cpp?rev=281646&r1=281645&r2=281646&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/Strings.cpp (original)
> +++ lld/trunk/ELF/Strings.cpp Thu Sep 15 14:15:12 2016
> @@ -20,6 +20,19 @@ using namespace llvm;
> using namespace lld;
> using namespace lld::elf;
>
> +// If an input string is in the form of "foo.N" where N is a number,
> +// return N. Otherwise, returns 65536, which is one greater than the
> +// lowest priority.
> +int elf::getPriority(StringRef S) {
> + size_t Pos = S.rfind('.');
> + if (Pos == StringRef::npos)
> + return 65536;
> + int V;
> + if (S.substr(Pos + 1).getAsInteger(10, V))
> + return 65536;
> + return V;
> +}
> +
> bool elf::hasWildcard(StringRef S) {
> return S.find_first_of("?*[") != StringRef::npos;
> }
>
> Modified: lld/trunk/ELF/Strings.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Strings.
> h?rev=281646&r1=281645&r2=281646&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/Strings.h (original)
> +++ lld/trunk/ELF/Strings.h Thu Sep 15 14:15:12 2016
> @@ -17,6 +17,7 @@
> namespace lld {
> namespace elf {
> llvm::Regex compileGlobPatterns(ArrayRef<StringRef> V);
> +int getPriority(StringRef S);
> bool hasWildcard(StringRef S);
> std::vector<uint8_t> parseHex(StringRef S);
> bool isValidCIdentifier(StringRef S);
>
> Added: lld/trunk/test/ELF/linkerscript/sort-init.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/
> linkerscript/sort-init.s?rev=281646&view=auto
> ============================================================
> ==================
> --- lld/trunk/test/ELF/linkerscript/sort-init.s (added)
> +++ lld/trunk/test/ELF/linkerscript/sort-init.s Thu Sep 15 14:15:12 2016
> @@ -0,0 +1,24 @@
> +# REQUIRES: x86
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o
> +# RUN: echo "SECTIONS { .init_array : { *(SORT_BY_INIT_PRIORITY(.init_array.*))
> } }" > %t1.script
> +# RUN: ld.lld --script %t1.script %t1.o -o %t2
> +# RUN: llvm-objdump -s %t2 | FileCheck %s
> +
> +# CHECK: Contents of section .init_array:
> +# CHECK-NEXT: 03020000 00000000 010405
> +
> +.globl _start
> +_start:
> + nop
> +
> +.section .init_array, "aw", @init_array
> + .align 8
> + .byte 1
> +.section .init_array.100, "aw", @init_array
> + .long 2
> +.section .init_array.5, "aw", @init_array
> + .byte 3
> +.section .init_array, "aw", @init_array
> + .byte 4
> +.section .init_array, "aw", @init_array
> + .byte 5
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160916/4d083934/attachment.html>
More information about the llvm-commits
mailing list