On Wed, Dec 21, 2016 at 9:58 AM, Mike Holmes <mike.hol...@linaro.org> wrote: > On 21 December 2016 at 10:49, Maxim Uvarov <maxim.uva...@linaro.org> wrote: > >> On 12/21/16 18:31, Mike Holmes wrote: >> > >> > >> > On 21 December 2016 at 10:26, Maxim Uvarov <maxim.uva...@linaro.org >> > <mailto:maxim.uva...@linaro.org>> wrote: >> > >> > On debian jessie gcc unable to compile current code >> > with error: >> > odp_packet.c: In function 'odp_packet_trunc_head': >> > odp_packet.c:314:46: error: array subscript is above array bounds >> > [-Werror=array-bounds] >> > to->buf_hdr.seg[i].len = from->buf_hdr.seg[num + i].len; >> > >> > The problem is that it breaks compilation only on .len line: >> > for (i = 0; i < num; i++) { >> > to->buf_hdr.seg[i].hdr = from->buf_hdr.seg[num + i].hdr; >> > to->buf_hdr.seg[i].data = from->buf_hdr.seg[num + i].data; >> > to->buf_hdr.seg[i].len = from->buf_hdr.seg[num + i].len; >> > } >> > >> > If that line is commented out compilation passes. If lines are >> reordered >> > than compilation also passes. Because there is no warning on .hdr >> > and .data >> > it looks like compiler error. Additional check for preconfigured >> value >> > is workaround to that situation. >> > >> > Signed-off-by: Maxim Uvarov <maxim.uva...@linaro.org >> > <mailto:maxim.uva...@linaro.org>> >> > --- >> > platform/linux-generic/odp_packet.c | 2 ++ >> > 1 file changed, 2 insertions(+) >> > >> > diff --git a/platform/linux-generic/odp_packet.c >> > b/platform/linux-generic/odp_packet.c >> > index 0d3fd05..f3e0a12 100644 >> > --- a/platform/linux-generic/odp_packet.c >> > +++ b/platform/linux-generic/odp_packet.c >> > @@ -309,6 +309,8 @@ static inline void >> > copy_num_segs(odp_packet_hdr_t *to, odp_packet_hdr_t *from, >> > int i; >> > >> > for (i = 0; i < num; i++) { >> > + if (odp_unlikely((num + i) >= >> CONFIG_PACKET_MAX_SEGS)) >> > + ODP_ABORT("packet segmenation error\n"); >> > >> > >> > Does this impact performance, if so should it be optionally compiled in >> > for that GCC version ? >> > >> >> >> CONFIG_PACKET_MAX_SEG is currently 2. And according to our tests it will >> add one if check for odp_packet_trunc_head() and odp_packet_trunc_tail() >> calls. So overhead is one if instruction.
I agree that this is a bit of a kludge. I'm currently debugging Bug 2789 where things fail if CONFIG_PACKET_MAX_SEG > 2. I'd like to see if the fix for that doesn't result in a cleaner implementation in this area that may not expose this issue. >> >> >> It fails on Jessie, which is: >> # gcc -v >> Using built-in specs. >> COLLECT_GCC=gcc >> COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper >> Target: x86_64-linux-gnu >> Configured with: ../src/configure -v --with-pkgversion='Debian 4.9.2-10' >> --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs >> --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr >> --program-suffix=-4.9 --enable-shared --enable-linker-build-id >> --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix >> --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib >> --enable-nls --with-sysroot=/ --enable-clocale=gnu >> --enable-libstdcxx-debug --enable-libstdcxx-time=yes >> --enable-gnu-unique-object --disable-vtable-verify --enable-plugin >> --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk >> --enable-gtk-cairo >> --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64/jre >> --enable-java-home >> --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64 >> --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-amd64 >> --with-arch-directory=amd64 >> --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc >> --enable-multiarch --with-arch-32=i586 --with-abi=m64 >> --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic >> --enable-checking=release --build=x86_64-linux-gnu >> --host=x86_64-linux-gnu --target=x86_64-linux-gnu >> Thread model: posix >> gcc version 4.9.2 (Debian 4.9.2-10) >> >> >> And passes on my Ubuntu which is (4.8 or 4.9): >> gcc-4.9 -v >> Using built-in specs. >> COLLECT_GCC=gcc-4.9 >> COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper >> Target: x86_64-linux-gnu >> Configured with: ../src/configure -v --with-pkgversion='Ubuntu >> 4.9.3-0ubuntu4' >> --with-bugurl=file:///usr/share/doc/gccgo-4.9/README.Bugs >> --enable-languages=c,c++,go --prefix=/usr --program-suffix=-4.9 >> --enable-shared --enable-linker-build-id --libexecdir=/usr/lib >> --without-included-gettext --enable-threads=posix >> --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib >> --enable-nls --with-sysroot=/ --enable-clocale=gnu >> --enable-libstdcxx-time=yes --enable-gnu-unique-object >> --disable-vtable-verify --disable-libquadmath --enable-plugin >> --with-system-zlib --enable-multiarch --disable-werror >> --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 >> --enable-multilib --with-tune=generic --enable-checking=release >> --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu >> Thread model: posix >> gcc version 4.9.3 (Ubuntu 4.9.3-0ubuntu4) >> >> >> And for arm it looks like it failed with some 5.x gcc version. So it >> might be not easy to define exactly which version is it. >> >> >> > Perhaps we need to just add a comment then - possibly a doxygen one maybe > a @note ? > So that anyone editing in future will not re break it by mistake, they > might not test on a legacy compiler > > >> >> >> > >> > >> > to->buf_hdr.seg[i].hdr = from->buf_hdr.seg[num + >> > i].hdr; >> > to->buf_hdr.seg[i].data = from->buf_hdr.seg[num + >> > i].data; >> > to->buf_hdr.seg[i].len = from->buf_hdr.seg[num + >> > i].len; >> > -- >> > 2.7.1.250.gff4ea60 >> > >> > >> > >> > >> > -- >> > Mike Holmes >> > Program Manager - Linaro Networking Group >> > Linaro.org <http://www.linaro.org/>* **│ *Open source software for ARM >> SoCs >> > "Work should be fun and collaborative, the rest follows" >> > >> > __ >> > >> > >> >> > > > -- > Mike Holmes > Program Manager - Linaro Networking Group > Linaro.org <http://www.linaro.org/> *│ *Open source software for ARM SoCs > "Work should be fun and collaborative, the rest follows"