This is an archive of the discontinued LLVM Phabricator instance.

[ORC][MIPS] Setup t9 register and call function through this register
ClosedPublic

Authored by atanasyan on Dec 23 2018, 4:14 AM.

Details

Summary

MIPS ABI states that every function must be called through jalr $t9. In other words, a function expect that t9 register points to the beginning of its code. A function uses this register to calculate offset to the Global Offset Table and save it to the gp register.

lui   $gp, %hi(_gp_disp)
addiu $gp, %lo(_gp_disp)
addu  $gp, $gp, $t9

If t9 and as a result $gp point to the wrong place the following code loads incorrect value from GOT and passes control to invalid code.

lw    $v0,%call16(foo)($gp)
jalr  $t9

OrcMips32 and OrcMips64 writeResolverCode methods pass control to the resolved address, but do not setup $t9 before the call. The t9 holds value of the beginning of resolver code so any attempts to call routines via GOT failed.

This change fixes the problem. The OrcLazy/hidden-visibility.ll test starts to pass correctly. Before the change it fails on MIPS because the exitOnLazyCallThroughFailure called from the resolver code could not call libc routine exit via GOT.

Diff Detail

Repository
rL LLVM

Event Timeline

atanasyan created this revision.Dec 23 2018, 4:14 AM

Gentle ping...

Gentle ping...

erceg95 accepted this revision.Jan 10 2019, 9:16 AM

Sorry for delay, it looks good to me.

This revision is now accepted and ready to land.Jan 10 2019, 9:16 AM

Thanks for review.

This revision was automatically updated to reflect the committed changes.