I have this piece of code:

__asm__(
     "someasm" :
     : 
       "i" (&&a),
       "i" (&&b));
a:                                
printf("Hello World!\n");
b:
_PREVENTCOMPILERERROR();

static inline void _PREVENTCOMPILERERROR() {
     /*nothing*/;
}

However it generates wrong assembler code:

.L3:
.L2:
#NO_APP
        leaq    .LC1(%rip), %rdi
        call    [EMAIL PROTECTED]

Where L3 is the b label and L2 is a.

The problem is in the _PREVENTCOMPILERERROR, if replaced with a 
int _PREVENTCOMPILERERRORint
__asm__(
     "asm" :
     : 
       "i" (&&a),
       "i" (&&b));
a:                                
printf("Hello World!\n");
b:
_PREVENTCOMPILERERRORint;

I get a compiler warning for being stupid, but the assembler generated is fine:

.L2:
#NO_APP
        leaq    .LC1(%rip), %rdi
        call    [EMAIL PROTECTED]
.L3:


-- 
           Summary: Labels are not handled correctly
           Product: gcc
           Version: 4.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: davh at davh dot dk
 GCC build triplet: x86_64-linux-gnu
  GCC host triplet: x86_64-linux-gnu
GCC target triplet: x86_64-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34634

Reply via email to