
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.
adam
-- Tom