This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Possible bug or omission in gcc 3.2.1, under DJGPP


I have expected strlen to compile to some form of "rep scasb"
instruction, but I have yet to find any such.  Instead it seems to
always call the system routine.  Somewhere I read that all string
ops are supposed to be generated inline.

The following is compiled with:

 gcc -W -Wall -ansi -pedantic -gstabs+ -O2 -save-temps

Files are separated by markers as below. A search for "----" will
find the joins.

---------- strlgh.c ------------
/* Compile with -Wa,-alhn=strlgh.s to show code generated */
/*  also try -minline-all-stringops */

#include <stdio.h>
#include <string.h>

char *s = "This is a string";

int main(int argc, char *argv[])
{
   int lgh;

   lgh = strlen(s);
   printf("%d %s\n", lgh, s);
   if (argc)
      while (--argc) {
         lgh = strlen(argv[argc]);
         printf("%d %s\n", lgh, argv[argc]);
      }
   return 0;
}

-------- strlgh.i ----------
# 1 "strlgh.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "c:/djgpp/lib/gcc-lib/djgpp/3.21/djgpp.ver" 1
# 1 "c:/djgpp/include/sys/version.h" 1 3
# 2 "c:/djgpp/lib/gcc-lib/djgpp/3.21/djgpp.ver" 2
# 2 "<command line>" 2
# 1 "strlgh.c"



# 1 "c:/djgpp/include/stdio.h" 1 3
# 13 "c:/djgpp/include/stdio.h" 3
# 1 "c:/djgpp/include/sys/version.h" 1 3
# 14 "c:/djgpp/include/stdio.h" 2 3
# 1 "c:/djgpp/include/sys/djtypes.h" 1 3
# 15 "c:/djgpp/include/stdio.h" 2 3
# 35 "c:/djgpp/include/stdio.h" 3
typedef __builtin_va_list va_list;


typedef long unsigned int size_t;







typedef struct {
  int _cnt;
  char *_ptr;
  char *_base;
  int _bufsiz;
  int _flag;
  int _file;
  char *_name_to_remove;
  int _fillsize;
} FILE;

typedef unsigned long fpos_t;

extern FILE __dj_stdin, __dj_stdout, __dj_stderr;




void clearerr(FILE *_stream);
int fclose(FILE *_stream);
int feof(FILE *_stream);
int ferror(FILE *_stream);
int fflush(FILE *_stream);
int fgetc(FILE *_stream);
int fgetpos(FILE *_stream, fpos_t *_pos);
char * fgets(char *_s, int _n, FILE *_stream);
FILE * fopen(const char *_filename, const char *_mode);
int fprintf(FILE *_stream, const char *_format, ...);
int fputc(int _c, FILE *_stream);
int fputs(const char *_s, FILE *_stream);
size_t fread(void *_ptr, size_t _size, size_t _nelem, FILE
*_stream);
FILE * freopen(const char *_filename, const char *_mode, FILE
*_stream);
int fscanf(FILE *_stream, const char *_format, ...);
int fseek(FILE *_stream, long _offset, int _mode);
int fsetpos(FILE *_stream, const fpos_t *_pos);
long ftell(FILE *_stream);
size_t fwrite(const void *_ptr, size_t _size, size_t _nelem, FILE
*_stream);
int getc(FILE *_stream);
int getchar(void);
char * gets(char *_s);
void perror(const char *_s);
int printf(const char *_format, ...);
int putc(int _c, FILE *_stream);
int putchar(int _c);
int puts(const char *_s);
int remove(const char *_filename);
int rename(const char *_old, const char *_new);
void rewind(FILE *_stream);
int scanf(const char *_format, ...);
void setbuf(FILE *_stream, char *_buf);
int setvbuf(FILE *_stream, char *_buf, int _mode, size_t _size);
int sprintf(char *_s, const char *_format, ...);
int sscanf(const char *_s, const char *_format, ...);
FILE * tmpfile(void);
char * tmpnam(char *_s);
int ungetc(int _c, FILE *_stream);
int vfprintf(FILE *_stream, const char *_format, va_list _ap);
int vprintf(const char *_format, va_list _ap);
int vsprintf(char *_s, const char *_format, va_list _ap);
# 5 "strlgh.c" 2
# 1 "c:/djgpp/include/string.h" 1 3
# 19 "c:/djgpp/include/string.h" 3




