Re: Involving devel/binutils@powerpc64 in buildworld buildkernel : got/toc optimization is not supported for addis %r1,%r1,TOC_REF(trapstk)@ha (and the like)

Mark Millard via freebsd-ppc <[email protected]>
Newsgroups gmane.os.freebsd.devel.ppc
Message-ID <[email protected]>

On 2020-Jan-6, at 22:52, Mark Millard <marklmi at yahoo.com> wrote:

> The following is based on what I noticed while
> working on updating to head -r356426 ,  including
> building multiple ways (discovering what fails
> to build and such).
> 
> I was looking at messages and noticed that there
> were messages such as:
> 
> --- kernel.full ---
> locore.o: in function `dbtrap':
> /usr/src/sys/powerpc/aim/trap_subr64.S:905:(.text+0xa68): got/toc optimization is not supported for 0x3c210000 instruction
> 
> That is the addis instruction in:
> 
> dbtrap:
>        /* Write the trap vector to SPRG3 by computing LR & 0xff00 */
>        mflr    %r1
>        andi.   %r1,%r1,0xff00
>        mtsprg3 %r1
> 
>        GET_TOCBASE(%r1)                        /* get new SP */
>        addis   %r1,%r1,TOC_REF(trapstk)@ha
>        ld      %r1,TOC_REF(trapstk)@l(%r1)
>        addi    %r1,%r1,(TRAPSTKSZ-48)
> 
> (based on line number).
> 
> This was for system-clang and devel/binutils@powerpc64
> being used to do the build.
> 
> But it also happened for devel/freebsd-gcc9@powerpc64
> and devel/binutils@powerpc64 bing used to do the
> build:
> 
> --- kernel.full ---
> locore.o: in function `dbtrap':
> /usr/src/sys/powerpc/aim/trap_subr64.S:905:(.text+0xa68): got/toc optimization is not supported for 0x3c210000 instruction
> 
> (Same instruction, same message.)
> 
> 
> There are lots of similar messages for other instruction
> encodings for zfs.ko.full --but only for the
> devel/freebsd-gcc9@powerpc64 and devel/binutils@powerpc64
> combination:
> 
> --- zfs.ko.full ---
> zfs.kld: in function `acl_trivial_create':
> /usr/src/sys/cddl/contrib/opensolaris/common/acl/acl_common.c:1646:(.text+0x568): got/toc optimization is not supported for 0x3d9e0000 instruction
> zfs.kld: in function `cacl_malloc':
> /usr/src/sys/cddl/contrib/opensolaris/common/acl/acl_common.c:243:(.text+0x5e0): got/toc optimization is not supported for 0x3d9e0000 instruction
> zfs.kld: in function `ace_trivial':
> /usr/src/sys/cddl/contrib/opensolaris/common/acl/acl_common.c:1764:(.text+0x990): got/toc optimization is not supported for 0x3d9e0000 instruction
> zfs.kld: in function `avl_nearest':
> . . .
> 
> The list for zfs.ko.full is large.
> 
> Overall there are examples of each of:
> 
> got/toc optimization is not supported for 0x3c210000 instruction
> got/toc optimization is not supported for 0x3c9e0000 instruction
> got/toc optimization is not supported for 0x3cbe0000 instruction
> got/toc optimization is not supported for 0x3cde0000 instruction
> got/toc optimization is not supported for 0x3cfe0000 instruction
> got/toc optimization is not supported for 0x3d1e0000 instruction
> got/toc optimization is not supported for 0x3d3e0000 instruction
> got/toc optimization is not supported for 0x3d5e0000 instruction
> got/toc optimization is not supported for 0x3d9e0000 instruction
> got/toc optimization is not supported for 0x3dde0000 instruction
> got/toc optimization is not supported for 0x3dfe0000 instruction
> got/toc optimization is not supported for 0x3e1e0000 instruction
> got/toc optimization is not supported for 0x3e3e0000 instruction
> got/toc optimization is not supported for 0x3e5e0000 instruction
> got/toc optimization is not supported for 0x3e7e0000 instruction
> got/toc optimization is not supported for 0x3e9e0000 instruction
> got/toc optimization is not supported for 0x3ebe0000 instruction
> got/toc optimization is not supported for 0x3ede0000 instruction
> got/toc optimization is not supported for 0x3efe0000 instruction
> got/toc optimization is not supported for 0x3f1e0000 instruction
> got/toc optimization is not supported for 0x3f3e0000 instruction
> got/toc optimization is not supported for 0x3f5e0000 instruction
> got/toc optimization is not supported for 0x3f7e0000 instruction
> got/toc optimization is not supported for 0x3f9e0000 instruction
> got/toc optimization is not supported for 0x3fbe0000 instruction
> 
> I'm not sure of the implications, but I figured that the
> information might be of use at some point.

Looking around on the web, it looks like the
relevant code in gnu's ld might be from this
2019-Aug-19 material:

+	      enum {no_check, check_lo, check_ha} insn_check;
 
 	      r_type = ELF64_R_TYPE (rel->r_info);
+	      switch (r_type)
+		{
+		default:
+		  insn_check = no_check;
+		  break;
+
+		case R_PPC64_PLT16_HA:
+		case R_PPC64_GOT_TLSLD16_HA:
+		case R_PPC64_GOT_TLSGD16_HA:
+		case R_PPC64_GOT_TPREL16_HA:
+		case R_PPC64_GOT_DTPREL16_HA:
+		case R_PPC64_GOT16_HA:
+		case R_PPC64_TOC16_HA:
+		  insn_check = check_ha;
+		  break;
+
+		case R_PPC64_PLT16_LO:
+		case R_PPC64_PLT16_LO_DS:
+		case R_PPC64_GOT_TLSLD16_LO:
+		case R_PPC64_GOT_TLSGD16_LO:
+		case R_PPC64_GOT_TPREL16_LO_DS:
+		case R_PPC64_GOT_DTPREL16_LO_DS:
+		case R_PPC64_GOT16_LO:
+		case R_PPC64_GOT16_LO_DS:
+		case R_PPC64_TOC16_LO:
+		case R_PPC64_TOC16_LO_DS:
+		  insn_check = check_lo;
+		  break;
+		}
+
+	      if (insn_check != no_check)
+		{
+		  bfd_vma off = rel->r_offset & ~3;
+
+		  if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
+		    goto got_error_ret;
+
+		  insn = bfd_get_32 (ibfd, buf);
+		  if (insn_check == check_lo
+		      ? !ok_lo_toc_insn (insn, r_type)
+		      : ((insn & ((0x3f << 26) | 0x1f << 16))
+			 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
+		    {
+		      char str[12];
+
+		      ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
+		      sprintf (str, "%#08x", insn);
+		      info->callbacks->einfo
+			/* xgettext:c-format */
+			(_("%H: got/toc optimization is not supported for"
+			   " %s instruction\n"),
+			 ibfd, sec, rel->r_offset & ~3, str);
+		      continue;
+		    }
+		}




===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)

_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-ppc
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.