Re: libqalculate FTBFS on mips* (ball, rem)
Richard B. Kreckel wrote:
> On Mon, 5 Sep 2005, Thiemo Seufer wrote:
> [...]
> > > Anyway, that problem above is fixed by changing the inline asm for the
> > > jump instructions CLN uses to order static object initialization from
> > > __asm__ __volatile__ ("%*j %0" : : "d" ((void*)(addr)))
> > > to
> > > __asm__ __volatile__ ("b " #addr)
> > > Just out of curiousity: there was an ABI change or why did I have to
> > > modify that?
> >
> > Are you sure this is a fix?
>
> Yes, I'm sure this is a fix, provided the definition is "it works".
>
> > "%*j" is no valid mips instruction, which
> > poses the question why it ever appeared to work. "b" is, but is it a
> > branch with a code offset limit of +- 128k. I think what's really
> > wanted in that place for mips is
> >
> > __asm__ __volatile__ ("jr %0" : : "r" ((void*)(addr)))
> >
> > for a jump to an arbitrary address.
>
> That doesn't work. First: what do you mean with a code offset limit of
> +-128k? Does this mean I cannot jump further? (What is this limit?
> Wordsize * 16 Bit address?)
16bit opcode immediate << log2(required instruction alignment)
> There is one boundary condition I should've
> mentiond: that branch in practice *always* jumps within one object file
> from the beginning to the end, so that boundary condition is no problem,
> provided I didn't misunderstand you.
Unless you can guarantee that the object's .text size will never exceed
128k this is bad approach. (If it is exceeded, the error will shows up
as link-time relocation overflow).
> I've attached a small testcase package. Go to the modules.h file where
> the CL_JUMP_TO macro is defined in the __mips__ case. I define two
> static objects, one prints an 'A' at construction, one a 'B', main()
> prints a newline. The effect of the code is that the output should always
> be "AB\n", never "BA\n":
>
> $ g++ -O -c moda.cc
> $ g++ -O -c modb.cc
> $ g++ -O main.cc moda.o modb.o && ./a.out
> AB
> $ g++ -O main.cc modb.o moda.o && ./a.out
> AB
>
> Regardless of which one of the three definitions of CL_JUMP_TO I use, the
> program works with woody. With sarge, only the __asm__ __volatile__("br "
> #addr) version works, all others segfault (or cause an illegal insn).
I'll have a look, thanks.
Thiemo
Reply to: