This is the mail archive of the
mailing list for the GCC project.
[PATCH fix PR71767 0/4] Background
- From: Iain Sandoe <iain at codesourcery dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Mike Stump <mikestump at comcast dot net>, Jeff Law <law at redhat dot com>, Dominique d'Humières <dominiq at lps dot ens dot fr>, <ubizjak at gmail dot com>
- Date: Sun, 6 Nov 2016 11:36:52 -0800
- Subject: [PATCH fix PR71767 0/4] Background
- Authentication-results: sourceware.org; auth=none
Including Jeff on the cc since we were discussing this on Friday (and it’s not 100% clear who’s reviewing configury patches at present).
Including Uros, because there’s one minor change to i386/i386.c
PR71767 is " Endless stream of warnings when using GCC with -Wa,-q and Clang Integrated Assembler”.
** we are talking 40k testsuite fails, so this is a show-stopper for current toolchains.
Actually, what’s happened is that recent xcode tools have started to issue a warning about deprecated use of a mechanism to support coalesced symbols by using separate sections with specific attributes in the (ancient) days before the static linker supported them directly. We need to catch up since deprecation will no doubt be followed by removal.
Essentially, now that the linker is capable of dealing with such things, the right solution is to emit them into the regular sections and drop the use of the coalesced ones. This has been possible for some time, and Xcode is now flagging that it’s time to tidy up and drop the old mechanism.
A. this is only true when the “binutils” (cctools + ld64) are sufficiently new to support it.
- so the solution needs to be made to depend on the version of ld64 in use.
B. more importantly, it reveals some cases where the ld64 atom model*** will be violated when symbols are concatenated such that weak globals and non-weak locals can be confused.
- we need to fix this before we can apply A
C. it makes a secondary variant of pr57438 fire more often (when switches contain trailing cases with __builtin_unreachable() resulting in trailing local symbols with jump-table references, that potentially have the same address as a following weak global). That might seem improbable, but c++ with case statements with an unreachable default manage to hit it...
- I’ll post for this separately, but noting it in passing.
*** The ld64 atom model summary;
Instead of using -ffunction-sections/-fdata-sections, Darwin’s linker has a different model of partitioning the input objects such that they might be rearranged to minimise displacements, and to identify dead code that may be stripped (in a similar manner to —gc-sections).
Input binaries to ld64 are automatically partitioned into “atoms”;
an atom is defined as “a section of code or data beginning with a linker-visible symbol and of non-zero size”.
These “atoms” have the properties of their initial symbol and may be rearranged and dead-stripped.
— the general problem is that we might have a situation where we have:
pic reference to Lxxxx
ld64 will split the object at “visible-global-weak” but it won’t see “Lxxxx” and so the pic reference will appear to point into the visible-global-weak atom, [which is not allowed without indirection (to support interposing)].
Of course, that’s a false-positive complaint - but ld64 can’t see the other place to split.
This is solved in other Darwin toolchains by making the “L” into “l” in such cases; lower-case “l” is not hidden by the assembler, and thus the linker can see it and split the second section of code into its own ‘non-weak’ atom; everyone’s happy. Of course, we don’t want to do this unnecessarily, since it’s inefficient from the PoV of extra symbols.
linker-visible symbols made this way will not be retained in the final linked entity (dso or exe).
Patch 1: implements the changes to modify L => l in the relevant places.
Patch 2: Adds configury to specify or detect that the linker is ld64 (or compatible) and to determine its version; there’s a fall-back to allow the version to be specified by someone doing a native or Canadian cross.
Patch 3: Is the actual fix that switches the section use to ‘regular’ for sufficiently modern ld64 (there’s a minor change to i386/i386.c)
Patch 4: (Mostly Dominique’s work) fixes up the testsuite fallout.
This has been tested across the Darwin patch - from powerpc-darwin9 - x86_64-apple-darwin16 and I did a bootstrap and check on x86_64-linux-gnu.
The patches could be applied one at a time - but N typically depends on N-1 - so the sequence of application needs to follow this.