Consider the following code:

typedef unsigned int  UINT32;
typedef unsigned char BOOL;
#define __SWI_BIOS_ContainerUsage  1234

#define __swicall1(type,name,type1,arg1)                                \
  static inline type name(type1 arg1) {                                 \
    register long __r0 __asm__ ("r0") = (long)arg1;                     \
    register long __res __asm__ ("r0");                                 \
    __asm__ __volatile__ ("swi\t%2\n\t"                                 \
                          : "=r" (__res)                                \
                          : "0" (__r0), "i" (__SWI_##name)              \
                          : "r1", "r2", "r3", "ip", "lr", "cc",         \
                            "memory");                                  \
    return((type)__res);                                                \
  }
__swicall1(UINT32,BIOS_ContainerUsage,BOOL,verbose);
int sprintf(char *p, const char *frmt, ...);

void testme(char *tmp)
{
  sprintf(tmp, " %d%% Containers\n", BIOS_ContainerUsage(1));
  sprintf(tmp, " %d%% Containers\n", 2 * BIOS_ContainerUsage(1));
}


-- 
           Summary: Compiler generates incorrect code when calling functions
           Product: gcc
           Version: 4.1.0
            Status: UNCONFIRMED
          Severity: blocker
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: Eric dot Doenges at betty-tv dot com
  GCC host triplet: powerpc-apple-darwin8.5.0
GCC target triplet: arm-elf-unknown


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

Reply via email to