This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Fix -fsection-anchors on Darwin
- From: Jack Howarth <howarth at bromo dot med dot uc dot edu>
- To: mikestump at comcast dot net
- Cc: "gcc-patches at gcc dot gnu dot org Patches" <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 14 Apr 2010 12:00:31 -0400
- Subject: Re: Fix -fsection-anchors on Darwin
- References: <5B4E06FE-CD05-49DF-A287-8E79240CDDCB@apple.com> <503321DF-8090-42EE-BD3D-64B5A489D2E5@apple.com> <20100414154709.GA6027@bromo.med.uc.edu>
On Wed, Apr 14, 2010 at 11:47:09AM -0400, Jack Howarth wrote:
> On Thu, Jun 08, 2006 at 03:44:20PM -0700, Mike Stump wrote:
> > Well, given the time and the wrong code gen, I've disabled -fsection-
> > anchors for darwin. It is safer than doing things like disappearing
> > data on people, which is the direction Geoff wanted to go. I think we
> > need a new linker feature for multiple entry points to really make this
> > work well, and if not that, then turning off subsections_via_symbols and
> > ensuring that works well.
>
> Mike,
> Could you update your comments on this? Since it seems unlikely
> that the linker will ever been changed on darwin to support section-anchors,
> it seems to leave on the turning off subsections_via_symbols if we
> wanted to implement section-anchors support on darwin, no?
>
This openradar seems to discuss disabling subsections_via_symbols in the
assembly file but doesn't indicate how to do it from within the compiler...
http://openradar.appspot.com/7201596
> >
> > If the optimizer wants to jam all the data together into one object
> > itself, and then write out that object, that would work as well, and
> > there is something appealing about that. Also, to get nice codegen and
> > dead code stripping, I think we want LTO to manage this issue.
>
> Since it appears that Mach-O LTO will be possible, I assume this can
> be handled through that option.
> Jack
>
> >
> > This fixes a regression introduced by:
> >
> > 2006-04-30 David Edelsohn <edelsohn@gnu.org>
> >
> > * config/rs6000/rs6000.c (rs6000_override_options): Enable
> > TARGET_NO_FP_IN_TOC for section anchors.
> > (optimization_options): Enable section anchors for all
> > non-"Objective" languages.
> >
>
> > 2006-06-08 Mike Stump <mrs@apple.com>
> >
> > PR target/26427
> > * config/darwin.c (darwin_asm_output_anchor): Disable
> > -fsection-anchors on darwin for now.
> > * config/darwin.h (TARGET_ASM_OUTPUT_ANCHOR): Likewise.
> > * rs6000/rs6000.c (optimization_options): Likewise.
> >
> > PR target/26427
> > * gcc.dg/pr26427.c: Test to ensure that -fsection-anchors doesn't
> > produce bad code on darwin.
> >
> > Doing diffs in .:
> > --- ./config/darwin.c.~1~ 2006-06-06 05:36:45.000000000 -0700
> > +++ ./config/darwin.c 2006-06-08 14:52:31.000000000 -0700
> > @@ -1524,6 +1524,8 @@ darwin_binds_local_p (tree decl)
> > return default_binds_local_p_1 (decl, 0);
> > }
> >
> > +#if 0
> > +/* See TARGET_ASM_OUTPUT_ANCHOR for why we can't do this yet. */
> > /* The Darwin's implementation of TARGET_ASM_OUTPUT_ANCHOR. Define the
> > anchor relative to ".", the current section position. We cannot use
> > the default one because ASM_OUTPUT_DEF is wrong for Darwin. */
> > @@ -1536,6 +1538,7 @@ darwin_asm_output_anchor (rtx symbol)
> > fprintf (asm_out_file, ", . + " HOST_WIDE_INT_PRINT_DEC "\n",
> > SYMBOL_REF_BLOCK_OFFSET (symbol));
> > }
> > +#endif
> >
> > /* Set the darwin specific attributes on TYPE. */
> > void
> > --- ./config/darwin.h.~1~ 2006-06-06 05:36:45.000000000 -0700
> > +++ ./config/darwin.h 2006-06-08 14:52:31.000000000 -0700
> > @@ -812,8 +812,6 @@ enum machopic_addr_class {
> > goto DONE; \
> > }
> >
> > -#define TARGET_ASM_OUTPUT_ANCHOR darwin_asm_output_anchor
> > -
> > /* Experimentally, putting jump tables in text is faster on SPEC.
> > Also this is needed for correctness for coalesced functions. */
> >
> > @@ -852,6 +850,7 @@ void add_framework_path (char *);
> > #define TARGET_POSIX_IO
> >
> > /* All new versions of Darwin have C99 functions. */
> > +
> > #define TARGET_C99_FUNCTIONS 1
> >
> > #define WINT_TYPE "int"
> > @@ -859,7 +858,20 @@ void add_framework_path (char *);
> > /* Every program on darwin links against libSystem which contains the pthread
> > routines, so there's no need to explicitly call out when doing threaded
> > work. */
> > +
> > #undef GOMP_SELF_SPECS
> > #define GOMP_SELF_SPECS ""
> >
> > +/* Darwin can't support anchors until we can cope with the adjustments
> > + to size that ASM_DECLARE_OBJECT_NAME and ASM_DECLARE_CONSTANT_NAME
> > + when outputting members of an anchor block and the linker can be
> > + taught to keep them together or we find some other suitable
> > + code-gen technique. */
> > +
> > +#if 0
> > +#define TARGET_ASM_OUTPUT_ANCHOR darwin_asm_output_anchor
> > +#else
> > +#define TARGET_ASM_OUTPUT_ANCHOR NULL
> > +#endif
> > +
> > #endif /* CONFIG_DARWIN_H */
> > --- ./config/rs6000/rs6000.c.~1~ 2006-06-06 05:36:45.000000000 -0700
> > +++ ./config/rs6000/rs6000.c 2006-06-08 14:52:31.000000000 -0700
> > @@ -1633,7 +1633,7 @@ optimization_options (int level ATTRIBUT
> > /* Enable section anchors by default.
> > Skip section anchors for Objective C and Objective C++
> > until front-ends fixed. */
> > - if (lang_hooks.name[4] != 'O')
> > + if (!TARGET_MACHO && lang_hooks.name[4] != 'O')
> > flag_section_anchors = 1;
> > }
> >
> > --- ./testsuite/gcc.dg/pr26427.c.~1~ 2006-06-08 14:52:31.000000000 -0700
> > +++ ./testsuite/gcc.dg/pr26427.c 2006-06-08 14:54:07.000000000 -0700
> > @@ -0,0 +1,24 @@
> > +/* { dg-warning "this target does not support" } */
> > +/* { dg-do run { target { *-*-darwin* } } } */
> > +/* { dg-options { -fsection-anchors -O } } */
> > +/* PR target/26427 */
> > +
> > +struct a {};
> > +static const int d = 1;
> > +static const struct a b = {};
> > +static const int c = 1;
> > +int f(const int *, const struct a *, const int*, const int*);
> > +
> > +int g(void) {
> > + return f(&c, &b, &d, &c);
> > +}
> > +
> > +int f(const int *b, const struct a *c, const int *d, const int *e) {
> > + return *b == *d;
> > +}
> > +
> > +int main(void) {
> > + if (!g())
> > + __builtin_abort();
> > + return 0;
> > +}
> > --------------
>