From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tom Rini Date: Mon, 30 Dec 2019 10:41:44 -0500 Subject: [PATCH 1/1] usb: avoid -Werror=address-of-packed-member In-Reply-To: <8c6c7803-3695-fd92-aa16-6900a83af8a2@denx.de> References: <20191217092754.31710-1-xypron.glpk@gmx.de> <3c515d67-67f8-e4d0-7937-ef52b7913320@denx.de> <894d5ed7-9ddb-94b5-b8e5-c0e70412c948@denx.de> <1fbdbd59-8da8-b0fd-f9f5-043bb894c194@gmx.de> <4f714e98-df4f-1617-fc47-8a374bd79258@denx.de> <2cde90c2-ce8d-fcf5-fd2c-fd536820355a@gmx.de> <8c6c7803-3695-fd92-aa16-6900a83af8a2@denx.de> Message-ID: <20191230154144.GD4866@bill-the-cat> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On Tue, Dec 17, 2019 at 08:52:01PM +0100, Marek Vasut wrote: > On 12/17/19 8:32 PM, Heinrich Schuchardt wrote: > > On 12/17/19 1:19 PM, Marek Vasut wrote: > >> On 12/17/19 12:59 PM, Heinrich Schuchardt wrote: > >>> On 12/17/19 12:19 PM, Marek Vasut wrote: > >>>> On 12/17/19 12:14 PM, Heinrich Schuchardt wrote: > >>>>> On 12/17/19 11:00 AM, Marek Vasut wrote: > >>>>>> On 12/17/19 10:27 AM, Heinrich Schuchardt wrote: > >>>>>>> With GCC 9.2.1 errors of type -Werror=address-of-packed-member occur > >>>>>>> when > >>>>>>> passing a member of a packed structure to le16_to_cpus() on a big > >>>>>>> endian > >>>>>>> system (e.g. P2041RDB_defconfig). > >>>>>>> > >>>>>>> Replace le16_to_cpus() by get_unaligned_le16(). Check > >>>>>>> defined(__BIG_ENDIAN) > >>>>>>> to avoid the introduction of unnecessary instructions on little > >>>>>>> endian > >>>>>>> systems as seen on aarch64. > >>>>>> > >>>>>> I would expect the compiler would optimize such stuff out ? > >>>>>> Can we do without the ifdef ? > >>>>> > >>>>> When compiling qemu_arm64_defconfig without the #ifdef the GCC 9.2.1 > >>>>> adds assembler instructions: > >>>> > >>>> Why ? > >>>> > >>> > >>> I am not a GCC developer. I simply observed that GCC currently cannot > >>> optimize this away on its own. That is why I added the #ifdef. > >> > >> Are we now adding workarounds instead of solving issues properly? > >> > >>> Identifying that bit operations like << 8 in __get_unaligned_le16() have > >>> zero effect is not an easy task when developing a compiler. You would > >>> have to follow the flow of every bit. > >> > >> Maybe the fix is then to somehow optimize the get_unaligned_le16() to > >> help the compiler ? > > > > Inside get_unaligned_le16() it is not known that we will be reassigning > > to the same memory location. So I cannot imagine what to improve here. > > > > You could invent new functions for in place byte swapping. But that > > would only move the #ifdef to a different place. > > Isn't there already such a function in Linux ? > > Also, why would you need the ifdef if the compiler would now know that > the operation is noop ? This particular patch looks to me exactly why we want to follow the Linux Kernel and disable this particular warning for GCC like we already do for LLVM. -- Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 833 bytes Desc: not available URL: