From patchwork Mon Jun 18 17:51:38 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Bosscher X-Patchwork-Id: 165564 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 6FE1FB7082 for ; Tue, 19 Jun 2012 03:52:26 +1000 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1340646746; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: MIME-Version:Received:From:Date:Message-ID:Subject:To:Cc: Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:Sender:Delivered-To; bh=IXhGwhj D1qpvtHU2+ejUiNYR0ek=; b=s9lfaC8kuEvomvrhHm4QM6SCxBYkUL2N+OueVrr 9OFMIHa7olyJ5k/ZUFLp3i89hIb1rd3Gx5RD1Bc6pA/O1F3LpSpnCrdKGj0sw+x5 v2warD8gKXMCA6eqmL3G/1WQtwPh/p6ShkdcGpeCc0Iuz4KxIXroB+RoMY7g1PKN LBqw= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:MIME-Version:Received:From:Date:Message-ID:Subject:To:Cc:Content-Type:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=X4Q4vm1g8H6jRefEzmdyhVl7Wj8jxn4VV9nsdSJzTpJXnPjXneB20sFk07DzW8 lOHI9iaLH3jevw8dJSHxOsym28dOQ0dt/iJQUOLBPMNZ8THlCWxmwnYTXY3QptQw 3nd7VM7xZcGW/zz1wcle5db4LKrWOV4AKqHv7cYqSwwck=; Received: (qmail 11071 invoked by alias); 18 Jun 2012 17:52:19 -0000 Received: (qmail 11052 invoked by uid 22791); 18 Jun 2012 17:52:14 -0000 X-SWARE-Spam-Status: No, hits=-4.1 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, KHOP_RCVD_TRUST, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE, TW_BJ X-Spam-Check-By: sourceware.org Received: from mail-lb0-f175.google.com (HELO mail-lb0-f175.google.com) (209.85.217.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 18 Jun 2012 17:52:00 +0000 Received: by lbol5 with SMTP id l5so4942479lbo.20 for ; Mon, 18 Jun 2012 10:51:58 -0700 (PDT) Received: by 10.152.131.68 with SMTP id ok4mr15207684lab.47.1340041918726; Mon, 18 Jun 2012 10:51:58 -0700 (PDT) MIME-Version: 1.0 Received: by 10.112.4.229 with HTTP; Mon, 18 Jun 2012 10:51:38 -0700 (PDT) From: Steven Bosscher Date: Mon, 18 Jun 2012 19:51:38 +0200 Message-ID: Subject: [patch] Fix PR48109 using artificial top-level asm statements (darwin/objc) To: GCC Patches Cc: Mike Stump , Iain Sandoe X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hello, This patch started as an attempt to remove #include "output.h" from objc/: Instead of writing references directly to asm_out_file, the references are output as top-level asm statements. It's a bit of a hack, but it works and it's a "better hack" than writing to asm_out_file from a front end, and it also happens to fix PR objc/48109 to make ObjC on darwin/-m32 LTO-compatible. Bootstrapped&tested on darwin by Iain, and bootstrapped&tested by me on x86_64-unknown-linux-gnu. OK for trunk? Ciao! Steven 2012-06-18 Steven Bosscher Iain Sandoe gcc/ * doc/tm.texi.in (TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE, TARGET_OBJC_DECLARE_CLASS_DEFINITION): Add @hooks. (ASM_DECLARE_CLASS_REFERENCE, ASM_DECLARE_UNRESOLVED_REFERENCE): Remove. * doc/tm.texi: Regenerate. * config/darwin.h (ASM_OUTPUT_LABELREF): Remove special case for .objc_class_name_*. * config/darwin-c.c: Include target.h. (darwin_objc_declare_unresolved_class_reference): New function. (darwin_objc_declare_class_definition): New function. (TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE): Define. (TARGET_OBJC_DECLARE_CLASS_DEFINITION): Define. c-family/ * c-target.def (objc_declare_unresolved_class_reference, objc_declare_class_definition): Add new hooks. objc/ * objc-next-runtime-abi-01.c: Do not include tm.h and output.h. Include c-family/c-target.h. (handle_next_class_ref): Rewrite to emit top-level asm statements. (handle_next_impent): Likewise. Index: gcc/c-family/c-target.def =================================================================== --- gcc/c-family/c-target.def (revision 188216) +++ gcc/c-family/c-target.def (working copy) @@ -59,8 +59,22 @@ DEFHOOK common-format string object when the target provides one.", tree, (tree string), NULL) - + DEFHOOK +(objc_declare_unresolved_class_reference, + "Declare that Objective C class @var{classname} is referenced\ + by the current TU.", + void, (const char *classname), + NULL) + +DEFHOOK +(objc_declare_class_definition, + "Declare that Objective C class @var{classname} is defined\ + by the current TU.", + void, (const char *classname), + NULL) + +DEFHOOK (string_object_ref_type_p, "If a target implements string objects then this hook should return\ @code{true} if @var{stringref} is a valid reference to such an object.", Index: gcc/doc/tm.texi.in =================================================================== --- gcc/doc/tm.texi.in (revision 188216) +++ gcc/doc/tm.texi.in (working copy) @@ -690,6 +690,10 @@ should use @code{TARGET_HANDLE_C_OPTION} instead. @hook TARGET_OBJC_CONSTRUCT_STRING_OBJECT +@hook TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE + +@hook TARGET_OBJC_DECLARE_CLASS_DEFINITION + @hook TARGET_STRING_OBJECT_REF_TYPE_P @hook TARGET_CHECK_STRING_OBJECT_FORMAT_ARG @@ -8163,20 +8167,6 @@ On systems where the assembler can handle quoted n macro to provide more human-readable names. @end defmac -@defmac ASM_DECLARE_CLASS_REFERENCE (@var{stream}, @var{name}) -A C statement (sans semicolon) to output to the stdio stream -@var{stream} commands to declare that the label @var{name} is an -Objective-C class reference. This is only needed for targets whose -linkers have special support for NeXT-style runtimes. -@end defmac - -@defmac ASM_DECLARE_UNRESOLVED_REFERENCE (@var{stream}, @var{name}) -A C statement (sans semicolon) to output to the stdio stream -@var{stream} commands to declare that the label @var{name} is an -unresolved Objective-C class reference. This is only needed for targets -whose linkers have special support for NeXT-style runtimes. -@end defmac - @node Initialization @subsection How Initialization Functions Are Handled @cindex initialization routines Index: gcc/doc/tm.texi =================================================================== --- gcc/doc/tm.texi (revision 188216) +++ gcc/doc/tm.texi (working copy) @@ -694,6 +694,14 @@ should use @code{TARGET_HANDLE_C_OPTION} instead. Targets may provide a string object type that can be used within and between C, C++ and their respective Objective-C dialects. A string object might, for example, embed encoding and length information. These objects are considered opaque to the compiler and handled as references. An ideal implementation makes the composition of the string object match that of the Objective-C @code{NSString} (@code{NXString} for GNUStep), allowing efficient interworking between C-only and Objective-C code. If a target implements string objects then this hook should return a reference to such an object constructed from the normal `C' string representation provided in @var{string}. At present, the hook is used by Objective-C only, to obtain a common-format string object when the target provides one. @end deftypefn +@deftypefn {C Target Hook} void TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE (const char *@var{classname}) +Declare that Objective C class @var{classname} is referenced by the current TU. +@end deftypefn + +@deftypefn {C Target Hook} void TARGET_OBJC_DECLARE_CLASS_DEFINITION (const char *@var{classname}) +Declare that Objective C class @var{classname} is defined by the current TU. +@end deftypefn + @deftypefn {C Target Hook} bool TARGET_STRING_OBJECT_REF_TYPE_P (const_tree @var{stringref}) If a target implements string objects then this hook should return @code{true} if @var{stringref} is a valid reference to such an object. @end deftypefn @@ -8258,20 +8266,6 @@ On systems where the assembler can handle quoted n macro to provide more human-readable names. @end defmac -@defmac ASM_DECLARE_CLASS_REFERENCE (@var{stream}, @var{name}) -A C statement (sans semicolon) to output to the stdio stream -@var{stream} commands to declare that the label @var{name} is an -Objective-C class reference. This is only needed for targets whose -linkers have special support for NeXT-style runtimes. -@end defmac - -@defmac ASM_DECLARE_UNRESOLVED_REFERENCE (@var{stream}, @var{name}) -A C statement (sans semicolon) to output to the stdio stream -@var{stream} commands to declare that the label @var{name} is an -unresolved Objective-C class reference. This is only needed for targets -whose linkers have special support for NeXT-style runtimes. -@end defmac - @node Initialization @subsection How Initialization Functions Are Handled @cindex initialization routines Index: gcc/config/darwin.h =================================================================== --- gcc/config/darwin.h (revision 188216) +++ gcc/config/darwin.h (working copy) @@ -613,8 +608,6 @@ int darwin_label_is_anonymous_local_objc_name (con fprintf (FILE, "\"%s\"", xname); \ else if (darwin_label_is_anonymous_local_objc_name (xname)) \ fprintf (FILE, "L%s", xname); \ - else if (!strncmp (xname, ".objc_class_name_", 17)) \ - fprintf (FILE, "%s", xname); \ else if (xname[0] != '"' && name_needs_quotes (xname)) \ asm_fprintf (FILE, "\"%U%s\"", xname); \ else \ @@ -697,29 +692,6 @@ extern GTY(()) section * darwin_sections[NUM_DARWI #undef TARGET_ASM_RELOC_RW_MASK #define TARGET_ASM_RELOC_RW_MASK machopic_reloc_rw_mask - -#define ASM_DECLARE_UNRESOLVED_REFERENCE(FILE,NAME) \ - do { \ - if (FILE) { \ - if (MACHOPIC_INDIRECT) \ - fprintf (FILE, "\t.lazy_reference "); \ - else \ - fprintf (FILE, "\t.reference "); \ - assemble_name (FILE, NAME); \ - fprintf (FILE, "\n"); \ - } \ - } while (0) - -#define ASM_DECLARE_CLASS_REFERENCE(FILE,NAME) \ - do { \ - if (FILE) { \ - fprintf (FILE, "\t"); \ - assemble_name (FILE, NAME); \ - fprintf (FILE, "=0\n"); \ - (*targetm.asm_out.globalize_label) (FILE, NAME); \ - } \ - } while (0) - /* Globalizing directive for a label. */ #define GLOBAL_ASM_OP "\t.globl " #define TARGET_ASM_GLOBALIZE_LABEL darwin_globalize_label Index: gcc/config/darwin-c.c =================================================================== --- gcc/config/darwin-c.c (revision 188216) +++ gcc/config/darwin-c.c (working copy) @@ -25,6 +25,7 @@ along with GCC; see the file COPYING3. If not see #include "tm.h" #include "cpplib.h" #include "tree.h" +#include "target.h" #include "incpath.h" #include "c-family/c-common.h" #include "c-family/c-pragma.h" @@ -36,6 +37,7 @@ along with GCC; see the file COPYING3. If not see #include "prefix.h" #include "c-family/c-target.h" #include "c-family/c-target-def.h" +#include "cgraph.h" /* Pragmas. */ @@ -711,13 +713,60 @@ EXPORTED_CONST format_kind_info darwin_additional_ } }; -#undef TARGET_HANDLE_C_OPTION + +/* Support routines to dump the class references for NeXT ABI v1, aka + 32-bits ObjC-2.0, as top-level asms. + The following two functions should only be called from + objc/objc-next-runtime-abi-01.c. */ + +static void +darwin_objc_declare_unresolved_class_reference (const char *name) +{ + const char *lazy_reference = ".lazy_reference\t"; + const char *hard_reference = ".reference\t"; + const char *reference = MACHOPIC_INDIRECT ? lazy_reference : hard_reference; + size_t len = strlen (reference) + strlen(name) + 2; + char *buf = (char *) alloca (len); + + gcc_checking_assert (!strncmp (name, ".objc_class_name_", 17)); + + snprintf (buf, len, "%s%s", reference, name); + add_asm_node (build_string (strlen (buf), buf)); +} + +static void +darwin_objc_declare_class_definition (const char *name) +{ + const char *xname = targetm.strip_name_encoding (name); + size_t len = strlen (xname) + 7 + 5; + char *buf = (char *) alloca (len); + + gcc_checking_assert (!strncmp (name, ".objc_class_name_", 17) + || !strncmp (name, "*.objc_category_name_", 21)); + + /* Mimic default_globalize_label. */ + snprintf (buf, len, ".globl\t%s", xname); + add_asm_node (build_string (strlen (buf), buf)); + + snprintf (buf, len, "%s = 0", xname); + add_asm_node (build_string (strlen (buf), buf)); +} + +#undef TARGET_HANDLE_C_OPTION #define TARGET_HANDLE_C_OPTION handle_c_option -#undef TARGET_OBJC_CONSTRUCT_STRING_OBJECT +#undef TARGET_OBJC_CONSTRUCT_STRING_OBJECT #define TARGET_OBJC_CONSTRUCT_STRING_OBJECT darwin_objc_construct_string -#undef TARGET_STRING_OBJECT_REF_TYPE_P +#undef TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE +#define TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE \ + darwin_objc_declare_unresolved_class_reference + +#undef TARGET_OBJC_DECLARE_CLASS_DEFINITION +#define TARGET_OBJC_DECLARE_CLASS_DEFINITION \ + darwin_objc_declare_class_definition + +#undef TARGET_STRING_OBJECT_REF_TYPE_P #define TARGET_STRING_OBJECT_REF_TYPE_P darwin_cfstring_ref_p #undef TARGET_CHECK_STRING_OBJECT_FORMAT_ARG Index: gcc/objc/objc-next-runtime-abi-01.c =================================================================== --- gcc/objc/objc-next-runtime-abi-01.c (revision 188216) +++ gcc/objc/objc-next-runtime-abi-01.c (working copy) @@ -26,7 +26,6 @@ along with GCC; see the file COPYING3. If not see #include "config.h" #include "system.h" #include "coretypes.h" -#include "tm.h" #include "tree.h" #ifdef OBJCPLUS @@ -49,7 +48,7 @@ along with GCC; see the file COPYING3. If not see #include "ggc.h" #include "target.h" -#include "output.h" /* for asm_out_file */ +#include "c-family/c-target.h" #include "tree-iterator.h" #include "objc-runtime-hooks.h" @@ -2267,47 +2266,50 @@ generate_objc_symtab_decl (void) init_objc_symtab (TREE_TYPE (UOBJC_SYMBOLS_decl))); } +/* Any target implementing NeXT ObjC m32 ABI has to ensure that objects + refer to, and define, symbols that enforce linkage of classes into the + executable image, preserving unix archive semantics. + At present (4.8), the only targets implementing this are Darwin; these + use top level asms to implement a scheme (see config/darwin-c.c). The + latter method is a hack, but compatible with LTO see also PR48109 for + further discussion and other possible methods. */ + static void -handle_next_class_ref (tree chain) +handle_next_class_ref (tree chain ATTRIBUTE_UNUSED) { - const char *name = IDENTIFIER_POINTER (TREE_VALUE (chain)); - char *string = (char *) alloca (strlen (name) + 30); - - sprintf (string, ".objc_class_name_%s", name); - -#ifdef ASM_DECLARE_UNRESOLVED_REFERENCE - ASM_DECLARE_UNRESOLVED_REFERENCE (asm_out_file, string); -#else - return ; /* NULL build for targets other than Darwin. */ -#endif + if (targetcm.objc_declare_unresolved_class_reference) + { + const char *name = IDENTIFIER_POINTER (TREE_VALUE (chain)); + char *string = (char *) alloca (strlen (name) + 30); + sprintf (string, ".objc_class_name_%s", name); + targetcm.objc_declare_unresolved_class_reference (string); + } } static void -handle_next_impent (struct imp_entry *impent) +handle_next_impent (struct imp_entry *impent ATTRIBUTE_UNUSED) { - char buf[BUFSIZE]; + if (targetcm.objc_declare_class_definition) + { + char buf[BUFSIZE]; - switch (TREE_CODE (impent->imp_context)) - { - case CLASS_IMPLEMENTATION_TYPE: - snprintf (buf, BUFSIZE, ".objc_class_name_%s", - IDENTIFIER_POINTER (CLASS_NAME (impent->imp_context))); - break; - case CATEGORY_IMPLEMENTATION_TYPE: - snprintf (buf, BUFSIZE, "*.objc_category_name_%s_%s", - IDENTIFIER_POINTER (CLASS_NAME (impent->imp_context)), - IDENTIFIER_POINTER (CLASS_SUPER_NAME (impent->imp_context))); - break; - default: - return; + switch (TREE_CODE (impent->imp_context)) + { + case CLASS_IMPLEMENTATION_TYPE: + snprintf (buf, BUFSIZE, ".objc_class_name_%s", + IDENTIFIER_POINTER (CLASS_NAME (impent->imp_context))); + break; + case CATEGORY_IMPLEMENTATION_TYPE: + snprintf (buf, BUFSIZE, "*.objc_category_name_%s_%s", + IDENTIFIER_POINTER (CLASS_NAME (impent->imp_context)), + IDENTIFIER_POINTER (CLASS_SUPER_NAME (impent->imp_context))); + break; + default: + return; + } + targetcm.objc_declare_class_definition (buf); } - -#ifdef ASM_DECLARE_CLASS_REFERENCE - ASM_DECLARE_CLASS_REFERENCE (asm_out_file, buf); -#else - return ; /* NULL build for targets other than Darwin. */ -#endif } static void @@ -2414,9 +2416,7 @@ objc_generate_v1_next_metadata (void) /* Dump the class references. This forces the appropriate classes to be linked into the executable image, preserving unix archive - semantics. This can be removed when we move to a more dynamically - linked environment. */ - + semantics. */ for (chain = cls_ref_chain; chain; chain = TREE_CHAIN (chain)) { handle_next_class_ref (chain);