void * memchr(const void *_s, int _c, size_t _n);
int memcmp(const void *_s1, const void *_s2, size_t _n);
void * memcpy(void *_dest, const void *_src, size_t _n);
void * memmove(void *_s1, const void *_s2, size_t _n);
void * memset(void *_s, int _c, size_t _n);
char * strcat(char *_s1, const char *_s2);
char * strchr(const char *_s, int _c);
int strcmp(const char *_s1, const char *_s2);
int strcoll(const char *_s1, const char *_s2);
char * strcpy(char *_s1, const char *_s2);
size_t strcspn(const char *_s1, const char *_s2);
char * strerror(int _errcode);
size_t strlen(const char *_s);
char * strncat(char *_s1, const char *_s2, size_t _n);
int strncmp(const char *_s1, const char *_s2, size_t _n);
char * strncpy(char *_s1, const char *_s2, size_t _n);
char * strpbrk(const char *_s1, const char *_s2);
char * strrchr(const char *_s, int _c);
size_t strspn(const char *_s1, const char *_s2);
char * strstr(const char *_s1, const char *_s2);
char * strtok(char *_s1, const char *_s2);
size_t strxfrm(char *_s1, const char *_s2, size_t _n);
# 6 "strlgh.c" 2

char *s = "This is a string";

int main(int argc, char *argv[])
{
   int lgh;

   lgh = strlen(s);
   printf("%d %s\n", lgh, s);
   if (argc)
      while (--argc) {
         lgh = strlen(argv[argc]);
         printf("%d %s\n", lgh, argv[argc]);
      }
   return 0;
}

---------- strlgh.s ----------
	.file	"strlgh.c"
	.stabs	"c:/c/junk/",100,0,0,Ltext0
	.stabs	"strlgh.c",100,0,0,Ltext0
	.section .text
Ltext0:
	.stabs	"gcc2_compiled.",60,0,0,0
	.stabs	"int:t(0,1)=r(0,1);-2147483648;2147483647;",128,0,0,0
	.stabs	"char:t(0,2)=r(0,2);0;127;",128,0,0,0
	.stabs	"long int:t(0,3)=r(0,3);-2147483648;2147483647;",128,0,0,0
	.stabs	"unsigned
int:t(0,4)=r(0,4);0000000000000;0037777777777;",128,0,0,0
	.stabs	"long unsigned
int:t(0,5)=r(0,5);0000000000000;0037777777777;",128,0,0,0
	.stabs	"long long
int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;",128,0,0,0
	.stabs	"long long unsigned
int:t(0,7)=@s64;r(0,7);0000000000000;01777777777777777777777;",128,0,0,0
	.stabs	"short int:t(0,8)=@s16;r(0,8);-32768;32767;",128,0,0,0
	.stabs	"short unsigned int:t(0,9)=@s16;r(0,9);0;65535;",128,0,0,0
	.stabs	"signed char:t(0,10)=@s8;r(0,10);-128;127;",128,0,0,0
	.stabs	"unsigned char:t(0,11)=@s8;r(0,11);0;255;",128,0,0,0
	.stabs	"float:t(0,12)=r(0,1);4;0;",128,0,0,0
	.stabs	"double:t(0,13)=r(0,1);8;0;",128,0,0,0
	.stabs	"long double:t(0,14)=r(0,1);12;0;",128,0,0,0
	.stabs	"complex
int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;",128,0,0,0
	.stabs	"complex float:t(0,16)=r(0,16);8;0;",128,0,0,0
	.stabs	"complex double:t(0,17)=r(0,17);16;0;",128,0,0,0
	.stabs	"complex long double:t(0,18)=r(0,18);24;0;",128,0,0,0
	.stabs	"__builtin_va_list:t(0,19)=*(0,2)",128,0,0,0
	.stabs	"_Bool:t(0,20)=@s8;-16;",128,0,0,0
	.stabs	"strlgh.c",130,0,0,0
	.stabs	"c:/djgpp/lib/gcc-lib/djgpp/3.21/djgpp.ver",130,0,0,0
	.stabs	"c:/djgpp/include/sys/version.h",130,0,0,0
	.stabn	162,0,0,0
	.stabn	162,0,0,0
	.stabs	"c:/djgpp/include/stdio.h",130,0,0,0
	.stabs	"c:/djgpp/include/sys/version.h",130,0,0,0
	.stabn	162,0,0,0
	.stabs	"c:/djgpp/include/sys/djtypes.h",130,0,0,0
	.stabn	162,0,0,0
	.stabs	"va_list:t(4,1)=(0,19)",128,0,35,0
	.stabs	"size_t:t(4,2)=(0,5)",128,0,38,0
	.stabs
