Incorrect optimization on PowerPC due to volatile keyword (gcc-2.95.1 official)

VALETTE Eric valette at crf.canon.fr
Thu Oct 21 01:40:40 EST 1999



Environment information
-----------------------
53 powermac1:/tmp->uname -a
Linux powermac1 2.2.12 #1 Sat Sep 4 17:53:53 MDT 1999 ppc unknown
54 powermac1:/tmp->gcc -v
Reading specs from /usr/lib/gcc-lib/powerpc-linux/2.95.1/specs
gcc version 2.95.1 19990816 (release)

Proof of uncorrect behavior
---------------------------

gcc  -o t t.c    
t.c: In function `IMFS_get_token':
t.c:80: warning: passing arg 1 of `strcmp' discards qualifiers from pointer target type
t.c:82: warning: passing arg 1 of `strcmp' discards qualifiers from pointer target type
48 powermac1:/tmp->t
token = dev			<============= correct
49 powermac1:/tmp->gcc -O2 -o t t.c 
t.c: In function `IMFS_get_token':
t.c:80: warning: passing arg 1 of `strcmp' discards qualifiers from pointer target type
t.c:82: warning: passing arg 1 of `strcmp' discards qualifiers from pointer target type
50 powermac1:/tmp->t
token = d			<============= WRONG
51 powermac1:/tmp->gcc -O4 -o t t.c 
t.c: In function `IMFS_get_token':
t.c:80: warning: passing arg 1 of `strcmp' discards qualifiers from pointer target type
t.c:82: warning: passing arg 1 of `strcmp' discards qualifiers from pointer target type
52 powermac1:/tmp->t
token = dev			<============= correct again
52 powermac1:/tmp

   *******************************************************************
The problem is in the generation of the first while loop in the program below
   *******************************************************************

FYI : We have experienced a lot of problem when compiling drivers using the
volatile keyword to access memory mapped PCI board registers. The problems
were not present in egcs-1.1.2.

   ------------------- t.c program -------------------------------

#include <stdlib.h>

#define IMFS_is_valid_name_char( _ch ) ( 1 )

#define IMFS_is_separator( _ch ) \
   rtems_filesystem_is_separator( _ch )

#define rtems_filesystem_is_separator( _ch ) \
   ( ((_ch) == '/') || ((_ch) == '\\') || ((_ch) == '\0'))

#define IMFS_NAME_MAX  32

/*
 *  Type defination for tokens returned from IMFS_get_token
 */

typedef enum {
  IMFS_NO_MORE_PATH,
  IMFS_CURRENT_DIR,
  IMFS_UP_DIR,
  IMFS_NAME,
  IMFS_INVALID_TOKEN
} IMFS_token_types;

IMFS_token_types IMFS_get_token(
  volatile const char       *path,
  volatile char             *token,
  volatile int              *token_len
)
{
  int               i = 0;
  IMFS_token_types  type = IMFS_NAME;

  /* 
   *  Copy a name into token.  (Remember NULL is a token.)
   */

  while ( !IMFS_is_separator( path[i] ) && (i <= IMFS_NAME_MAX) ) {

     token[i] = path[i];

     if (i == IMFS_NAME_MAX)
       return IMFS_INVALID_TOKEN;

     if ( !IMFS_is_valid_name_char( token[i] ) )
       type = IMFS_INVALID_TOKEN;   

     i++;
  }

  /*
   *  Copy a seperator into token.
   */

  if ( i == 0 ) {
    token[i] = path[i];

    if ( token[i] != '\0' ) {
      i++;
      type = IMFS_CURRENT_DIR;
    } else {
      type = IMFS_NO_MORE_PATH;
    }
  } else if (token[ i-1 ] != '\0') {
    token[i] = '\0';
  }

  /*
   *  Set token_len to the number of characters copied.
   */

  *token_len = i;

  /*
   *  If we copied something that was not a seperator see if
   *  it was a special name.
   */

  if ( type == IMFS_NAME ) {
    if ( strcmp( token, "..") == 0 )
      type = IMFS_UP_DIR;
    else if ( strcmp( token, "." ) == 0 )
      type = IMFS_CURRENT_DIR;
  }

  return type;
}

main()
{
  IMFS_token_types  type;
  char token[ IMFS_NAME_MAX + 1 ];
  char path [4];
  int len;
  int i = 0;
  
  strcpy(path, "dev");
  memset(token, 0, sizeof(token));
  type = IMFS_get_token( &path[i], token, &len );
  printf("token = %s\n", token);
}


-- 
   __                 
  /  `                   	Eric Valette
 /--   __  o _.          	Canon CRF - Communication Dept
(___, / (_(_(__         	Rue de la touche lambert
				35517 Cesson-Sevigne  Cedex
				FRANCE
Tel: +33 (0)2 99 87 68 91	Fax: +33 (0)2 99 84 11 30
E-mail: valette at crf.canon.fr	http://www.crf.canon.fr

** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/





More information about the Linuxppc-dev mailing list