c-common.c (handle_used_attribute): Set DECL_PRESERVE_P.
authorDevang Patel <dpatel@apple.com>
Mon, 16 Aug 2004 20:54:43 +0000 (13:54 -0700)
committerDevang Patel <dpatel@gcc.gnu.org>
Mon, 16 Aug 2004 20:54:43 +0000 (13:54 -0700)
        * c-common.c (handle_used_attribute): Set DECL_PRESERVE_P.
        * print-tree.c (print_node): Print DECL_PRESERVE_P.
        * target-def.h (TARGET_ASM_MARK_DECL_PRESERVED): New #define.
        (TARGET_ASM_OUT): New member, TARGET_ASM_MARK_DECL_PRESERVED
        * target.h (struct gcc_target): New member, mark_decl_preserved.
        * hooks.c (hook_void_charptr): Rename to ...
        (hook_void_constcharptr): ... new name.
        * hooks.h (hook_void_charptr): Rename to ..
        (hook_void_constcharptr): ... new name.
        * tree.h (DECL_PRESERVE_P): New #define.
        (struct tree_decl): New member, preserve_flag.
        * varasm.c (assemble_start_function): Mark decl preserved.
        (assemble_variable): Same.
        * darwin.c (darwin_mark_decl_preserved): New function.
        * darwin.h (TARGET_ASM_MARK_DECL_preserved): New #define.
        * darwin-protos.h (darwin_mark_decl_preserved): New decl.
        * doc/tm.texi (TARGET_ASM_MARK_DECL_PRESERVED): Document.

        testsuite:
        * gcc.dg/darwin-20040809-1.c: New test.

From-SVN: r86076

15 files changed:
gcc/ChangeLog
gcc/c-common.c
gcc/config/darwin-protos.h
gcc/config/darwin.c
gcc/config/darwin.h
gcc/doc/tm.texi
gcc/hooks.c
gcc/hooks.h
gcc/print-tree.c
gcc/target-def.h
gcc/target.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/darwin-20040812-1.c [new file with mode: 0644]
gcc/tree.h
gcc/varasm.c

index 991177702ab68324b15e8711f94b8a2d7389f283..30928e1f89a1e9fb7db88d0cc8e6d430e8a265d2 100644 (file)
@@ -1,3 +1,23 @@
+2004-08-16  Devang Patel  <dpatel@apple.com>
+
+       * c-common.c (handle_used_attribute): Set DECL_PRESERVE_P.
+       * print-tree.c (print_node): Print DECL_PRESERVE_P.
+       * target-def.h (TARGET_ASM_MARK_DECL_PRESERVED): New #define.
+       (TARGET_ASM_OUT): New member, TARGET_ASM_MARK_DECL_PRESERVED
+       * target.h (struct gcc_target): New member, mark_decl_preserved.
+        * hooks.c (hook_void_charptr): Rename to ...
+        (hook_void_constcharptr): ... new name.
+        * hooks.h (hook_void_charptr): Rename to ..
+        (hook_void_constcharptr): ... new name.
+       * tree.h (DECL_PRESERVE_P): New #define.
+       (struct tree_decl): New member, preserve_flag.
+       * varasm.c (assemble_start_function): Mark decl preserved.
+       (assemble_variable): Same.
+       * darwin.c (darwin_mark_decl_preserved): New function.
+       * darwin.h (TARGET_ASM_MARK_DECL_preserved): New #define.
+       * darwin-protos.h (darwin_mark_decl_preserved): New decl.
+       * doc/tm.texi (TARGET_ASM_MARK_DECL_PRESERVED): Document.
+
 2004-08-16  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        * c-decl.c (grokdeclarator): Allow for function definition where
index f66341d883a41c6e81eec6099dd2b9207d6922e2..4c7eb21e049d8f50422d2f6352fa10a42b698ed3 100644 (file)
@@ -4078,6 +4078,7 @@ handle_used_attribute (tree *pnode, tree name, tree ARG_UNUSED (args),
       || (TREE_CODE (node) == VAR_DECL && TREE_STATIC (node)))
     {
       TREE_USED (node) = 1;
+      DECL_PRESERVE_P (node) = 1;
     }
   else
     {
index d2d90049264e05e704ea014cfb9f798d3b57ef9a..a5ae08e24998a41196f026da996775a1980d74c1 100644 (file)
@@ -82,6 +82,7 @@ extern void darwin_pragma_unused (struct cpp_reader *);
 extern void darwin_file_end (void);
 
 extern void darwin_make_decl_one_only (tree decl);
+extern void darwin_mark_decl_preserved (const char *);
 
 /* Expanded by EXTRA_SECTION_FUNCTIONS into varasm.o.  */
 extern void const_section (void);
index 9f47dc4607c246dd7a9badd1bef0f683e8412f7d..14101f6c72eb8d4146894622b8b2bc49b25ed7cf 100644 (file)
@@ -913,6 +913,14 @@ darwin_make_decl_one_only (tree decl)
   DECL_SECTION_NAME (decl) = build_string (strlen (sec), sec);
 }
 
