Fix VA computation for tbss.

llvm-svn: 282149
This commit is contained in:
Rafael Espindola 2016-09-22 12:35:44 +00:00
parent 9bd12f4b3a
commit a940e5396b
2 changed files with 35 additions and 4 deletions

View File

@ -357,11 +357,14 @@ static void assignSectionSymbol(SymbolAssignment *Cmd,
Body->Value = Cmd->Expression(Sec->getVA() + Off);
}
template <class ELFT> static bool isTbss(OutputSectionBase<ELFT> *Sec) {
return (Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS;
}
template <class ELFT> void LinkerScript<ELFT>::output(InputSection<ELFT> *S) {
if (!AlreadyOutputIS.insert(S).second)
return;
bool IsTbss =
(CurOutSec->getFlags() & SHF_TLS) && CurOutSec->getType() == SHT_NOBITS;
bool IsTbss = isTbss(CurOutSec);
uintX_t Pos = IsTbss ? Dot + ThreadBssOffset : Dot;
Pos = alignTo(Pos, S->Alignment);
@ -398,7 +401,7 @@ void LinkerScript<ELFT>::switchTo(OutputSectionBase<ELFT> *Sec) {
CurOutSec = Sec;
Dot = alignTo(Dot, CurOutSec->getAlignment());
CurOutSec->setVA(Dot);
CurOutSec->setVA(isTbss(CurOutSec) ? Dot + ThreadBssOffset : Dot);
}
template <class ELFT> void LinkerScript<ELFT>::process(BaseCommand &Base) {

View File

@ -2,7 +2,35 @@
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
# RUN: echo "SECTIONS { }" > %t.script
# RUN: ld.lld -T %t.script %t.o -o %t
# RUN: llvm-readobj -l %t | FileCheck %s
# RUN: llvm-readobj -l -s %t | FileCheck %s
# CHECK: Name: .tbss
# CHECK-NEXT: Type: SHT_NOBITS
# CHECK-NEXT: Flags [
# CHECK-NEXT: SHF_ALLOC
# CHECK-NEXT: SHF_TLS
# CHECK-NEXT: SHF_WRITE
# CHECK-NEXT: ]
# CHECK-NEXT: Address:
# CHECK-NEXT: Offset:
# CHECK-NEXT: Size: 8
# CHECK-NEXT: Link:
# CHECK-NEXT: Info:
# CHECK-NEXT: AddressAlignment:
# CHECK-NEXT: EntrySize:
# CHECK-NEXT: }
# CHECK-NEXT: Section {
# CHECK-NEXT: Index:
# CHECK-NEXT: Name: foo
# CHECK-NEXT: Type: SHT_NOBITS
# CHECK-NEXT: Flags [
# CHECK-NEXT: SHF_ALLOC
# CHECK-NEXT: SHF_TLS
# CHECK-NEXT: SHF_WRITE
# CHECK-NEXT: ]
# CHECK-NEXT: Address:
# CHECK-NEXT: Offset:
# CHECK-NEXT: Size: 1
# CHECK: Type: PT_TLS
# CHECK-NEXT: Offset: