This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: locking problem with mips atomicity
Phil Edwards wrote:
>
> On Tue, Mar 16, 2004 at 04:51:26PM -0800, Michael Eager wrote:
> > Phil Edwards wrote:
> > >
> > > 1) libstdc++-v3 is temporarily frozen. (This is /why/ you need to cc: the
> > > list, so that you'll know when it's open for commits again.)
> > >
> > > 2) Remove 'libstdc++-v3/' from the front of the pathname, please, and
> > > add the log entry to libstdc++-v3/ChangeLog, not the toplevel file
> > > (when the library is unfrozen, of course).
> >
> > Updated patch attached.
> >
> > I don't have check-in privs, so who can/should do this?
>
> I can do it. Things should be thawed again in a day or so.
With a bit of help from Paul Koning and a bit of head scratching, I've
modified the patch to only have constraints which are referenced. I also
added a "memory" clobber.
Revised patch attached (hopefully, the last) and revised test case which
also invokes __atomic_add.
Thanks, Paul!
--
Michael Eager eager@mvista.com 408-328-8426
MontaVista Software, Inc. 1237 E. Arques Ave., Sunnyvale, CA 94085
2004-03-16 Michael Eager <eager@mvista.com>
* config/cpu/mips/atomicity.h: Prevent reg loads
between LL and SC instructions.
Index: config/cpu/mips/atomicity.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config/cpu/mips/atomicity.h,v
retrieving revision 1.9
diff -u -r1.9 atomicity.h
--- ./libstdc++-v3/config/cpu/mips/atomicity.h 27 Feb 2004 00:49:48 -0000 1.9
+++ ./libstdc++-v3/config/cpu/mips/atomicity.h 17 Mar 2004 22:34:09 -0000
@@ -44,14 +44,15 @@
#if _MIPS_SIM == _ABIO32
".set mips2\n\t"
#endif
- "ll %0,%3\n\t"
- "addu %1,%4,%0\n\t"
- "sc %1,%2\n\t"
+ "ll %0,0(%2)\n\t"
+ "addu %1,%3,%0\n\t"
+ "sc %1,0(%2)\n\t"
".set pop\n\t"
"beqz %1,1b\n\t"
"/* End exchange & add */"
- : "=&r"(__result), "=&r"(__tmp), "=m"(*__mem)
- : "m" (*__mem), "r"(__val));
+ : "=&r"(__result), "=&r"(__tmp), "+r"(__mem)
+ : "r"(__val)
+ : "memory" );
return __result;
}
@@ -69,13 +70,14 @@
#if _MIPS_SIM == _ABIO32
".set mips2\n\t"
#endif
- "ll %0,%2\n\t"
- "addu %0,%3,%0\n\t"
- "sc %0,%1\n\t"
+ "ll %0,0(%1)\n\t"
+ "addu %0,%2,%0\n\t"
+ "sc %0,0(%1)\n\t"
".set pop\n\t"
"beqz %0,1b\n\t"
"/* End atomic add */"
- : "=&r"(__result), "=m"(*__mem)
- : "m" (*__mem), "r"(__val));
+ : "=&r"(__result), "+r"(__mem)
+ : "r"(__val)
+ : "memory" );
}
} // namespace __gnu_cxx
#include "atomicity.h"
struct gmonparam {
long int state;
};
extern struct gmonparam _gmonparam ;
static void __attribute__ ((__used__)) __mcount ()
{
register struct gmonparam *p;
p = &_gmonparam;
if (! compare_and_swap (&p->state, 0, 1))
return;
p->state = 0;
}