forked from OSchip/llvm-project
[ELF] Pass a pointer to InputFile to the getRelocTargetVA to escape dereferencing of nullptr. NFC
llvm-svn: 334392
This commit is contained in:
parent
f4f6899cdf
commit
00d8843fa3
|
|
@ -477,7 +477,7 @@ static uint64_t getARMStaticBase(const Symbol &Sym) {
|
|||
return OS->PtLoad->FirstSec->Addr;
|
||||
}
|
||||
|
||||
static uint64_t getRelocTargetVA(const InputFile &File, RelType Type, int64_t A,
|
||||
static uint64_t getRelocTargetVA(const InputFile *File, RelType Type, int64_t A,
|
||||
uint64_t P, const Symbol &Sym, RelExpr Expr) {
|
||||
switch (Expr) {
|
||||
case R_INVALID:
|
||||
|
|
@ -516,9 +516,9 @@ static uint64_t getRelocTargetVA(const InputFile &File, RelType Type, int64_t A,
|
|||
case R_TLSDESC_CALL:
|
||||
llvm_unreachable("cannot relocate hint relocs");
|
||||
case R_MIPS_GOTREL:
|
||||
return Sym.getVA(A) - InX::MipsGot->getGp(&File);
|
||||
return Sym.getVA(A) - InX::MipsGot->getGp(File);
|
||||
case R_MIPS_GOT_GP:
|
||||
return InX::MipsGot->getGp(&File) + A;
|
||||
return InX::MipsGot->getGp(File) + A;
|
||||
case R_MIPS_GOT_GP_PC: {
|
||||
// R_MIPS_LO16 expression has R_MIPS_GOT_GP_PC type iif the target
|
||||
// is _gp_disp symbol. In that case we should use the following
|
||||
|
|
@ -527,7 +527,7 @@ static uint64_t getRelocTargetVA(const InputFile &File, RelType Type, int64_t A,
|
|||
// microMIPS variants of these relocations use slightly different
|
||||
// expressions: AHL + GP - P + 3 for %lo() and AHL + GP - P - 1 for %hi()
|
||||
// to correctly handle less-sugnificant bit of the microMIPS symbol.
|
||||
uint64_t V = InX::MipsGot->getGp(&File) + A - P;
|
||||
uint64_t V = InX::MipsGot->getGp(File) + A - P;
|
||||
if (Type == R_MIPS_LO16 || Type == R_MICROMIPS_LO16)
|
||||
V += 4;
|
||||
if (Type == R_MICROMIPS_LO16 || Type == R_MICROMIPS_HI16)
|
||||
|
|
@ -540,7 +540,7 @@ static uint64_t getRelocTargetVA(const InputFile &File, RelType Type, int64_t A,
|
|||
// of sum the symbol's value and the addend.
|
||||
return InX::MipsGot->getVA() +
|
||||
InX::MipsGot->getPageEntryOffset(File, Sym, A) -
|
||||
InX::MipsGot->getGp(&File);
|
||||
InX::MipsGot->getGp(File);
|
||||
case R_MIPS_GOT_OFF:
|
||||
case R_MIPS_GOT_OFF32:
|
||||
// In case of MIPS if a GOT relocation has non-zero addend this addend
|
||||
|
|
@ -548,14 +548,13 @@ static uint64_t getRelocTargetVA(const InputFile &File, RelType Type, int64_t A,
|
|||
// That is why we use separate expression type.
|
||||
return InX::MipsGot->getVA() +
|
||||
InX::MipsGot->getSymEntryOffset(File, Sym, A) -
|
||||
InX::MipsGot->getGp(&File);
|
||||
InX::MipsGot->getGp(File);
|
||||
case R_MIPS_TLSGD:
|
||||
return InX::MipsGot->getVA() +
|
||||
InX::MipsGot->getGlobalDynOffset(File, Sym) -
|
||||
InX::MipsGot->getGp(&File);
|
||||
return InX::MipsGot->getVA() + InX::MipsGot->getGlobalDynOffset(File, Sym) -
|
||||
InX::MipsGot->getGp(File);
|
||||
case R_MIPS_TLSLD:
|
||||
return InX::MipsGot->getVA() + InX::MipsGot->getTlsIndexOffset(File) -
|
||||
InX::MipsGot->getGp(&File);
|
||||
InX::MipsGot->getGp(File);
|
||||
case R_PAGE_PC:
|
||||
case R_PLT_PAGE_PC: {
|
||||
uint64_t Dest;
|
||||
|
|
@ -754,7 +753,7 @@ void InputSectionBase::relocateAlloc(uint8_t *Buf, uint8_t *BufEnd) {
|
|||
uint64_t AddrLoc = getOutputSection()->Addr + Offset;
|
||||
RelExpr Expr = Rel.Expr;
|
||||
uint64_t TargetVA = SignExtend64(
|
||||
getRelocTargetVA(*File, Type, Rel.Addend, AddrLoc, *Rel.Sym, Expr),
|
||||
getRelocTargetVA(File, Type, Rel.Addend, AddrLoc, *Rel.Sym, Expr),
|
||||
Bits);
|
||||
|
||||
switch (Expr) {
|
||||
|
|
|
|||
|
|
@ -708,10 +708,10 @@ MipsGotSection::FileGot &MipsGotSection::getGot(InputFile &F) {
|
|||
return Gots[*F.MipsGotIndex];
|
||||
}
|
||||
|
||||
uint64_t MipsGotSection::getPageEntryOffset(const InputFile &F,
|
||||
uint64_t MipsGotSection::getPageEntryOffset(const InputFile *F,
|
||||
const Symbol &Sym,
|
||||
int64_t Addend) const {
|
||||
const FileGot &G = Gots[*F.MipsGotIndex];
|
||||
const FileGot &G = Gots[*F->MipsGotIndex];
|
||||
uint64_t Index = 0;
|
||||
if (const OutputSection *OutSec = Sym.getOutputSection()) {
|
||||
uint64_t SecAddr = getMipsPageAddr(OutSec->Addr);
|
||||
|
|
@ -723,9 +723,9 @@ uint64_t MipsGotSection::getPageEntryOffset(const InputFile &F,
|
|||
return Index * Config->Wordsize;
|
||||
}
|
||||
|
||||
uint64_t MipsGotSection::getSymEntryOffset(const InputFile &F, const Symbol &S,
|
||||
uint64_t MipsGotSection::getSymEntryOffset(const InputFile *F, const Symbol &S,
|
||||
int64_t Addend) const {
|
||||
const FileGot &G = Gots[*F.MipsGotIndex];
|
||||
const FileGot &G = Gots[*F->MipsGotIndex];
|
||||
Symbol *Sym = const_cast<Symbol *>(&S);
|
||||
if (Sym->isTls())
|
||||
return G.Tls.find(Sym)->second * Config->Wordsize;
|
||||
|
|
@ -734,14 +734,14 @@ uint64_t MipsGotSection::getSymEntryOffset(const InputFile &F, const Symbol &S,
|
|||
return G.Local16.find({Sym, Addend})->second * Config->Wordsize;
|
||||
}
|
||||
|
||||
uint64_t MipsGotSection::getTlsIndexOffset(const InputFile &F) const {
|
||||
const FileGot &G = Gots[*F.MipsGotIndex];
|
||||
uint64_t MipsGotSection::getTlsIndexOffset(const InputFile *F) const {
|
||||
const FileGot &G = Gots[*F->MipsGotIndex];
|
||||
return G.DynTlsSymbols.find(nullptr)->second * Config->Wordsize;
|
||||
}
|
||||
|
||||
uint64_t MipsGotSection::getGlobalDynOffset(const InputFile &F,
|
||||
uint64_t MipsGotSection::getGlobalDynOffset(const InputFile *F,
|
||||
const Symbol &S) const {
|
||||
const FileGot &G = Gots[*F.MipsGotIndex];
|
||||
const FileGot &G = Gots[*F->MipsGotIndex];
|
||||
Symbol *Sym = const_cast<Symbol *>(&S);
|
||||
return G.DynTlsSymbols.find(Sym)->second * Config->Wordsize;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -187,12 +187,12 @@ public:
|
|||
void addDynTlsEntry(InputFile &File, Symbol &Sym);
|
||||
void addTlsIndex(InputFile &File);
|
||||
|
||||
uint64_t getPageEntryOffset(const InputFile &F, const Symbol &S,
|
||||
uint64_t getPageEntryOffset(const InputFile *F, const Symbol &S,
|
||||
int64_t Addend) const;
|
||||
uint64_t getSymEntryOffset(const InputFile &F, const Symbol &S,
|
||||
uint64_t getSymEntryOffset(const InputFile *F, const Symbol &S,
|
||||
int64_t Addend) const;
|
||||
uint64_t getGlobalDynOffset(const InputFile &F, const Symbol &S) const;
|
||||
uint64_t getTlsIndexOffset(const InputFile &F) const;
|
||||
uint64_t getGlobalDynOffset(const InputFile *F, const Symbol &S) const;
|
||||
uint64_t getTlsIndexOffset(const InputFile *F) const;
|
||||
|
||||
// Returns the symbol which corresponds to the first entry of the global part
|
||||
// of GOT on MIPS platform. It is required to fill up MIPS-specific dynamic
|
||||
|
|
|
|||
Loading…
Reference in New Issue