[lld] r265059 - [ELF] Implement infrastructure for thunk code creation

Simon Atanasyan via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 4 09:54:07 PDT 2016


On Sun, Apr 3, 2016 at 4:35 AM, Rafael EspĂ­ndola
<rafael.espindola at gmail.com> wrote:
>>  template <class ELFT>
>> +bool MipsTargetInfo<ELFT>::needsThunk(uint32_t Type, const InputFile &File,
>> +                                      const SymbolBody &S) const {
>> +  // Any MIPS PIC code function is invoked with its address in register $t9.
>> +  // So if we have a branch instruction from non-PIC code to the PIC one
>> +  // we cannot make the jump directly and need to create a small stubs
>> +  // to save the target function address.
>> +  // See page 3-38 ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
>> +  if (Type != R_MIPS_26)
>> +    return false;
>> +  auto *F = dyn_cast<ELFFileBase<ELFT>>(&File);
>> +  if (!F)
>> +    return false;
>> +  // If current file has PIC code, LA25 stub is not required.
>> +  if (F->getObj().getHeader()->e_flags & EF_MIPS_PIC)
>> +    return false;
>> +  auto *D = dyn_cast<DefinedRegular<ELFT>>(&S);
>> +  if (!D || !D->Section)
>> +    return false;
>> +  // LA25 is required if target file has PIC code
>> +  // or target symbol is a PIC symbol.
>> +  return (D->Section->getFile()->getObj().getHeader()->e_flags & EF_MIPS_PIC) ||
>> +         (D->Sym.st_other & STO_MIPS_MIPS16) == STO_MIPS_PIC;
>
> I just noticed that this last part is not tested. All tests pass if I
> replace st_other with 0.

Fixed at r265310.
Thanks!

-- 
Simon Atanasyan


More information about the llvm-commits mailing list