[compiler-rt] r208603 - Move .subsections_via_symbols directives into DEFINE_COMPILERRT_PRIVATE_FUNCTION
Reid Kleckner
rnk at google.com
Mon May 12 17:13:02 PDT 2014
On Mon, May 12, 2014 at 4:44 PM, Nick Kledzik <kledzik at apple.com> wrote:
>
> On May 12, 2014, at 4:18 PM, Jonathan Roelofs <jonathan at codesourcery.com>
> wrote:
>
> >
> >
> > On 5/12/14, 3:47 PM, Nick Kledzik wrote:
> >> FYI, this is a semantic change. The .subsection_via_symbols directive
> tells the linker that the .o file has no functions that will fall into the
> next one (the compiler never does that, but it is common enough in hand
> written assembly). That means the linker can dead strip functions not
> referenced. By moving .subsection_via_symbols into FILE_LEVEL_DIRECTIVE,
> you’ve caused every file to opt-in to the directive, even if they have fall
> through code.
> >>
> > I think the real gotcha here is that DEFINE_COMPILERRT_FUNCTION, which
> defines something that looks like function level scope had/has a global
> directive in it affecting file level scope…
> Yes!
>
> >> I just did a quick survey of the .S files in compiler-rt and do not see
> any with fall through code. Mostly because compiler-rt has the convention
> of one function per file.
> > Does it really though? I didn't move .subsection_via_symbols into
> FILE_LEVEL_DIRECTIVE, it was already there. This only changes it for
> private functions, and further it makes those behave the same way as
> non-private ones, which already had it.
> Oh, sorry I was looking at the final result and did not realize it was
> half broke before your change.
>
> >>
> >> So, this change should be benign now, but may cause surprises on darwin
> in the future if someone tries to write fall-through assembly code.
> > So to eliminate this gotcha, it sounds like you are suggesting that I:
> > a) Remove FILE_LEVEL_DIRECTIVE from DEFINE_COMPILERRT_FUNCTION and
> DEFINE_COMPILERRT_PRIVATE_FUNCTION
> > b) Maybe also remove .subsections_via_symbols from FILE_LEVEL_DIRECTIVE
> > c) Add .subsections_via_symbols to every *.S file (possibly inside some
> other appropriately named macro)
> >
> > I'm happy to do this, but I want to make sure I'm clear on what you want.
> That would be a clean solution, but it is a bunch of work to support a
> case we don’t have and probably don’t want. A simpler solution would be:
> a) Remove use of FILE_LEVEL_DIRECTIVE from DEFINE_COMPILERRT_FUNCTION and
> DEFINE_COMPILERRT_PRIVATE_FUNCTION
> b) Remove definition of FILE_LEVEL_DIRECTIVE
> c) Having assembly.h out right use .subsections_via_symbols , e.g.:
>
> #if defined(__APPLE__) && !defined(COMPILERRT_NON_STD_DARWIN)
> /* Any assembly code that has multiple entry points needs to
> #define COMPILERRT_NON_STD_DARWIN
> before including assembly.h
> */
> .subsections_via_symbols
> #endif
>
> So, by default it assumes all code follows the darwin conventions (as it
> currently does), but if an issue arises, there is an easy way to disable
> .subsections_via_symbols on a file-by-file basis.
I'm not a compiler-rt person, but I don't think it's good design for
headers to expect includers to define macros before inclusion. I think the
current situation is fine.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140512/57af328b/attachment.html>
More information about the llvm-commits
mailing list