+void
+darwin_mark_decl_preserved (const char *name)
+{
+  fprintf (asm_out_file, ".no_dead_strip ");
+  assemble_name (asm_out_file, name);
+  fputc ('\n', asm_out_file);
+}
+
 void
 machopic_select_section (tree exp, int reloc,
                         unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
index 488081bd3f43a9265d107f46f03217f6499965eb..311c16114592de609f3c84bdd486fd52c07a5325 100644 (file)
@@ -799,6 +799,9 @@ objc_section_init (void)                    \
 #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)  \
   sprintf (LABEL, "*%s%ld", PREFIX, (long)(NUM))
 
+#undef TARGET_ASM_MARK_DECL_PRESERVED
+#define TARGET_ASM_MARK_DECL_PRESERVED darwin_mark_decl_preserved
+
 /* Since we have a separate readonly data section, define this so that
    jump tables end up in text rather than data.  */
 
index f43e0358d2a9369a5ec0e8f6bf65d266a743fe10..03e0c4a17b224e070d32670f40c4ab3df7b88cc1 100644 (file)
@@ -6804,6 +6804,12 @@ pseudo-op to declare a library function name external.  The name of the
 library function is given by @var{symref}, which is a @code{symbol_ref}.
 @end deftypefn
 
+@deftypefn {Target Hook} void TARGET_ASM_MARK_DECL_PRESERVED (tree @var{decl})
+This target hook is a function to output to @var{asm_out_file} an assembler
+directive to annotate used symbol.  Darwin target use .no_dead_code_strip
+directive.
+@end deftypefn
+
 @defmac ASM_OUTPUT_LABELREF (@var{stream}, @var{name})
 A C statement (sans semicolon) to output to the stdio stream
 @var{stream} a reference in assembler syntax to a label named
index 1fafe1f12f8f01f1a43d22c60fc384d22a7f7810..111b9dcb2534380acc76b85c6bbe9a38715a7694 100644 (file)
@@ -142,7 +142,7 @@ hook_void_tree (tree a ATTRIBUTE_UNUSED)
 }
 
 void
-hook_void_charptr (char *a ATTRIBUTE_UNUSED)
+hook_void_constcharptr (const char *a ATTRIBUTE_UNUSED)
 {
 }
 
index fea78c79e87dfdb5cb71e613c92b665662051834..6b5fda8f9f2068bd9f932a768b036069690085c3 100644 (file)
@@ -37,7 +37,7 @@ extern bool hook_bool_constcharptr_size_t_false (const char *, size_t);
 
 extern void hook_void_void (void);
 extern void hook_void_int (int);
-extern void hook_void_charptr (char *);
+extern void hook_void_constcharptr (const char *);
 extern void hook_void_FILEptr_constcharptr (FILE *, const char *);
 extern void hook_void_tree (tree);
 extern void hook_void_tree_treeptr (tree, tree *);
index 3944842635da0f7d675960d8133b85972e511da8..829e2c9f3026651904ebd1177d4020856632fe32 100644 (file)
@@ -353,6 +353,9 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
       if (DECL_DEFER_OUTPUT (node))
        fputs (" defer-output", file);
 
+      if (DECL_PRESERVE_P (node))
+       fputs (" preserve", file);
+
       if (DECL_LANG_FLAG_0 (node))
        fputs (" decl_0", file);
       if (DECL_LANG_FLAG_1 (node))
index 7180a3e1f6724be3da3be3cd2a9c135848fe007a..15dc0c9402013f8131b531dd3e515ed28e76bdb6 100644 (file)
@@ -183,6 +183,10 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 #define TARGET_ASM_EXTERNAL_LIBCALL default_external_libcall
 #endif
 
