Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH] gdb/i387-tdep.c: Avoid warning for "-Werror=strict-overflow"
@ 2014-10-03 15:24 Chen Gang
  2014-10-03 15:46 ` Mark Kettenis
  0 siblings, 1 reply; 11+ messages in thread
From: Chen Gang @ 2014-10-03 15:24 UTC (permalink / raw)
  To: amodra, gbenson, michael.sturm, brobecker, walfred.tedeschi
  Cc: binutils, gdb-patches

gdb requires "-Werror", and I387_ST0_REGNUM (tdep) is 'variable', then
compiler can think that I387_ST0_REGNUM (tdep) may be a large number,
which may cause issue, so report warning.

The related warning under Darwin with gnu built gcc:

gcc -g -O2   -I. -I../../binutils-gdb/gdb -I../../binutils-gdb/gdb/common -I../../binutils-gdb/gdb/config -DLOCALEDIR="\"/usr/local/share/locale\"" -DHAVE_CONFIG_H -I../../binutils-gdb/gdb/../include/opcode -I../../binutils-gdb/gdb/../opcodes/..  -I../../binutils-gdb/gdb/../readline/.. -I../bfd -I../../binutils-gdb/gdb/../bfd -I../../binutils-gdb/gdb/../include -I../libdecnumber -I../../binutils-gdb/gdb/../libdecnumber -I../../binutils-gdb/gdb/gnulib/import -Ibuild-gnulib/import   -DTUI=1 -D_THREAD_SAFE -I/usr/local/Cellar/guile/2.0.11/include/guile/2.0 -I/usr/local/Cellar/gmp/6.0.0a/include -I/usr/local/Cellar/readline/6.3.5/include -I/usr/local/Cellar/bdw-gc/7.2e/include -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -Wall -Wdeclaration-after-statement -Wpointer-arith -Wpointer-sign -Wno-unused -Wunused-value -Wunused-function -Wno-switch -Wno-char-subscripts -Wmissing-prototyp
es -Wdeclaration-after-statement -Wempty-body -Wmissing-parameter-type -Wold-style-declaration -Wold-style-definition -Wformat-nonliteral -Werror -c -o i387-tdep.o -MT i387-tdep.o -MMD -MP -MF .deps/i387-tdep.Tpo ../../binutils-gdb/gdb/i387-tdep.c
../../binutils-gdb/gdb/i387-tdep.c: In function 'i387_supply_fsave':
../../binutils-gdb/gdb/i387-tdep.c:447:1: error: assuming signed overflow does not occur when assuming that (X + c) >= X is always true [-Werror=strict-overflow]
 i387_supply_fsave (struct regcache *regcache, int regnum, const void *fsave)
 ^
../../binutils-gdb/gdb/i387-tdep.c: In function 'i387_collect_fsave':
../../binutils-gdb/gdb/i387-tdep.c:502:1: error: assuming signed overflow does not occur when assuming that (X + c) >= X is always true [-Werror=strict-overflow]
 i387_collect_fsave (const struct regcache *regcache, int regnum, void *fsave)
 ^
cc1: all warnings being treated as errors

2014-10-03  Chen Gang  <gang.chen.5i5j@gmail.com>

	*i387-tdep.c (i387_supply_fsave): Avoid warning for
	"-Werror=strict-overflow"
---
 gdb/i387-tdep.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
index d66ac6a..c89e647 100644
--- a/gdb/i387-tdep.c
+++ b/gdb/i387-tdep.c
@@ -454,7 +454,7 @@ i387_supply_fsave (struct regcache *regcache, int regnum, const void *fsave)
 
   gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
 
-  for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
+  for (i = I387_ST0_REGNUM (tdep); I387_XMM0_REGNUM (tdep) - i > 0; i++)
     if (regnum == -1 || regnum == i)
       {
 	if (fsave == NULL)
@@ -507,7 +507,7 @@ i387_collect_fsave (const struct regcache *regcache, int regnum, void *fsave)
 
   gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
 
-  for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
+  for (i = I387_ST0_REGNUM (tdep); I387_XMM0_REGNUM (tdep) - i > 0; i++)
     if (regnum == -1 || regnum == i)
       {
 	/* Most of the FPU control registers occupy only 16 bits in
-- 
1.8.5.2 (Apple Git-48)


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gdb/i387-tdep.c: Avoid warning for "-Werror=strict-overflow"
  2014-10-03 15:24 [PATCH] gdb/i387-tdep.c: Avoid warning for "-Werror=strict-overflow" Chen Gang
@ 2014-10-03 15:46 ` Mark Kettenis
  2014-10-03 16:02   ` Chen Gang
  0 siblings, 1 reply; 11+ messages in thread
From: Mark Kettenis @ 2014-10-03 15:46 UTC (permalink / raw)
  To: gang.chen.5i5j
  Cc: amodra, gbenson, michael.sturm, brobecker, walfred.tedeschi,
	binutils, gdb-patches

> 
> gdb requires "-Werror", and I387_ST0_REGNUM (tdep) is 'variable', then
> compiler can think that I387_ST0_REGNUM (tdep) may be a large number,
> which may cause issue, so report warning.

Sorry, but obfuscating code to make compilers happy is *not* the way to go.

> 2014-10-03  Chen Gang  <gang.chen.5i5j@gmail.com>
> 
> 	*i387-tdep.c (i387_supply_fsave): Avoid warning for
> 	"-Werror=strict-overflow"
> ---
>  gdb/i387-tdep.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
> index d66ac6a..c89e647 100644
> --- a/gdb/i387-tdep.c
> +++ b/gdb/i387-tdep.c
> @@ -454,7 +454,7 @@ i387_supply_fsave (struct regcache *regcache, int regnum, const void *fsave)
>  
>    gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
>  
> -  for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
> +  for (i = I387_ST0_REGNUM (tdep); I387_XMM0_REGNUM (tdep) - i > 0; i++)
>      if (regnum == -1 || regnum == i)
>        {
>  	if (fsave == NULL)
> @@ -507,7 +507,7 @@ i387_collect_fsave (const struct regcache *regcache, int regnum, void *fsave)
>  
>    gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
>  
> -  for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
> +  for (i = I387_ST0_REGNUM (tdep); I387_XMM0_REGNUM (tdep) - i > 0; i++)
>      if (regnum == -1 || regnum == i)
>        {
>  	/* Most of the FPU control registers occupy only 16 bits in
> -- 
> 1.8.5.2 (Apple Git-48)
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gdb/i387-tdep.c: Avoid warning for "-Werror=strict-overflow"
  2014-10-03 15:46 ` Mark Kettenis
