[cfe-dev] Bug#704111: clang fails to correctly implement hard float ABI during default compiles due to rediculously low default CPU setting.
peter green
plugwash at p10link.net
Wed Mar 27 18:06:27 PDT 2013
Package: clang
Version: 1:3.0-6.1
Severity: grave
x-debbugs-cc: debian-arm at lists.debian.org; cfe-dev at cs.uiuc.edu
(note for non-debian people reading this, the version of clang in debian
wheezy is a 3.0 based version which already has patches to make it
invoke the linker with appropriate arguments. The llvm version also
appears to be 3.0 again somewhat patched by debian)
I recently discovered that the version of clang in debian wheezy and
raspbian wheezy does not work correctly on either debian armhf or
raspbian. It seems the problem is that clang can't work out what CPU
type it should be using and defaults to something very low (specifically
arm7tdmi). With this CPU selected clang silently fails to properly use
the hard float ABI and as such any armhf code it generates is broken and
won't call floating point routines correctly. It also causes an
assertion failure in the bfd linker (but links successfully with the
gold linker). Setting the CPU type to something sensible makes it
implement the hard float ABI correctly and also stops the assertion
failure in the bfd linker.
I have managed to figure out how to patch clang to change the default
CPU for armhf (patch attatched). However i'm not sure what it is best to
set it to for debian armhf*. In particular this block of code from just
below where my patch is applied seems to map all armv7 variants to a CPU
type of "coretex-a8".
return llvm::StringSwitch<const char
*>(MArch)
.Cases("armv2",
"armv2a","arm2")
.Case("armv3",
"arm6")
.Case("armv3m",
"arm7m")
.Cases("armv4", "armv4t",
"arm7tdmi")
.Cases("armv5", "armv5t",
"arm10tdmi")
.Cases("armv5e", "armv5te",
"arm1026ejs")
.Case("armv5tej",
"arm926ej-s")
.Cases("armv6", "armv6k",
"arm1136jf-s")
.Case("armv6j",
"arm1136j-s")
.Cases("armv6z", "armv6zk",
"arm1176jzf-s")
.Case("armv6t2",
"arm1156t2-s")
.Cases("armv7", "armv7a", "armv7-a",
"cortex-a8")
.Cases("armv7r", "armv7-r",
"cortex-r4")
.Cases("armv7m", "armv7-m",
"cortex-m3")
.Case("ep9312",
"ep9312")
.Case("iwmmxt",
"iwmmxt")
.Case("xscale",
"xscale")
.Cases("armv6m", "armv6-m",
"cortex-m0")
// If all else failed, return the most base CPU LLVM
supports.
.Default("arm7tdmi");
Now it is my understanding that "traditional cortex a8" includes CPU
features not required by debian armhf. Specifically neon and the extra
vfp registers. The questions I have are
1: What does the "coretex-a8" CPU setting imply for clang/llvm? in
particular does it imply neon and the extra vfp registers?
2: If noone can provide an answer to the above question then taking into
the account how late we are in the freeze should we play it safe and
specify a lower (armv6) CPU version to make sure that neon and the extra
vfp registers don't get accidently used. I personally think that the
answer is yes but I'm open to arguments.
If I get no response to this within about a weak I intend to attach a
nmu diff containing a version of the patch that sets the default set to
armv6. Then file a pre-approval request with the release team. Finally
if the release team approves and noone objects I intend to upload the NMU.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 29-set-default-cpu-for-armhf.diff
Type: text/x-diff
Size: 1494 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130328/258fbd70/attachment.diff>
More information about the cfe-dev
mailing list