This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
asm label generation bug?
- From: "Piotr Wyderski" <piotr dot wyderski at wp dot pl>
- To: <gcc at gcc dot gnu dot org>
- Date: Thu, 22 Dec 2005 14:28:08 +0100
- Subject: asm label generation bug?
HOST: AIX, 8 * IBM POWER2 CPU
COMPILER: GCC 4.0.1, GCC 3.4.4
I am trying to compile my low-level library, which contains
several inline assembly functions. It doesn't work, because
the compiler (4.0.1) does not replace local labels from the
assembly code (i.e. "0:", "1:", etc.) with their machine-specific
replacements ("LCFI..4:" and so on). It generates the labels
literally, i.e. the template
__asm__ __volatile__("0: bne 0b")
is translated into
[...]
0: bne 0b
instead of, for example,
L0: bne L0
and then the assembler fails. If I hardcode the label manually, it works.
Even this simple excerpt form Postgres SQL (to exclude my own mistakes)
doesn't compile because of the error described above:
typedef unsigned int word_t;
static __inline__ int
tas(volatile word_t *lock)
{
word_t _t;
int _res;
__asm__ __volatile__(
" lwarx %0,0,%2 \n"
" cmpwi %0,0 \n"
" bne 1f \n"
" addi %0,%0,1 \n"
" stwcx. %0,0,%2 \n"
" beq 2f \n"
"1: li %1,1 \n"
" b 3f \n"
"2: \n"
" isync \n"
" li %1,0 \n"
"3: \n"
: "=&r" (_t), "=r" (_res)
: "r" (lock)
: "cc", "memory"
);
return _res;
}
int main(int argc, char *argv[]) {
word_t x;
tas(&x);
return 0;
}
Assembler:
/tmp//cckkGueR.s: line 54: 1252-142 Syntax error.
/tmp//cckkGueR.s: line 57: 1252-142 Syntax error.
/tmp//cckkGueR.s: line 58: 1252-142 Syntax error.
/tmp//cckkGueR.s: line 59: 1252-142 Syntax error.
/tmp//cckkGueR.s: line 60: 1252-142 Syntax error.
/tmp//cckkGueR.s: line 63: 1252-142 Syntax error.
which is exactly where the labels were emitted. GCC 3.4.4 has an
additional bug/misfeature related with some missing instruction patterns:
Assembler:
/tmp//ccgioejq.s: line 538: 1252-149 Instruction lwarx is not implemented in
the current assembly mode COM.
/tmp//ccgioejq.s: line 540: 1252-142 Syntax error.
/tmp//ccgioejq.s: line 542: 1252-149 Instruction stwcx. is not implemented
in the current assembly mode COM.
/tmp//ccgioejq.s: line 543: 1252-142 Syntax error.
/tmp//ccgioejq.s: line 544: 1252-142 Syntax error.
/tmp//ccgioejq.s: line 545: 1252-142 Syntax error.
/tmp//ccgioejq.s: line 546: 1252-142 Syntax error.
/tmp//ccgioejq.s: line 549: 1252-142 Syntax error.
/tmp//ccgioejq.s: line 619: 1252-149 Instruction stwcx. is not implemented
in the current assembly mode COM.
/tmp//ccgioejq.s: line 654: 1252-149 Instruction lwarx is not implemented in
the current assembly mode COM.
Best regards
Piotr Wyderski