if (V.empty())
continue;
- OutputSectionBase<ELFT> *OutSec;
- bool IsNew;
- std::tie(OutSec, IsNew) = Factory.create(V.front(), Cmd->Name);
- if (IsNew)
- OutputSections->push_back(OutSec);
-
- uint32_t Subalign = Cmd->SubalignExpr ? Cmd->SubalignExpr(0) : 0;
for (InputSectionBase<ELFT> *Sec : V) {
+ OutputSectionBase<ELFT> *OutSec;
+ bool IsNew;
+ std::tie(OutSec, IsNew) = Factory.create(Sec, Cmd->Name);
+ if (IsNew)
+ OutputSections->push_back(OutSec);
+
+ uint32_t Subalign = Cmd->SubalignExpr ? Cmd->SubalignExpr(0) : 0;
+
if (Subalign)
Sec->Alignment = Subalign;
OutSec->addSection(Sec);
}
template <class ELFT>
-static OutputSectionBase<ELFT> *
-findSection(OutputSectionCommand &Cmd,
- ArrayRef<OutputSectionBase<ELFT> *> Sections) {
- for (OutputSectionBase<ELFT> *Sec : Sections) {
- if (Sec->getName() != Cmd.Name)
- continue;
- if (checkConstraint(Sec->getFlags(), Cmd.Constraint))
- return Sec;
- }
- return nullptr;
+static std::vector<OutputSectionBase<ELFT> *>
+findSections(OutputSectionCommand &Cmd,
+ ArrayRef<OutputSectionBase<ELFT> *> Sections) {
+ std::vector<OutputSectionBase<ELFT> *> Ret;
+ for (OutputSectionBase<ELFT> *Sec : Sections)
+ if (Sec->getName() == Cmd.Name &&
+ checkConstraint(Sec->getFlags(), Cmd.Constraint))
+ Ret.push_back(Sec);
+ return Ret;
}
template <class ELFT> void LinkerScript<ELFT>::assignAddresses() {
}
auto *Cmd = cast<OutputSectionCommand>(Base.get());
- OutputSectionBase<ELFT> *Sec = findSection<ELFT>(*Cmd, *OutputSections);
- if (!Sec)
- continue;
+ for (OutputSectionBase<ELFT> *Sec :
+ findSections<ELFT>(*Cmd, *OutputSections)) {
- if (Cmd->AddrExpr)
- Dot = Cmd->AddrExpr(Dot);
+ if (Cmd->AddrExpr)
+ Dot = Cmd->AddrExpr(Dot);
- if (Cmd->AlignExpr)
- Sec->updateAlignment(Cmd->AlignExpr(Dot));
+ if (Cmd->AlignExpr)
+ Sec->updateAlignment(Cmd->AlignExpr(Dot));
- if ((Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS) {
- uintX_t TVA = Dot + ThreadBssOffset;
- TVA = alignTo(TVA, Sec->getAlignment());
- Sec->setVA(TVA);
- assignOffsets(Cmd, Sec);
- ThreadBssOffset = TVA - Dot + Sec->getSize();
- continue;
- }
+ if ((Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS) {
+ uintX_t TVA = Dot + ThreadBssOffset;
+ TVA = alignTo(TVA, Sec->getAlignment());
+ Sec->setVA(TVA);
+ assignOffsets(Cmd, Sec);
+ ThreadBssOffset = TVA - Dot + Sec->getSize();
+ continue;
+ }
- if (!(Sec->getFlags() & SHF_ALLOC)) {
+ if (!(Sec->getFlags() & SHF_ALLOC)) {
+ assignOffsets(Cmd, Sec);
+ continue;
+ }
+
+ Dot = alignTo(Dot, Sec->getAlignment());
+ Sec->setVA(Dot);
assignOffsets(Cmd, Sec);
- continue;
+ MinVA = std::min(MinVA, Dot);
+ Dot += Sec->getSize();
}
-
- Dot = alignTo(Dot, Sec->getAlignment());
- Sec->setVA(Dot);
- assignOffsets(Cmd, Sec);
- MinVA = std::min(MinVA, Dot);
- Dot += Sec->getSize();
}
// ELF and Program headers need to be right before the first section in
+++ /dev/null
-# REQUIRES: x86
-# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
-
-# RUN: echo "SECTIONS { .foo : { *(.foo.*) } }" > %t.script
-# RUN: ld.lld -o %t1 --script %t.script %t
-# RUN: llvm-objdump -s %t1 | FileCheck %s
-# CHECK: Contents of section .foo:
-# CHECK-NEXT: 0158 01000000 02000000 00000000 73686f72 ............shor
-# CHECK-NEXT: 0168 7420756e 7369676e 65642069 6e7400 t unsigned int.
-
-.global _start
-_start:
- nop
-
-.section .foo.1, "aw"
-writable:
- .long 1
-
-.section .foo.2, "aM",@progbits,1
-readable:
- .long 2
-
-.section .foo.3, "awx"
- .long 0
-
-.section .foo.4, "MS",@progbits,1
-.LASF2:
- .string "short unsigned int"