mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-13 03:12:46 +00:00
[ELF] - Move ThreadBssOffset and Dot to LinkerScriptBase. NFC.
One more step to combine LinkerScript and LinkerScriptBase. llvm-svn: 297722
This commit is contained in:
parent
72e3fa7e2c
commit
0c1c8085bc
@ -81,7 +81,7 @@ static bool isUnderSysroot(StringRef Path) {
|
||||
|
||||
template <class ELFT>
|
||||
void LinkerScript<ELFT>::setDot(Expr E, const Twine &Loc, bool InSec) {
|
||||
uintX_t Val = E();
|
||||
uint64_t Val = E();
|
||||
if (Val < Dot) {
|
||||
if (InSec)
|
||||
error(Loc + ": unable to move location counter backward for: " +
|
||||
@ -398,7 +398,7 @@ template <class ELFT> void LinkerScript<ELFT>::output(InputSection *S) {
|
||||
return;
|
||||
bool IsTbss = isTbss<ELFT>(CurOutSec);
|
||||
|
||||
uintX_t Pos = IsTbss ? Dot + ThreadBssOffset : Dot;
|
||||
uint64_t Pos = IsTbss ? Dot + ThreadBssOffset : Dot;
|
||||
Pos = alignTo(Pos, S->Alignment);
|
||||
S->OutSecOff = Pos - CurOutSec->Addr;
|
||||
Pos += S->getSize();
|
||||
@ -555,7 +555,7 @@ void LinkerScript<ELFT>::assignOffsets(OutputSectionCommand *Cmd) {
|
||||
setDot(Cmd->AddrExpr, Cmd->Location);
|
||||
|
||||
if (Cmd->LMAExpr) {
|
||||
uintX_t D = Dot;
|
||||
uint64_t D = Dot;
|
||||
LMAOffset = [=] { return Cmd->LMAExpr() - D; };
|
||||
}
|
||||
|
||||
@ -612,7 +612,7 @@ template <class ELFT> void LinkerScript<ELFT>::adjustSectionsBeforeSorting() {
|
||||
// corresponding output section. The bfd linker seems to only create them if
|
||||
// '.' is assigned to, but creating these section should not have any bad
|
||||
// consequeces and gives us a section to put the symbol in.
|
||||
uintX_t Flags = SHF_ALLOC;
|
||||
uint64_t Flags = SHF_ALLOC;
|
||||
uint32_t Type = SHT_NOBITS;
|
||||
for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) {
|
||||
auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get());
|
||||
@ -784,7 +784,7 @@ void LinkerScript<ELFT>::assignAddresses(std::vector<PhdrEntry> &Phdrs) {
|
||||
assignOffsets(Cmd);
|
||||
}
|
||||
|
||||
uintX_t MinVA = std::numeric_limits<uintX_t>::max();
|
||||
uint64_t MinVA = std::numeric_limits<uint64_t>::max();
|
||||
for (OutputSection *Sec : *OutputSections) {
|
||||
if (Sec->Flags & SHF_ALLOC)
|
||||
MinVA = std::min<uint64_t>(MinVA, Sec->Addr);
|
||||
|
@ -234,6 +234,9 @@ protected:
|
||||
// "ScriptConfig" is a bit too long, so define a short name for it.
|
||||
ScriptConfiguration &Opt = *ScriptConfig;
|
||||
|
||||
uint64_t Dot;
|
||||
uint64_t ThreadBssOffset = 0;
|
||||
|
||||
public:
|
||||
bool hasPhdrsCommands() { return !Opt.PhdrsCommands.empty(); }
|
||||
|
||||
@ -248,8 +251,6 @@ public:
|
||||
|
||||
// This is a runner of the linker script.
|
||||
template <class ELFT> class LinkerScript final : public LinkerScriptBase {
|
||||
typedef typename ELFT::uint uintX_t;
|
||||
|
||||
public:
|
||||
LinkerScript();
|
||||
~LinkerScript();
|
||||
@ -297,11 +298,9 @@ private:
|
||||
|
||||
MemoryRegion *findMemoryRegion(OutputSectionCommand *Cmd, OutputSection *Sec);
|
||||
|
||||
uintX_t Dot;
|
||||
std::function<uint64_t()> LMAOffset;
|
||||
OutputSection *CurOutSec = nullptr;
|
||||
MemoryRegion *CurMemRegion = nullptr;
|
||||
uintX_t ThreadBssOffset = 0;
|
||||
void switchTo(OutputSection *Sec);
|
||||
void flush();
|
||||
void output(InputSection *Sec);
|
||||
|
Loading…
x
Reference in New Issue
Block a user