ftp.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2007/04/18/12:19:12

X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f
NNTP-Posting-Date: Wed, 18 Apr 2007 02:30:10 -0500
From: "Alexei A. Frounze" <alexfru AT chat DOT ru>
Newsgroups: comp.os.msdos.djgpp
References: <LbadnVsa3_H-ornbnZ2dnUVZ_sudnZ2d AT comcast DOT com> <f01r0r$59u$1 AT aioe DOT org> <G-CdnfEDh5KKDLnbnZ2dnUVZ_jydnZ2d AT comcast DOT com> <f02im5$a6s$1 AT aioe DOT org>
Subject: Re: gcc bug?
Date: Wed, 18 Apr 2007 00:26:47 -0700
MIME-Version: 1.0
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: <yLKdnaArwKOfVLjbnZ2dnUVZ_g-dnZ2d@comcast.com>
Lines: 96
NNTP-Posting-Host: 67.170.72.236
X-Trace: sv3-cM3+oktqFDuvB6zLFqlJL+Urcm9Ui4/nbAx91RHSQtDgDaXsKHFLwhbvrhn+KsCwG27JtFzfxpAmoIA!U4J2uFfJMbEgonNqUCwXHR5W8SnVyGmE1ZnwJ0drBI+5NmECi5SuCcIxxqmBVYY7Nfjk5+7kecZJ!Sc5yujSGnsHNWWmNKl3ZdAhHLGYr1A==
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

Rod Pemberton wrote:
> "Alexei A. Frounze" <alexfru AT chat DOT ru> wrote in message
> news:G-CdnfEDh5KKDLnbnZ2dnUVZ_jydnZ2d AT comcast DOT com...
>> Rod Pemberton wrote:
>>> "Alexei A. Frounze" <alexfru AT chat DOT ru> wrote in message
>>> news:LbadnVsa3_H-ornbnZ2dnUVZ_sudnZ2d AT comcast DOT com...
>
> Very sleepy now on a topic I'm not well versed on...  This, from n1124
> 6.7.3, as I read it, seems to apply. (e.g., both the data _and_
> pointer need a volatile...)
>
> "5 If an attempt is made to modify an object defined with a
> const-qualified type through use
> of an lvalue with non-const-qualified type, the behavior is
> undefined. If an attempt is
> made to refer to an object defined with a volatile-qualified type
> through use of an lvalue
> with non-volatile-qualified type, the behavior is undefined.113)"
>
>
> Anyway, let's ignore the spec. and see if I've got it the issues
> straight:
>
> Volatile on the pointer works (i.e., f2).  If the pointer is
> volatile, then the data is volatile implicitly (i.e., new pointer
> therefore new data). And, both optimized and unoptimized, we see the
> pointer being reloaded from the stack and the data being reloaded
> from the pointer.
>
> Volatile on the data doesn't work (i.e., f1) supposedly just for -O2.
> If the pointer isn't volatile, but the data is, then just the data
> should be reloaded.  Unoptimized, the compiler treats both as
> volatile (both are refreshed), i.e., incorrect.  Optimized, the
> compiler treats both as non-volatile (neither are reloaded), i.e,
> (appears) incorrect.  So, technically, both are incorrect.  But, for
> the unoptimized case, since the pointer isn't changing, it's
> functionally correct.  For the optimized case, it would appear that
> it's incorrect unless the compiler can somehow determine that the
> data isn't changing...
>
> Going to sleep...

Consider this case:

fxn()
{
#if 0
volatile int* px; // variant 1
#else
int* volatile px; // variant 2
#endif
...
px = ...;
...
switch (*px)
{
case 0:
break;

case 1:
break;

default:
break;
}
...
}

On a different from GCC compiler variant 2 yielded this sort of asm code for 
the switch:
cmp [eax], 0
je L0
cmp [eax], 1
je L1
...
It didn't treat the pointer as volatile (maybe because it was local a local 
var not passed to any functions as argument) but generated 2 accesses to the 
data. These 2 accesses are a bit unexpected. Well, they're OK for a 
non-volatile variable, but either volatile pointer doesn't necessarily imply 
volatiliness of the object it points to or something's wrong or indeed 
undefined.

On the other hand for the variant 1 it generated this sort of code for the 
switch:
mov ecx, [eax]
cmp ecx, 0
je L0
cmp ecx, 1
je L1

which is what I wanted but screwed up.

Even though the code's fixed, the incident now puzzles me.

Alex

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019