Thank you Erhan for submitting the fixes, and for Antonio for not immediately 
backing out these patches.  It sounds like both Erhan and I are able to build 
now, him with gcc12 and me with gcc10.

Going forward, what parts of the review flow did I miss so I can avoid causing 
this trouble in the future?  I should definitely have rerun static analysis on 
a more recent patchset of 7055.  Is upgrading my GCC required also?

Apologies for the trouble and thank you again @Erhan 
Kurubas<mailto:erhan.kuru...@espressif.com> for the very timely fixes.

Best,
--ian


From: Antonio Borneo <borneo.anto...@gmail.com>
Sent: Saturday, August 20, 2022 12:27 PM
To: Ian Thompson <ia...@cadence.com>; Erhan Kurubas 
<erhan.kuru...@espressif.com>
Cc: OpenOCD <OpenOCD-devel@lists.sourceforge.net>
Subject: Re: Build error: target: add generic Xtensa LX support

EXTERNAL MAIL
Plus 5 new clang warnings
https://build.openocd.org/job/openocd-clang/1106/<https://urldefense.com/v3/__https:/build.openocd.org/job/openocd-clang/1106/__;!!EHscmS1ygiU1lA!AyCLvbIRr3KNYJM1gTPOMzF8ZJHOrJ13vSfhWvBCDOzayhMXI9sfgdJFpzA2jhiRKacnt3fNowSa2BjkgJZyHQ$>
Actually 3 are surely from xtensa code. The other 2 are not clear.

Antonio

On Sat, Aug 20, 2022, 19:52 Antonio Borneo 
<borneo.anto...@gmail.com<mailto:borneo.anto...@gmail.com>> wrote:
I have made the mistake to merge the patch
https://review.openocd.org/c/openocd/+/7055<https://urldefense.com/v3/__https:/review.openocd.org/c/openocd/*/7055__;Kw!!EHscmS1ygiU1lA!AyCLvbIRr3KNYJM1gTPOMzF8ZJHOrJ13vSfhWvBCDOzayhMXI9sfgdJFpzA2jhiRKacnt3fNowSa2BiwPmqxOQ$>
without pre-building it locally on my PC for test, which is what I
usually do (but not today!).
BOOM.
Master branch does not compile anymore

I tried to fix it, but I ended up with one issue!
Could you please investigate and provide a patch asap?
For the moment I prefer not reverting this and 7083.

Analysis below.
Antonio

Compile errors with GCC 12.1.0
src/target/xtensa/xtensa.c: In function 'xtensa_target_init':
src/target/xtensa/xtensa.c:2471:65: error: '%04x' directive writing
between 4 and 8 bytes into a region of size 5
[-Werror=format-overflow=]
 2471 |                 sprintf((char *)xtensa->empty_regs[i].name,
"?0x%04x", i);
      |                                                                 ^~~~
In function 'xtensa_build_reg_cache',
    inlined from 'xtensa_target_init' at src/target/xtensa/xtensa.c:2899:9:
src/target/xtensa/xtensa.c:2471:61: note: directive argument in the
range [0, 4294967294]
 2471 |                 sprintf((char *)xtensa->empty_regs[i].name,
"?0x%04x", i);
      |                                                             ^~~~~~~~~
src/target/xtensa/xtensa.c:2471:17: note: 'sprintf' output between 8
and 12 bytes into a destination of size 8
 2471 |                 sprintf((char *)xtensa->empty_regs[i].name,
"?0x%04x", i);
      |
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This can be easily fixed adding a mask
- sprintf((char *)xtensa->empty_regs[i].name, "?0x%04x", i);
+ sprintf((char *)xtensa->empty_regs[i].name, "?0x%04x", i & 0x0000ffff);


Still GCC 12.1.0
In file included from src/target/xtensa/xtensa_chip.h:12,
                 from src/target/xtensa/xtensa.c:20:
In function 'xtensa_queue_dbg_reg_write',
    inlined from 'xtensa_write_dirty_registers' at
src/target/xtensa/xtensa.c:758:3:
src/target/xtensa/xtensa.h:297:16: error: 'a3' may be used
uninitialized [-Werror=maybe-uninitialized]
  297 |         return dm->dbg_ops->queue_reg_write(dm, reg, data);
      |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/target/xtensa/xtensa.c: In function 'xtensa_write_dirty_registers':
src/target/xtensa/xtensa.c:594:26: note: 'a3' was declared here
  594 |         xtensa_reg_val_t a3, woe;
      |                          ^~

Here looks that GCC is dumb and fails to detect that 'preserve_a3' is
not changed.
Initializing a3=0 is a good workaround
- xtensa_reg_val_t a3, woe;
+ xtensa_reg_val_t a3 = 0, woe;


Then, on MacOS CLANG, looks like enum are considered as unsigned int
(which surprises me, while GCC consider them as signed)
src/target/xtensa/xtensa.c:2850:51: error: comparison of unsigned enum
expression >= 0 is always true [-Werror,-Wtautological-compare]
                         for (enum xtensa_ar_scratch_set_e f = s - 1;
s >= 0; s--)
                                                                      ~ ^  ~
But here the code is broken!
2850:           for (enum xtensa_ar_scratch_set_e f = s - 1; s >= 0; s--)
2851:               free(xtensa->scratch_ars[f].chrval);
the variable f does not change in the loop, so you free the same area
's' times. Here valgrind should scream loudly.
You report valgrind-clean in the commit message; probably the
execution flow never passed through this code.
Is fix below ok?
- for (enum xtensa_ar_scratch_set_e f = s - 1; s >= 0; s--)
+ for (enum xtensa_ar_scratch_set_e f = 0; f < s; f++)


Reply via email to