OSDN Git Service

PR target/33120
authormrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 23 Mar 2010 20:02:57 +0000 (20:02 +0000)
committerMasaki Muranaka <monaka@monami-software.com>
Sun, 23 May 2010 00:33:47 +0000 (09:33 +0900)
* config/darwin.h (ASM_OUTPUT_ALIGNED_BSS): Add.
* config/darwin.c (darwin_output_aligned_bss): Add.
* config/darwin-protos.h: Add darwin_output_aligned_bss.

testsuite:
* g++.dg/ext/instantiate2.C: Update for .zerofill as it doesn't
follow the usual conventions for symbol definitions.
* gcc.target/i386/darwin-zerofill.c: Add.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157677 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/darwin-protos.h
gcc/config/darwin.c
gcc/config/darwin.h
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/instantiate2.C
gcc/testsuite/gcc.target/i386/darwin-zerofill.c [new file with mode: 0644]

index bd91922..0d5f1a5 100644 (file)
@@ -1,3 +1,10 @@
+2010-03-23  Mike Stump  <mikestump@comcast.net>
+
+       PR target/33120
+       * config/darwin.h (ASM_OUTPUT_ALIGNED_BSS): Add.
+       * config/darwin.c (darwin_output_aligned_bss): Add.
+       * config/darwin-protos.h: Add darwin_output_aligned_bss.
+
 2010-03-23  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR rtl-optimization/43413
index 5886f01..9847310 100644 (file)
@@ -93,3 +93,6 @@ extern void darwin_asm_output_anchor (rtx symbol);
 extern bool darwin_kextabi_p (void);
 extern void darwin_override_options (void);
 extern void darwin_patch_builtins (void);
+extern void darwin_output_aligned_bss (FILE *, tree, const char *,
+                                      unsigned HOST_WIDE_INT size,
+                                      unsigned int align);
index eba0329..455d0bd 100644 (file)
@@ -1916,5 +1916,41 @@ darwin_patch_builtins (void)
 #undef PATCH_BUILTIN_VARIADIC
 }
 
+void
+darwin_output_aligned_bss(FILE *fp, tree decl, const char *name,
+                         unsigned HOST_WIDE_INT size, unsigned int align)
+{
+  bool weak = (DECL_P (decl)
+              && DECL_WEAK (decl)
+              && !lookup_attribute ("weak_import",
+                                    DECL_ATTRIBUTES (decl)));
+  if (size == 0)
+    size = 1;
+  align = floor_log2 (align / BITS_PER_UNIT);
+  if (DECL_ONE_ONLY (decl) || weak) {
+    if (TREE_READONLY (decl) || TREE_CONSTANT (decl))
+      switch_to_section (darwin_sections[const_data_coal_section]);
+    else
+      switch_to_section (darwin_sections[data_coal_section]);
+    ASM_OUTPUT_ALIGN (fp, align);
+    ASM_DECLARE_OBJECT_NAME (fp, name, decl);
+    ASM_OUTPUT_SKIP (fp, size);
+    return;
+  }
+
+  fputs (".zerofill ", fp);
+  /* We uniquely name sections based upon the alignment as otherwise
+     all symbols in the section would get that alignment.  */
+  if (TREE_READONLY (decl) || TREE_CONSTANT (decl))
+    fputs ("__TEXT, ", fp);
+  else
+    fputs ("__DATA, ", fp);
+  fprintf (fp, "__bss%d, ", align);
+  assemble_name (fp, name);
+  fprintf (fp, ", "HOST_WIDE_INT_PRINT_UNSIGNED", %u\n",
+          size, align);
+  (* targetm.encode_section_info) (decl, DECL_RTL (decl), false);
+  machopic_define_symbol (DECL_RTL (decl));
+}
 
 #include "gt-darwin.h"
index a0a4974..8a2b1c0 100644 (file)
@@ -739,6 +739,9 @@ int darwin_label_is_anonymous_local_objc_name (const char *name);
       }                                                                        \
   } while (0)
 
+#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN)          \
+  darwin_output_aligned_bss(FILE, DECL, NAME, SIZE, ALIGN)
+
 /* The maximum alignment which the object file format can support in
    bits.  For Mach-O, this is 2^15 bytes.  */
 
index e01b7ad..4dd6d08 100644 (file)
@@ -1,3 +1,10 @@
+2010-03-23  Mike Stump  <mikestump@comcast.net>
+
+       PR target/33120
+       * g++.dg/ext/instantiate2.C: Update for .zerofill as it doesn't
+       follow the usual conventions for symbol definitions.
+       * gcc.target/i386/darwin-zerofill.c: Add.
+
 2010-03-22  Jason Merrill  <jason@redhat.com>
 
        PR c++/43333
index 97ef45c..02a54fe 100644 (file)
@@ -8,7 +8,8 @@ template <class T> struct A {
 template <class T> T A<T>::t = 0;
 static template struct A<int>;
 
-// { dg-final { scan-assembler "\n_?_ZN1AIiE1tE(:|\n|\t)" } }
+// { dg-final { scan-assembler "\n_?_ZN1AIiE1tE(:|\n|\t)" { target { ! *-apple-darwin* } } } }
+// { dg-final { scan-assembler ".zerofill __DATA, __bss2, __ZN1AIiE1tE" { target *-apple-darwin* } } }
 void test_int() { A<int>::t = 42; }
 
 // { dg-final { scan-assembler-not "\n_?_ZN1AIcE1tE(:|\n|\t)" } }
diff --git a/gcc/testsuite/gcc.target/i386/darwin-zerofill.c b/gcc/testsuite/gcc.target/i386/darwin-zerofill.c
new file mode 100644 (file)
index 0000000..7322134
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile { target i?86-apple-darwin* x86_64-apple-darwin* } } */
+/* { dg-options "-fno-common" } */
+
+/* { dg-final { scan-assembler ".zerofill __DATA, __bss11, _ji, 4000000, 11" } } */
+/* { dg-final { scan-assembler ".zerofill __TEXT, __bss8, _cj, 4000000, 8" } } */
+/* PR33120 */
+
+int ji[1000000] __attribute((aligned(2048)));
+const int cj[1000000] __attribute((aligned(256)));