@ 2014-10-03 16:02   ` Chen Gang
  2014-10-03 16:44     ` Joel Brobecker
  0 siblings, 1 reply; 11+ messages in thread
From: Chen Gang @ 2014-10-03 16:02 UTC (permalink / raw)
  To: Mark Kettenis
  Cc: amodra, gbenson, michael.sturm, brobecker, walfred.tedeschi,
	binutils, gdb-patches

On 10/3/14 23:46, Mark Kettenis wrote:
>>
>> gdb requires "-Werror", and I387_ST0_REGNUM (tdep) is 'variable', then
>> compiler can think that I387_ST0_REGNUM (tdep) may be a large number,
>> which may cause issue, so report warning.
> 
> Sorry, but obfuscating code to make compilers happy is *not* the way to go.
> 

OK, I can understand, but for me, these is no other better ways for it,
except let gdb give up "-Werror" (if always need "--disable-werror"
during "configure").

Thanks.

>> 2014-10-03  Chen Gang  <gang.chen.5i5j@gmail.com>
>>
>> 	*i387-tdep.c (i387_supply_fsave): Avoid warning for
>> 	"-Werror=strict-overflow"
>> ---
>>  gdb/i387-tdep.c | 4 ++--
>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
>> index d66ac6a..c89e647 100644
>> --- a/gdb/i387-tdep.c
>> +++ b/gdb/i387-tdep.c
>> @@ -454,7 +454,7 @@ i387_supply_fsave (struct regcache *regcache, int regnum, const void *fsave)
>>  
>>    gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
>>  
>> -  for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
>> +  for (i = I387_ST0_REGNUM (tdep); I387_XMM0_REGNUM (tdep) - i > 0; i++)
>>      if (regnum == -1 || regnum == i)
>>        {
>>  	if (fsave == NULL)
>> @@ -507,7 +507,7 @@ i387_collect_fsave (const struct regcache *regcache, int regnum, void *fsave)
>>  
>>    gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
>>  
>> -  for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
>> +  for (i = I387_ST0_REGNUM (tdep); I387_XMM0_REGNUM (tdep) - i > 0; i++)
>>      if (regnum == -1 || regnum == i)
>>        {
>>  	/* Most of the FPU control registers occupy only 16 bits in
>> -- 
>> 1.8.5.2 (Apple Git-48)
>>

-- 
Chen Gang

Open, share, and attitude like air, water, and life which God blessed


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gdb/i387-tdep.c: Avoid warning for "-Werror=strict-overflow"
  2014-10-03 16:02   ` Chen Gang
@ 2014-10-03 16:44     ` Joel Brobecker
  2014-10-03 18:47       ` Pedro Alves
  0 siblings, 1 reply; 11+ messages in thread
From: Joel Brobecker @ 2014-10-03 16:44 UTC (permalink / raw)
  To: Chen Gang
  Cc: Mark Kettenis, amodra, gbenson, michael.sturm, walfred.tedeschi,
	binutils, gdb-patches

> > Sorry, but obfuscating code to make compilers happy is *not* the way to go.
> > 
> 
> OK, I can understand, but for me, these is no other better ways for it,
> except let gdb give up "-Werror" (if always need "--disable-werror"
> during "configure").

I have to agree with Mark on this one, the proposed solution looks
awful. There has to be another way. Maybe declaring a local constant
whose value is I387_XMM0_REGNUM (tdep)?

-- 
Joel


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gdb/i387-tdep.c: Avoid warning for "-Werror=strict-overflow"
  2014-10-03 16:44     ` Joel Brobecker
@ 2014-10-03 18:47       ` Pedro Alves
  2014-10-04  5:12         ` Chen Gang
  2014-10-09 10:06         ` Walfred Tedeschi
  0 siblings, 2 replies; 11+ messages in thread
From: Pedro Alves @ 2014-10-03 18:47 UTC (permalink / raw)
  To: Joel Brobecker, Chen Gang
  Cc: Mark Kettenis, amodra, gbenson, michael.sturm, walfred.tedeschi,
	binutils, gdb-patches

On 10/03/2014 05:44 PM, Joel Brobecker wrote:
>>> Sorry, but obfuscating code to make compilers happy is *not* the way to go.
>>>
>>
>> OK, I can understand, but for me, these is no other better ways for it,
>> except let gdb give up "-Werror" (if always need "--disable-werror"
>> during "configure").
> 
> I have to agree with Mark on this one, the proposed solution looks
> awful. There has to be another way. Maybe declaring a local constant
> whose value is I387_XMM0_REGNUM (tdep)?

Likely, after transformations and intra-procedural analyses, gcc would
end up with the same.

This:

 for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)

always iterates exactly 16 times, because I387_XMM0_REGNUM
is defined like:

 #define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 16)

An alternative I think might work would be to give that magic
16 constant a name, say:

 #define I387_NUM_ST_REGS 16

and then do:

 for (i = 0; i < i < I387_NUM_ST_REGS; i++)
   {
      int r = I387_ST0_REGNUM (tdep) + i;

      ... use 'r' instead of 'i' ...
   }

Thanks,
Pedro Alves


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gdb/i387-tdep.c: Avoid warning for "-Werror=strict-overflow"
  2014-10-03 18:47       ` Pedro Alves
@ 2014-10-04  5:12         ` Chen Gang
  2014-10-06  8:41           ` Pedro Alves
  2014-10-09 10:06         ` Walfred Tedeschi
  1 sibling, 1 reply; 11+ messages in thread
From: Chen Gang @ 2014-10-04  5:12 UTC (permalink / raw)
  To: Pedro Alves, Joel Brobecker
  Cc: Mark Kettenis, amodra, gbenson, michael.sturm, walfred.tedeschi,
	binutils, gdb-patches

On 10/4/14 1:49, Pedro Alves wrote:
> On 10/03/2014 05:44 PM, Joel Brobecker wrote:
>>>> Sorry, but obfuscating code to make compilers happy is *not* the way to go.
>>>>
>>>
>>> OK, I can understand, but for me, these is no other better ways for it,
>>> except let gdb give up "-Werror" (if always need "--disable-werror"
>>> during "configure").
>>
>> I have to agree with Mark on this one, the proposed solution looks
>> awful. There has to be another way. Maybe declaring a local constant
>> whose value is I387_XMM0_REGNUM (tdep)?
> 
> Likely, after transformations and intra-procedural analyses, gcc would
> end up with the same.
> 
> This:
> 
>  for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
> 
> always iterates exactly 16 times, because I387_XMM0_REGNUM
> is defined like:
> 
>  #define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 16)
> 
> An alternative I think might work would be to give that magic
> 16 constant a name, say:
> 
>  #define I387_NUM_ST_REGS 16
> 
> and then do:
> 
>  for (i = 0; i < i < I387_NUM_ST_REGS; i++)
>    {
>       int r = I387_ST0_REGNUM (tdep) + i;
> 
>       ... use 'r' instead of 'i' ...
>    }
> 

OK, thanks. It is really one way, it is a little better than my original
way. But for me, it is still not a good idea: it introduces a new macro
and a new variable for each area (originally, it is only one statement).

For me, "-Werror" need always be optional, but not mandatory.

Compiler is our helper, but we are in charge of the final code. So we
should notice about all compiler's 'advice'. Commonly, 'advice' is
always valuable, but may not always be suitable for oneself.


Thanks.
-- 
Chen Gang

Open, share, and attitude like air, water, and life which God blessed


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gdb/i387-tdep.c: Avoid warning for "-Werror=strict-overflow"
  2014-10-04  5:12         ` Chen Gang
@ 2014-10-06  8:41           ` Pedro Alves
  2014-10-06 13:29             ` Chen Gang
  0 siblings, 1 reply; 11+ messages in thread
From: Pedro Alves @ 2014-10-06  8:41 UTC (permalink / raw)
  To: Chen Gang, Joel Brobecker
  Cc: Mark Kettenis, amodra, gbenson, michael.sturm, walfred.tedeschi,
	binutils, gdb-patches

On 10/04/2014 06:18 AM, Chen Gang wrote:
> On 10/4/14 1:49, Pedro Alves wrote:
>> On 10/03/2014 05:44 PM, Joel Brobecker wrote:
>>>>> Sorry, but obfuscating code to make compilers happy is *not* the way to go.
>>>>>
>>>>
>>>> OK, I can understand, but for me, these is no other better ways for it,
>>>> except let gdb give up "-Werror" (if always need "--disable-werror"
>>>> during "configure").
>>>
>>> I have to agree with Mark on this one, the proposed solution looks
>>> awful. There has to be another way. Maybe declaring a local constant
>>> whose value is I387_XMM0_REGNUM (tdep)?
>>
>> Likely, after transformations and intra-procedural analyses, gcc would
>> end up with the same.
>>
>> This:
>>
>>  for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
>>
>> always iterates exactly 16 times, because I387_XMM0_REGNUM
>> is defined like:
>>
>>  #define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 16)
>>
>> An alternative I think might work would be to give that magic
>> 16 constant a name, say:
>>
>>  #define I387_NUM_ST_REGS 16
>>
>> and then do:
>>
>>  for (i = 0; i < i < I387_NUM_ST_REGS; i++)
>>    {
>>       int r = I387_ST0_REGNUM (tdep) + i;
>>
>>       ... use 'r' instead of 'i' ...
>>    }
>>
> 
> OK, thanks. It is really one way, it is a little better than my original
> way. But for me, it is still not a good idea: it introduces a new macro
> and a new variable for each area (originally, it is only one statement).

I see no problem with adding the new macro.  We already have a ton
of similar macros, see i386-tdep.h and i387-tdep.h.  Looks
like the existing I387_NUM_REGS is what we'd need here?

BTC, OOC, did you try Joel's idea with the local variable?
In case Mark prefers that, it'd be good to know whether it works.
I can't seem to get my gcc to emit that warning.

Combining both ideas, for clarity, we end up with something
like:

 int end;

 end = I387_ST0_REGNUM (tdep) + I387_NUM_REGS;
 for (i = I387_ST0_REGNUM (tdep); i < end; i++)

 ...

 end = I387_XMM0_REGNUM (tdep) + I387_NUM_XMM_REGS (tdep);
 for (i = I387_XMM0_REGNUM (tdep); i < end; i++)


That's way clearer to me than the existing:

 for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
...
 for (i = I387_XMM0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++)

anyway, which assumes the reader knows register numbers are
ordered like st -> xmm -> mxcrsr.

If this works, I think it's my preference.

> For me, "-Werror" need always be optional, but not mandatory.

It's mandatory only on development builds.  -Werror is not on by
default on released GDBs.

Thanks,
Pedro Alves


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gdb/i387-tdep.c: Avoid warning for "-Werror=strict-overflow"
  2014-10-06  8:41           ` Pedro Alves
@ 2014-10-06 13:29             ` Chen Gang
  2014-10-10 11:22               ` Chen Gang
  0 siblings, 1 reply; 11+ messages in thread
From: Chen Gang @ 2014-10-06 13:29 UTC (permalink / raw)
  To: Pedro Alves, Joel Brobecker
  Cc: Mark Kettenis, amodra, gbenson, michael.sturm, walfred.tedeschi,
	binutils, gdb-patches

On 10/6/14 16:41, Pedro Alves wrote:
> On 10/04/2014 06:18 AM, Chen Gang wrote:
>>
>> OK, thanks. It is really one way, it is a little better than my original
>> way. But for me, it is still not a good idea: it introduces a new macro
>> and a new variable for each area (originally, it is only one statement).
> 
> I see no problem with adding the new macro.  We already have a ton
> of similar macros, see i386-tdep.h and i387-tdep.h.  Looks
> like the existing I387_NUM_REGS is what we'd need here?
> 
> BTC, OOC, did you try Joel's idea with the local variable?
> In case Mark prefers that, it'd be good to know whether it works.
> I can't seem to get my gcc to emit that warning.
> 
> Combining both ideas, for clarity, we end up with something
> like:
> 
>  int end;
> 
>  end = I387_ST0_REGNUM (tdep) + I387_NUM_REGS;
>  for (i = I387_ST0_REGNUM (tdep); i < end; i++)
> 
>  ...
> 
>  end = I387_XMM0_REGNUM (tdep) + I387_NUM_XMM_REGS (tdep);
>  for (i = I387_XMM0_REGNUM (tdep); i < end; i++)
> 
> 
> That's way clearer to me than the existing:
> 

That's way not quite bad to me than the existing:

 - It is easier understanding, although a little complex than origin.

 - For compiler, 'end' is simple enough to be sure to be optimized.

 - And I guess, compiler will understand, and will not worry about it.


>  for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
> ...
>  for (i = I387_XMM0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++)
> 
> anyway, which assumes the reader knows register numbers are
> ordered like st -> xmm -> mxcrsr.
> 
> If this works, I think it's my preference.
> 

OK, thanks, at least, what you said is acceptable to me. If no any
additional reply within this week (within 2014-10-12), I shall send
patch v2 for it.

>> For me, "-Werror" need always be optional, but not mandatory.
> 
> It's mandatory only on development builds.  -Werror is not on by
> default on released GDBs.
> 

OK, thanks.


Thanks.
-- 
Chen Gang

Open, share, and attitude like air, water, and life which God blessed


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gdb/i387-tdep.c: Avoid warning for "-Werror=strict-overflow"
  2014-10-03 18:47       ` Pedro Alves
  2014-10-04  5:12         ` Chen Gang
@ 2014-10-09 10:06         ` Walfred Tedeschi
  2014-10-09 11:20           ` Pedro Alves
  1 sibling, 1 reply; 11+ messages in thread
From: Walfred Tedeschi @ 2014-10-09 10:06 UTC (permalink / raw)
  To: michael.sturm
  Cc: Mark Kettenis, amodra, gbenson, michael.sturm, binutils, gdb-patches

Am 10/3/2014 7:49 PM, schrieb Pedro Alves:
> On 10/03/2014 05:44 PM, Joel Brobecker wrote:
>>>> Sorry, but obfuscating code to make compilers happy is *not* the way to go.
>>>>
>>> OK, I can understand, but for me, these is no other better ways for it,
>>> except let gdb give up "-Werror" (if always need "--disable-werror"
>>> during "configure").
>> I have to agree with Mark on this one, the proposed solution looks
>> awful. There has to be another way. Maybe declaring a local constant
>> whose value is I387_XMM0_REGNUM (tdep)?
> Likely, after transformations and intra-procedural analyses, gcc would
> end up with the same.
>
> This:
>
>   for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
>
> always iterates exactly 16 times, because I387_XMM0_REGNUM
> is defined like:
>
>   #define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 16)
>
> An alternative I think might work would be to give that magic
> 16 constant a name, say:
>
>   #define I387_NUM_ST_REGS 16
>
> and then do:
>
>   for (i = 0; i < i < I387_NUM_ST_REGS; i++)
>     {
>        int r = I387_ST0_REGNUM (tdep) + i;
>
>        ... use 'r' instead of 'i' ...
>     }
>
> Thanks,
> Pedro Alves
>
Later on we have introduced the _END macros, as can be seen on i387-tdep.h.
Creating one or two of them migh be a good idea to homogeinize the way 
we handle the registers.

This will finally also join together all ideas presented before in only one.

Using the end will then make

for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)

to be

for (i = I387_ST0_REGNUM (tdep); i < I387_STEND_REGNUM (tdep); i++)


We also define the number of regs for every technology in that file.

Thanks and regards,
-Fred and Michael
Intel GmbH
Dornacher Strasse 1
85622 Feldkirchen/Muenchen, Deutschland
Sitz der Gesellschaft: Feldkirchen bei Muenchen
Geschaeftsfuehrer: Christian Lamprechter, Hannes Schwaderer, Douglas Lusk
Registergericht: Muenchen HRB 47456
Ust.-IdNr./VAT Registration No.: DE129385895
Citibank Frankfurt a.M. (BLZ 502 109 00) 600119052


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gdb/i387-tdep.c: Avoid warning for "-Werror=strict-overflow"
  2014-10-09 10:06         ` Walfred Tedeschi
@ 2014-10-09 11:20           ` Pedro Alves
  0 siblings, 0 replies; 11+ messages in thread
From: Pedro Alves @ 2014-10-09 11:20 UTC (permalink / raw)
  To: Walfred Tedeschi, michael.sturm
  Cc: Mark Kettenis, amodra, gbenson, binutils, gdb-patches

On 10/09/2014 11:05 AM, Walfred Tedeschi wrote:
> Am 10/3/2014 7:49 PM, schrieb Pedro Alves:
>> On 10/03/2014 05:44 PM, Joel Brobecker wrote:
>>>>> Sorry, but obfuscating code to make compilers happy is *not* the way to go.
>>>>>
>>>> OK, I can understand, but for me, these is no other better ways for it,
>>>> except let gdb give up "-Werror" (if always need "--disable-werror"
>>>> during "configure").
>>> I have to agree with Mark on this one, the proposed solution looks
>>> awful. There has to be another way. Maybe declaring a local constant
>>> whose value is I387_XMM0_REGNUM (tdep)?
>> Likely, after transformations and intra-procedural analyses, gcc would
>> end up with the same.
>>
>> This:
>>
>>   for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
>>
>> always iterates exactly 16 times, because I387_XMM0_REGNUM
>> is defined like:
>>
>>   #define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 16)
>>
>> An alternative I think might work would be to give that magic
>> 16 constant a name, say:
>>
>>   #define I387_NUM_ST_REGS 16
>>
>> and then do:
>>
>>   for (i = 0; i < i < I387_NUM_ST_REGS; i++)
>>     {
>>        int r = I387_ST0_REGNUM (tdep) + i;
>>
>>        ... use 'r' instead of 'i' ...
>>     }
>>
>> Thanks,
>> Pedro Alves
>>
> Later on we have introduced the _END macros, as can be seen on i387-tdep.h.
> Creating one or two of them migh be a good idea to homogeinize the way 
> we handle the registers.
> 
> This will finally also join together all ideas presented before in only one.
> 
> Using the end will then make
> 
> for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
> 
> to be
> 
> for (i = I387_ST0_REGNUM (tdep); i < I387_STEND_REGNUM (tdep); i++)
> 
> 
> We also define the number of regs for every technology in that file.

I'm imagining I387_STEND_REGNUM to be just one of:

  #define I387_STEND_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 16)
  #define I387_STEND_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + I387_NUM_ST_REGS)

Thus exactly the same as I387_XMM0_REGNUM:

  #define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 16)

And so it would trigger the same GCC warning.

So we'd still need to do the local variable trick:

  end = I387_STEND_REGNUM (tdep);
  for (i = I387_ST0_REGNUM (tdep); i < end; i++)

Thanks,
Pedro Alves


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gdb/i387-tdep.c: Avoid warning for "-Werror=strict-overflow"
  2014-10-06 13:29             ` Chen Gang
@ 2014-10-10 11:22               ` Chen Gang
  0 siblings, 0 replies; 11+ messages in thread
From: Chen Gang @ 2014-10-10 11:22 UTC (permalink / raw)
  To: Pedro Alves, Joel Brobecker
  Cc: Mark Kettenis, amodra, gbenson, michael.sturm, walfred.tedeschi,
	binutils, gdb-patches

On 10/6/14 21:35, Chen Gang wrote:
> On 10/6/14 16:41, Pedro Alves wrote:
>> On 10/04/2014 06:18 AM, Chen Gang wrote:
>>>
>>> OK, thanks. It is really one way, it is a little better than my original
>>> way. But for me, it is still not a good idea: it introduces a new macro
>>> and a new variable for each area (originally, it is only one statement).
>>
>> I see no problem with adding the new macro.  We already have a ton
>> of similar macros, see i386-tdep.h and i387-tdep.h.  Looks
>> like the existing I387_NUM_REGS is what we'd need here?
>>
>> BTC, OOC, did you try Joel's idea with the local variable?
>> In case Mark prefers that, it'd be good to know whether it works.
>> I can't seem to get my gcc to emit that warning.
>>
>> Combining both ideas, for clarity, we end up with something
>> like:
>>
>>  int end;
>>
>>  end = I387_ST0_REGNUM (tdep) + I387_NUM_REGS;
>>  for (i = I387_ST0_REGNUM (tdep); i < end; i++)
>>
>>  ...
>>
>>  end = I387_XMM0_REGNUM (tdep) + I387_NUM_XMM_REGS (tdep);
>>  for (i = I387_XMM0_REGNUM (tdep); i < end; i++)
>>
>>
>> That's way clearer to me than the existing:
>>
> 
> That's way not quite bad to me than the existing:
> 
>  - It is easier understanding, although a little complex than origin.
> 
>  - For compiler, 'end' is simple enough to be sure to be optimized.
> 
>  - And I guess, compiler will understand, and will not worry about it.
> 
> 
>>  for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
>> ...
>>  for (i = I387_XMM0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++)
>>
>> anyway, which assumes the reader knows register numbers are
>> ordered like st -> xmm -> mxcrsr.
>>
>> If this works, I think it's my preference.
>>
> 
> OK, thanks, at least, what you said is acceptable to me. If no any
> additional reply within this week (within 2014-10-12), I shall send
> patch v2 for it.
> 

After try, it seems still a little strange for human being: it is too
'clear' to need be combined (so I have to give related comment for it).

The related diff may like below, it can pass compiling without related
warnings, if no any objections within 2 days, I shall send patch v2 for
it.

-------------------------- diff begin ----------------------------------

diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
index d66ac6a..4617bdd 100644
--- a/gdb/i387-tdep.c
+++ b/gdb/i387-tdep.c
@@ -450,11 +450,12 @@ i387_supply_fsave (struct regcache *regcache, int regnum, const void *fsave)
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   const gdb_byte *regs = fsave;
-  int i;
+  int i, end;
 
   gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
 
-  for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
+  end = I387_XMM0_REGNUM (tdep); /* let compiler don't worry about it */
+  for (i = I387_ST0_REGNUM (tdep); i < end; i++)
     if (regnum == -1 || regnum == i)
       {
 	if (fsave == NULL)
@@ -503,11 +504,12 @@ i387_collect_fsave (const struct regcache *regcache, int regnum, void *fsave)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (get_regcache_arch (regcache));
   gdb_byte *regs = fsave;
-  int i;
+  int i, end;
 
   gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
 
-  for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
+  end = I387_XMM0_REGNUM (tdep); /* let compiler don't worry about it */
+  for (i = I387_ST0_REGNUM (tdep); i < end; i++)
     if (regnum == -1 || regnum == i)
       {
 	/* Most of the FPU control registers occupy only 16 bits in

-------------------------- diff end ------------------------------------

Thanks.
-- 
Chen Gang

Open, share, and attitude like air, water, and life which God blessed


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2014-10-10 11:22 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-10-03 15:24 [PATCH] gdb/i387-tdep.c: Avoid warning for "-Werror=strict-overflow" Chen Gang
2014-10-03 15:46 ` Mark Kettenis
2014-10-03 16:02   ` Chen Gang
2014-10-03 16:44     ` Joel Brobecker
2014-10-03 18:47       ` Pedro Alves
2014-10-04  5:12         ` Chen Gang
2014-10-06  8:41           ` Pedro Alves
2014-10-06 13:29             ` Chen Gang
2014-10-10 11:22               ` Chen Gang
2014-10-09 10:06         ` Walfred Tedeschi
2014-10-09 11:20           ` Pedro Alves

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox