
On Sat, Aug 04, 2018 at 05:32:18AM -0500, Adam Ford wrote:
On Fri, Aug 3, 2018 at 10:20 AM Tom Rini trini@konsulko.com wrote:
On Fri, Aug 03, 2018 at 10:02:17AM -0500, Adam Ford wrote:
On Fri, Aug 3, 2018 at 10:00 AM Tom Rini trini@konsulko.com wrote:
On Fri, Aug 03, 2018 at 05:43:46AM -0500, Adam Ford wrote:
On Tue, Jul 25, 2017 at 11:08 AM Tom Rini trini@konsulko.com wrote:
On Tue, Jul 25, 2017 at 08:14:57AM -0500, Adam Ford wrote:
> The readme file for OMAP indicates that we compile using armv5 to "to > allow more compilers to work" > > We have our arch/arm/mach-omap2/omap3/lowlevel_init.S file also noting > some special assembly insturctions becuse we use armv5. The barriers > defined also indicate we're using CP15 instead of the separate barrier > instructions for armv7 because we're using armv5 instead. > > I just wonder in this day and age when we're noting a GCC version and > generating warnings based on the GCC warning, do we still need to > compile as armv5 any more? It seems like "to allow more compilers to > work" would not really apply any more we're trying to push newer > versions of GCC.
So, these are historical notes that really should be corrected. Initially, when ARMv7 support was added, most people did not have compilers new enough to recognize -march=armv7-a. We still even support them, see the logic in arch/arm/Makefile around CONFIG_CPU_V7 (the options are any sort of modern gcc, llvm, ancient gcc). When we move to gcc-6 being the oldest gcc supported for ARM we can fixup those comments and logic as well.
My understanding is that we've made the requirement for GCC 6 now. I just pushed a patch which enabled mtune=armv7-a-generic when CONFIG_CPU_V7A is enabled and that seems to shrink the code a bit on omap3_logic. Does it make sense to remove the , -march=armv5 from arch/arm/Makefile and or the plain -march=armv7 since CONFIG_CPU_V7A implies armv-a?
Yes, we can probably at least drop the v5 portion of that logic. As noted in the other patch, LLVM and GCC disagree on "armv7" vs "armv7-a" as being the appropriate name, or at least did in the past.
Can you point me to an example of how to tune armv7 for both GCC and LLVM? I was looking around and I'm not seeing an obvious syntax. I'll do a 2-part patch. One to remove the armv5, and one to enable the armv7 optimization.
In arch/arm/Makefile: arch-$(CONFIG_CPU_V7A) =$(call cc-option, -march=armv7-a, \ $(call cc-option, -march=armv7, -march=armv5))
this works in both cases. And doc/README.clang is correct on how to build with LLVM on ARM.
I reset my head to origin/master, but using the following, I am not able to build omap3_logic with clang on Ubuntu 18.04:
make HOSTCC=clang omap3_logic make HOSTCC=clang CROSS_COMPILE=arm-linux-gnueabi- \ CC="clang -target arm-linux-gnueabi" -j8
arch/arm/lib/memset.S:43:2: error: predicated instructions must be in IT block stmiage ip!, {r1, r3, r8, lr} @ 64 bytes at a time. ^ arch/arm/lib/memset.S:44:2: error: predicated instructions must be in IT block stmiage ip!, {r1, r3, r8, lr} ^ arch/arm/lib/memset.S:45:2: error: predicated instructions must be in IT block stmiage ip!, {r1, r3, r8, lr} ^ arch/arm/lib/memset.S:46:2: error: predicated instructions must be in IT block stmiage ip!, {r1, r3, r8, lr} ^ arch/arm/lib/memset.S:48:2: error: predicated instructions must be in IT block ldmfdeq sp!, {r8, pc} @ Now <64 bytes to go. ^ arch/arm/lib/memset.S:53:2: error: predicated instructions must be in IT block stmiane ip!, {r1, r3, r8, lr} ^ arch/arm/lib/memset.S:54:2: error: predicated instructions must be in IT block stmiane ip!, {r1, r3, r8, lr} ^ arch/arm/lib/memset.S:56:2: error: predicated instructions must be in IT block stmiane ip!, {r1, r3, r8, lr} ^ arch/arm/lib/memset.S:103:2: error: predicated instructions must be in IT block stmiane ip!, {r1, r3} ^ arch/arm/lib/memset.S:105:2: error: predicated instructions must be in IT block strne r1, [ip], #4 ^ arch/arm/lib/memset.S:111:2: error: predicated instructions must be in IT block strbne r1, [ip], #1 ^ arch/arm/lib/memset.S:112:2: error: predicated instructions must be in IT block strbne r1, [ip], #1 ^ arch/arm/lib/memset.S:114:2: error: predicated instructions must be in IT block strbne r1, [ip], #1 ^ arch/arm/lib/memset.S:120:2: error: predicated instructions must be in IT block strblt r1, [ip], #1 @ 1 ^ arch/arm/lib/memset.S:121:2: error: predicated instructions must be in IT block strble r1, [ip], #1 @ 1 ^ scripts/Makefile.build:314: recipe for target 'arch/arm/lib/memset.o' failed make[1]: *** [arch/arm/lib/memset.o] Error 1 Makefile:1373: recipe for target 'arch/arm/lib' failed make: *** [arch/arm/lib] Error 2 aford@aford-IdeaCentre-A730:~/src/u-boot$
If you have any suggestions, I'm open to try them. I have never used clang before, but I would really like to get these armv7a optimizations in to make SPL smaller.
I guess I forgot that you will need to turn off ARCH_MEMCPY/ARCH_MEMSET and EFI support for clang. That said, since you're just making sure the right options are being passed in, in both cases, you can also just use V=1 and just build common/main.o or something like that.