+#ifndef TARGET_ASM_MARK_DECL_PRESERVED
+#define TARGET_ASM_MARK_DECL_PRESERVED hook_void_constcharptr
+#endif
+
 #define TARGET_ASM_ALIGNED_INT_OP                              \
                       {TARGET_ASM_ALIGNED_HI_OP,               \
                        TARGET_ASM_ALIGNED_SI_OP,               \
@@ -223,7 +227,8 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
                         TARGET_ASM_CAN_OUTPUT_MI_THUNK,         \
                         TARGET_ASM_FILE_START,                  \
                         TARGET_ASM_FILE_END,                   \
-                       TARGET_ASM_EXTERNAL_LIBCALL}
+                       TARGET_ASM_EXTERNAL_LIBCALL,            \
+                        TARGET_ASM_MARK_DECL_PRESERVED}
 
 /* Scheduler hooks.  All of these default to null pointers, which
    haifa-sched.c looks for and handles.  */
index ad37161bc48ea2de7b70e95bbbf0db51116c956a..1611f2a61dcd373325d623acdfb97f72b4ddd72b 100644 (file)
@@ -172,6 +172,11 @@ struct gcc_target
     /* Output an assembler pseudo-op to declare a library function name
        external.  */
     void (*external_libcall) (rtx);
+
+     /* Output an assembler directive to mark decl live. This instructs
+       linker to not dead code strip this symbol.  */
+    void (*mark_decl_preserved) (const char *);
+
   } asm_out;
 
   /* Functions relating to instruction scheduling.  */
index 80561d3ad0d9c7d12c867a5ee53c2cd1381403d8..319fe1da9ec1b7f1b2651efa9b70af914c6c6bab 100644 (file)
@@ -1,3 +1,7 @@
+2004-08-16  Devang Patel  <dpatel@apple.com>
+
+       * gcc.dg/darwin-20040809-1.c: New test.
+       
 2004-08-16  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        * gcc.dg/funcdef-attr-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/darwin-20040812-1.c b/gcc/testsuite/gcc.dg/darwin-20040812-1.c
new file mode 100644 (file)
index 0000000..9b2b794
--- /dev/null
@@ -0,0 +1,24 @@
+/* Test dead code strip support.  */
+/* Contributed by Devang Patel  <dpatel@apple.com>  */
+/* { dg-do compile } */
+
+const char my_version_string[] __attribute__((__used__))
+  = "Do not remove this string\n";
+ static int
+ __attribute__((__used__))
+      static_debug_routine()
+{
+   int i;
+   i = 42;
+}
+int
+main ()
+{
+   return 0;
+}
+/* { dg-final { scan-assembler ".no_dead_strip _my_version_string" } } */
+/* { dg-final { scan-assembler ".no_dead_strip _static_debug_routine" } } */
index a0cc1361133c0e27f15ec17923a9b96c22ac65cb..ff03d9c7aa63812488d78c9a4ec630c30ffb4385 100644 (file)
@@ -2165,6 +2165,11 @@ struct tree_binfo GTY (())
 #define DECL_POSSIBLY_INLINED(DECL) \
   FUNCTION_DECL_CHECK (DECL)->decl.possibly_inlined
 
+/* Nonzero for a decl that is decorated using attribute used.
+   This indicates compiler tools that this decl needs to be preserved.  */
+#define DECL_PRESERVE_P(DECL) \
+  DECL_CHECK (DECL)->decl.preserve_flag
+
 /* Enumerate visibility settings.  */
 #ifndef SYMBOL_VISIBILITY_DEFINED
 #define SYMBOL_VISIBILITY_DEFINED
@@ -2232,7 +2237,8 @@ struct tree_decl GTY(())
   unsigned lang_flag_7 : 1;
 
   unsigned possibly_inlined : 1;
-  /* 15 unused bits.  */
+  unsigned preserve_flag: 1;
+  /* 13 unused bits.  */
 
   union tree_decl_u1 {
     /* In a FUNCTION_DECL for which DECL_BUILT_IN holds, this is
index afbde92f11e686b84db7766663703868a63ef602..5dbcb228038f39e65574a166965520ee238335f8 100644 (file)
@@ -1222,6 +1222,9 @@ assemble_start_function (tree decl, const char *fnname)
       maybe_assemble_visibility (decl);
     }
 
+  if (DECL_PRESERVE_P (decl))
+    targetm.asm_out.mark_decl_preserved (fnname);
+
   /* Do any machine/system dependent processing of the function name.  */
 #ifdef ASM_DECLARE_FUNCTION_NAME
   ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl);
@@ -1562,6 +1565,9 @@ assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED,
   if (TREE_PUBLIC (decl))
     maybe_assemble_visibility (decl);
 
+  if (DECL_PRESERVE_P (decl))
+    targetm.asm_out.mark_decl_preserved (name);
+
   /* Output any data that we will need to use the address of.  */
   if (DECL_INITIAL (decl) == error_mark_node)
     reloc = contains_pointers_p (TREE_TYPE (decl)) ? 3 : 0;