diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2016-09-22 12:35:44 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2016-09-22 12:35:44 +0000 |
commit | a940e5396bbddca07896b26291b9cf793efdda3f (patch) | |
tree | 255516900ac4be7878abb3b79deb18e9258cccdf /lld/ELF/LinkerScript.cpp | |
parent | 9bd12f4b3aedd85409ac8e4aa6d2a0ffab4601ef (diff) | |
download | bcm5719-llvm-a940e5396bbddca07896b26291b9cf793efdda3f.tar.gz bcm5719-llvm-a940e5396bbddca07896b26291b9cf793efdda3f.zip |
Fix VA computation for tbss.
llvm-svn: 282149
Diffstat (limited to 'lld/ELF/LinkerScript.cpp')
-rw-r--r-- | lld/ELF/LinkerScript.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 7edfacae97a..922c23e2862 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -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) { |