forked from OSchip/llvm-project
[ELF] - Get rid of SectionOrder array.
SectionOrder vector was a part of LinkerScript class. It can be removed because Commands vector contains the same information and SectiorOrder is just a subset. Differential revision: http://reviews.llvm.org/D19171 llvm-svn: 266974
This commit is contained in:
parent
b5737c1491
commit
71b26e94fd
|
@ -204,8 +204,7 @@ void LinkerScript<ELFT>::assignAddresses(
|
|||
// https://sourceware.org/binutils/docs/ld/Orphan-Sections.html#Orphan-Sections.
|
||||
for (OutputSectionBase<ELFT> *Sec : Sections) {
|
||||
StringRef Name = Sec->getName();
|
||||
auto I = std::find(Opt.SectionOrder.begin(), Opt.SectionOrder.end(), Name);
|
||||
if (I == Opt.SectionOrder.end())
|
||||
if (getSectionOrder(Name) == (uint32_t)-1)
|
||||
Opt.Commands.push_back({SectionKind, {}, Name});
|
||||
}
|
||||
|
||||
|
@ -249,15 +248,23 @@ ArrayRef<uint8_t> LinkerScript<ELFT>::getFiller(StringRef Name) {
|
|||
return I->second;
|
||||
}
|
||||
|
||||
// A compartor to sort output sections. Returns -1 or 1 if both
|
||||
// A and B are mentioned in linker scripts. Otherwise, returns 0
|
||||
// to use the default rule which is implemented in Writer.cpp.
|
||||
template <class ELFT>
|
||||
uint32_t LinkerScript<ELFT>::getSectionOrder(StringRef Name) {
|
||||
auto Begin = Opt.Commands.begin();
|
||||
auto End = Opt.Commands.end();
|
||||
auto I = std::find_if(Begin, End, [&](SectionsCommand &N) {
|
||||
return N.Kind == SectionKind && N.SectionName == Name;
|
||||
});
|
||||
return I == End ? (uint32_t)-1 : (I - Begin);
|
||||
}
|
||||
|
||||
// A compartor to sort output sections. Returns -1 or 1 if
|
||||
// A or B are mentioned in linker script. Otherwise, returns 0.
|
||||
template <class ELFT>
|
||||
int LinkerScript<ELFT>::compareSections(StringRef A, StringRef B) {
|
||||
auto E = Opt.SectionOrder.end();
|
||||
auto I = std::find(Opt.SectionOrder.begin(), E, A);
|
||||
auto J = std::find(Opt.SectionOrder.begin(), E, B);
|
||||
if (I == E || J == E)
|
||||
uint32_t I = getSectionOrder(A);
|
||||
uint32_t J = getSectionOrder(B);
|
||||
if (I == (uint32_t)-1 && J == (uint32_t)-1)
|
||||
return 0;
|
||||
return I < J ? -1 : 1;
|
||||
}
|
||||
|
@ -509,7 +516,6 @@ void ScriptParser::readLocationCounterValue() {
|
|||
|
||||
void ScriptParser::readOutputSectionDescription() {
|
||||
StringRef OutSec = next();
|
||||
Opt.SectionOrder.push_back(OutSec);
|
||||
Opt.Commands.push_back({SectionKind, {}, OutSec});
|
||||
expect(":");
|
||||
expect("{");
|
||||
|
|
|
@ -61,9 +61,6 @@ struct ScriptConfiguration {
|
|||
// SECTIONS commands.
|
||||
std::vector<SectionRule> Sections;
|
||||
|
||||
// Output sections are sorted by this order.
|
||||
std::vector<StringRef> SectionOrder;
|
||||
|
||||
// Section fill attribute for each section.
|
||||
llvm::StringMap<std::vector<uint8_t>> Filler;
|
||||
|
||||
|
@ -86,6 +83,7 @@ public:
|
|||
bool shouldKeep(InputSectionBase<ELFT> *S);
|
||||
void assignAddresses(std::vector<OutputSectionBase<ELFT> *> &S);
|
||||
int compareSections(StringRef A, StringRef B);
|
||||
uint32_t getSectionOrder(StringRef Name);
|
||||
|
||||
private:
|
||||
SectionRule *find(InputSectionBase<ELFT> *S);
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
# REQUIRES: x86
|
||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
|
||||
|
||||
# RUN: echo "SECTIONS { .writable : { *(.writable) } }" > %t.script
|
||||
# RUN: ld.lld -o %t.out --script %t.script %t
|
||||
# RUN: llvm-objdump -section-headers %t.out | \
|
||||
# RUN: FileCheck -check-prefix=TEXTORPHAN %s
|
||||
|
||||
# RUN: echo "SECTIONS { .text : { *(.text) } }" > %t.script
|
||||
# RUN: ld.lld -o %t.out --script %t.script %t
|
||||
# RUN: llvm-objdump -section-headers %t.out | \
|
||||
# RUN: FileCheck -check-prefix=WRITABLEORPHAN %s
|
||||
|
||||
# TEXTORPHAN: Sections:
|
||||
# TEXTORPHAN-NEXT: Idx Name
|
||||
# TEXTORPHAN-NEXT: 0
|
||||
# TEXTORPHAN-NEXT: 1 .writable
|
||||
# TEXTORPHAN-NEXT: 2 .text
|
||||
|
||||
# WRITABLEORPHAN: Sections:
|
||||
# WRITABLEORPHAN-NEXT: Idx Name
|
||||
# WRITABLEORPHAN-NEXT: 0
|
||||
# WRITABLEORPHAN-NEXT: 1 .text
|
||||
# WRITABLEORPHAN-NEXT: 2 .writable
|
||||
|
||||
.global _start
|
||||
_start:
|
||||
nop
|
||||
|
||||
.section .writable,"aw"
|
||||
.zero 4
|
Loading…
Reference in New Issue