tag 486974 patch
thanks
dp2dpGuBLm is a static function defined in camm_dpa.h. It contains an
asm statement that defines some labels. It's inlined multiple times
into the function that calls it. Since it defines the labels each
time it's inlined, this causes the errors.
If the compiler is GCC, camm_dpa.h attempts to prevent this behavior
by defining a nested function within dp2dpGuBLm, but this doesn't
work. GCC has supported a noinline attribute since at least 3.1.1
(but not 3.0.4) to specify that a function should not be inlined. The
attached patch makes ATLAS this attribute, which fixes this problem.
--
Matt http://ftbfs.org/
diff -ru atlas-3.6.0~/include/contrib/camm_dpa.h
atlas-3.6.0/include/contrib/camm_dpa.h
--- atlas-3.6.0~/include/contrib/camm_dpa.h 2008-07-30 16:09:34.000000000
-0700
+++ atlas-3.6.0/include/contrib/camm_dpa.h 2008-07-30 16:10:32.000000000
-0700
@@ -1450,6 +1450,7 @@
#undef MY_FUNCTION
#define MY_FUNCTION Mjoin(dp,EXT)
+NO_INLINE
static void
MY_FUNCTION(aconst TYPE *a,int lda,
const TYPE *b,
@@ -1482,7 +1483,6 @@
#undef fixm
#define fixm c
#endif
- NO_INLINE
unsigned
u1=stride*sizeof(*fixm),u2=lda*sizeof(*a),u3=len*sizeof(*movm)/sizeof(float);
ASM (
diff -ru atlas-3.6.0~/include/contrib/camm_scale.h
atlas-3.6.0/include/contrib/camm_scale.h
--- atlas-3.6.0~/include/contrib/camm_scale.h 2008-07-30 16:09:34.000000000
-0700
+++ atlas-3.6.0/include/contrib/camm_scale.h 2008-07-30 16:11:18.000000000
-0700
@@ -109,6 +109,7 @@
#undef MY_FUNCTION
#define MY_FUNCTION SCALE
+NO_INLINE
static void
MY_FUNCTION(const TYPE *b,TYPE *c,int len) {
@@ -116,7 +117,6 @@
#if defined(BETAX) && defined(SCPLX)
const TYPE z1[2]={{1.0,-1.0},{1.0,-1.0}},*z=z1;
#endif
- NO_INLINE
#ifndef SREAL
len+=len;
diff -ru atlas-3.6.0~/include/contrib/camm_util.h
atlas-3.6.0/include/contrib/camm_util.h
--- atlas-3.6.0~/include/contrib/camm_util.h 2008-07-30 16:09:34.000000000
-0700
+++ atlas-3.6.0/include/contrib/camm_util.h 2008-07-30 16:10:50.000000000
-0700
@@ -82,7 +82,7 @@
#ifdef __GNUC__
#undef NO_INLINE
-#define NO_INLINE double sq(double x) {return x*x;}
+#define NO_INLINE __attribute__((noinline))
#else
#undef NO_INLINE
#define NO_INLINE
diff -ru atlas-3.6.0~/tune/blas/gemv/CASES/ATL_gemv_SSE.c
atlas-3.6.0/tune/blas/gemv/CASES/ATL_gemv_SSE.c
--- atlas-3.6.0~/tune/blas/gemv/CASES/ATL_gemv_SSE.c 2008-07-30
16:09:28.000000000 -0700
+++ atlas-3.6.0/tune/blas/gemv/CASES/ATL_gemv_SSE.c 2008-07-30
16:10:03.000000000 -0700
@@ -575,12 +575,12 @@
#define MY_FUNCTION FN
+NO_INLINE
void
MY_FUNCTION(int m,int n, const SCALAR alpha,const TYPE *a,
int lda,const TYPE *b,int binc,
const SCALAR beta,TYPE *c,int cinc) {
- NO_INLINE
int ks;
#ifdef GCCWIN
void *freeme[4]={NULL,NULL,NULL,NULL};