mirror of
https://github.com/intel/llvm.git
synced 2026-01-19 01:15:50 +08:00
Implement ONLY_IF_RO/ONLY_IF_RW like bfd.
The actual logic is to keep the output section if the output section would have been ro/rw. This is both simpler and more practical, as the intention is linker scripts is to always keep of of a pair of ONLY_IF_RO/ONLY_IF_RW. llvm-svn: 282099
This commit is contained in:
@@ -138,22 +138,17 @@ getComparator(SortSectionPolicy K) {
|
||||
}
|
||||
}
|
||||
|
||||
static bool checkConstraint(uint64_t Flags, ConstraintKind Kind) {
|
||||
bool RO = (Kind == ConstraintKind::ReadOnly);
|
||||
bool RW = (Kind == ConstraintKind::ReadWrite);
|
||||
bool Writable = Flags & SHF_WRITE;
|
||||
return !(RO && Writable) && !(RW && !Writable);
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
static bool matchConstraints(ArrayRef<InputSectionBase<ELFT> *> Sections,
|
||||
ConstraintKind Kind) {
|
||||
if (Kind == ConstraintKind::NoConstraint)
|
||||
return true;
|
||||
return llvm::all_of(Sections, [=](InputSectionData *Sec2) {
|
||||
bool IsRW = llvm::any_of(Sections, [=](InputSectionData *Sec2) {
|
||||
auto *Sec = static_cast<InputSectionBase<ELFT> *>(Sec2);
|
||||
return checkConstraint(Sec->getSectionHdr()->sh_flags, Kind);
|
||||
return Sec->getSectionHdr()->sh_flags & SHF_WRITE;
|
||||
});
|
||||
return (IsRW && Kind == ConstraintKind::ReadWrite) ||
|
||||
(!IsRW && Kind == ConstraintKind::ReadOnly);
|
||||
}
|
||||
|
||||
static void sortSections(InputSectionData **Begin, InputSectionData **End,
|
||||
|
||||
Reference in New Issue
Block a user