When a function call exceeds the immediate value range of the instruction,
a trampoline is required to assist in the jump. Trampoline is only omitted
when plt is needed; otherwise, a check is required.
Change-Id: I7fe2e08d75f6f574475837b560e650bbd4215858
Reviewed-on: https://go-review.googlesource.com/c/go/+/724580
Reviewed-by: abner chenc <chenguoqi@loongson.cn>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: sophie zhao <zhaoxiaolin@loongson.cn>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
v := int32(0)
if p.To.Target() != nil {
v = int32(p.To.Target().Pc-p.Pc) >> 2
+ if v < -1<<25 || v >= 1<<25 {
+ c.ctxt.Diag("branch too far \n%v", p)
+ }
}
o1 = OP_B_BL(c.opirr(p.As), uint32(v))
if p.To.Sym != nil {
relocs := ldr.Relocs(s)
r := relocs.At(ri)
switch r.Type() {
- case objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_B26):
- // Nothing to do.
- // The plt symbol has not been added. If we add tramp
- // here, plt will not work.
- case objabi.R_CALLLOONG64:
+ case objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_B26), objabi.R_CALLLOONG64:
+ if ldr.SymType(rs) == sym.SDYNIMPORT {
+ // Nothing to do.
+ // The plt symbol has not been added. If we add tramp
+ // here, plt will not work.
+ return
+ }
+
var t int64
// ldr.SymValue(rs) == 0 indicates a cross-package jump to a function that is not yet
// laid out. Conservatively use a trampoline. This should be rare, as we lay out packages