X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f NNTP-Posting-Date: Mon, 16 Apr 2007 22:30:43 -0500 From: "Alexei A. Frounze" Newsgroups: comp.os.msdos.djgpp Subject: gcc bug? Date: Mon, 16 Apr 2007 20:27:07 -0700 MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="koi8-r"; reply-type=original Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.3028 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3028 Message-ID: Lines: 125 NNTP-Posting-Host: 67.170.72.236 X-Trace: sv3-QkB/SFwSDwLetF76dpO0GslJotE1jWJK+N80LKidDQ71C7MZsHMSYf19uGJaF2xBZm1YxKKlhDNFfHJ!QA8R4Fgmt2BP1ZFsTeUYSdlKqRsnYPtd8shdRmOqbn2V16QQhOpOOIE4bWdt1ZKH6temvOT8pQo5!HD/wNDrxlHCsI9eP5E5i8iM7nf0rlA== X-Complaints-To: abuse AT comcast DOT net X-DMCA-Complaints-To: dmca AT comcast DOT net X-Abuse-and-DMCA-Info: Please be sure to forward a copy of ALL headers X-Abuse-and-DMCA-Info: Otherwise we will be unable to process your complaint properly X-Postfilter: 1.3.34 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com I was checking my understanding of volatile's effect and encountered an odd thing. Consider the following code: ----8<---- typedef struct {char x;} T, *PT; void f1 () { volatile T* pt = 0; while (pt->x != 0); } void f2 () { volatile PT pt = 0; while (pt->x != 0); } int main() { return 0; } ----8<---- Now, let's compile it to asm using: gcc -Wall -c -S -O ptr.c -o ptr.s: ----8<---- .file "ptr.c" .section .text .globl _f1 _f1: pushl %ebp movl %esp, %ebp movl $0, %edx L2: movb (%edx), %al testb %al, %al jne L2 popl %ebp ret .globl _f2 _f2: pushl %ebp movl %esp, %ebp subl $4, %esp movl $0, -4(%ebp) L6: movl -4(%ebp), %eax cmpb $0, (%eax) jne L6 movl %ebp, %esp popl %ebp ret .globl _main _main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $0, %eax movl %ebp, %esp popl %ebp ret .ident "GCC: (GNU) 3.3.4" ----8<---- Let's now compile it to asm using higher optimization level: gcc -Wall -c -S -O ptr.c -o ptr.s: ----8<---- .file "ptr.c" .section .text .p2align 4,,15 .globl _f1 _f1: pushl %ebp movl %esp, %ebp .p2align 4,,7 L2: movb 0, %al testb %al, %al jne L2 popl %ebp ret .p2align 4,,15 .globl _f2 _f2: pushl %ebp movl %esp, %ebp pushl %eax movl $0, -4(%ebp) .p2align 4,,7 L6: movl -4(%ebp), %eax cmpb $0, (%eax) jne L6 movl %ebp, %esp popl %ebp ret .p2align 4,,15 .globl _main _main: pushl %ebp movl %esp, %ebp xorl %eax, %eax pushl %edx pushl %edx andl $-16, %esp movl %ebp, %esp popl %ebp ret .ident "GCC: (GNU) 3.3.4" ----8<---- Note the difference in f1: - if the optimization is -O, then there's a pointer in the routine and it gets dereferenced - if the optimization is -O2 (or -O3), then there's no pointer in the routine at all, instead there's a non-pointer variable that is initialized with the value that should've initialized the missing pointer Am I missing something, or is this really a bug? Alex