[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: