On Mon, 28 Sep 2015, Matthew Fortune wrote: > > > + /* lapc <symbol> is an alias to addiupc reg, <symbol> - . > > > + * > > > + * We can't use addiupc because there is no label-label > > > + * support for the addiupc reloc > > > + */ > > > + __asm__("lapc %0, _start \n" > > > + : "=r" (addr) : :); > > > > Just curious - if lapc is just an alias to addiupc, why does that work > > but not addiupc? IIRC I did try addiupc previously but removed it > > because it wasn't working, didn't know about lapc! > > This is just an unfortunate quirk of how the implementation is done in > binutils. We don't recognise the special case that: > > addiupc <reg>, <sym> - . > > is the same as > > lapc <reg>, <sym> > > And therefore don't know that we can just use the MIPS_PC19_S2 reloc > (name of that reloc may not be perfectly correct). It is a special > case as the RHS of the expression in ADDIUPC above can be theoretically > anything so we only support assembly time constants with addiupc. > > Apart from the need to document the LAPC alias somewhere I'm not sure > we need do anything to improve addiupc itself particularly. For the record -- this corresponds to how the LA macro and the PC-relative ADDIU instruction are handled when assembling MIPS16 code. And the place to document such peculiarities is obviously an assembly language manual. A few have been written for the MIPS architecture already and with recent updates to the instruction set perhaps it is time for a revised edition or yet another book. Maciej