This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Possible bug or omission in gcc 3.2.1, under DJGPP
- From: CBFalconer <cbfalconer at yahoo dot com>
- To: bug-gcc at gnu dot org
- Date: Wed, 29 Jan 2003 22:05:00 -0500
- Subject: Possible bug or omission in gcc 3.2.1, under DJGPP
- Organization: Ched Research
- Reply-to: cbfalconer at worldnet dot att dot net
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!