"FILE:t(4,3)=(4,4)=s32_cnt:(0,1),0,32;_ptr:(4,5)=*(0,2),32,32;_base:(4,5),64,32;\\",128,0,0,0
	.stabs
"_bufsiz:(0,1),96,32;_flag:(0,1),128,32;_file:(0,1),160,32;_name_to_remove:(4,5),192,32;\\",128,0,0,0
	.stabs	"_fillsize:(0,1),224,32;;",128,0,55,0
	.stabs	"fpos_t:t(4,6)=(0,5)",128,0,57,0
	.stabn	162,0,0,0
	.stabs	"c:/djgpp/include/string.h",130,0,0,0
	.stabn	162,0,0,0
.globl _s
LC0:
	.ascii "This is a string\0"
	.section .data
	.p2align 2
_s:
	.long	LC0
	.section .text
LC1:
	.ascii "%d %s\12\0"
	.p2align 4,,15
	.stabs	"main:F(0,1)",36,0,10,_main
	.stabs	"argc:p(0,1)",160,0,9,8
	.stabs	"argv:p(1,1)=*(4,5)",160,0,9,12
.globl _main
_main:
.stabn 68,0,10,LM1-_main
LM1:
	pushl	%ebp
.stabn 68,0,13,LM2-_main
LM2:
LBB2:
	movl	_s, %ecx
.stabn 68,0,10,LM3-_main
LM3:
	movl	%esp, %ebp
	pushl	%esi
	pushl	%ebx
	andl	$-16, %esp
	movl	12(%ebp), %esi
.stabn 68,0,13,LM4-_main
LM4:
	subl	$12, %esp
.stabn 68,0,10,LM5-_main
LM5:
	movl	8(%ebp), %ebx
.stabn 68,0,13,LM6-_main
LM6:
	pushl	%ecx
	call	_strlen
.stabn 68,0,14,LM7-_main
LM7:
	movl	_s, %edx
	addl	$12, %esp
	pushl	%edx
	pushl	%eax
	pushl	$LC1
	call	_printf
.stabn 68,0,15,LM8-_main
LM8:
	addl	$16, %esp
	testl	%ebx, %ebx
	je	L2
.stabn 68,0,16,LM9-_main
LM9:
	decl	%ebx
	jne	L6
L2:
.stabn 68,0,21,LM10-_main
LM10:
LBE2:
	leal	-8(%ebp), %esp
	xorl	%eax, %eax
	popl	%ebx
	popl	%esi
	popl	%ebp
	ret
	.p2align 4,,7
L6:
.stabn 68,0,17,LM11-_main
LM11:
LBB3:
	subl	$12, %esp
	movl	(%esi,%ebx,4), %ecx
	pushl	%ecx
	call	_strlen
.stabn 68,0,18,LM12-_main
LM12:
	movl	(%esi,%ebx,4), %edx
	addl	$12, %esp
	pushl	%edx
	pushl	%eax
	pushl	$LC1
	call	_printf
	addl	$16, %esp
	decl	%ebx
	jne	L6
	jmp	L2
LBE3:
	.stabs	"argc:r(0,1)",64,0,9,3
	.stabs	"argv:r(1,1)",64,0,9,6
	.stabs	"lgh:r(0,1)",64,0,11,0
	.stabn	192,0,0,LBB2-_main
	.stabn	224,0,0,LBE2-_main
	.stabs	"lgh:r(0,1)",64,0,11,0
	.stabn	192,0,0,LBB3-_main
	.stabn	224,0,0,LBE3-_main
Lscope0:
	.stabs	"",36,0,0,Lscope0-_main
	.stabs	"s:G(4,5)",32,0,7,0
	.text
	.stabs "",100,0,0,Letext
Letext:
	.ident	"GCC: (GNU) 3.2.1"

-- 
Chuck F (cbfalconer@yahoo.com) (cbfalconer@worldnet.att.net)
   Available for consulting/temporary embedded and systems.
   <http://cbfalconer.home.att.net>  USE worldnet address!


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]