Index: gcc/gcc/config/alpha/elf.h |
diff --git a/gcc/gcc/config/alpha/elf.h b/gcc/gcc/config/alpha/elf.h |
index 0e5265c6472d41d859117143d3ca1b73a2b9ad4b..57ab91e2f3cb0c7bfd56d553310d975241fef71d 100644 |
--- a/gcc/gcc/config/alpha/elf.h |
+++ b/gcc/gcc/config/alpha/elf.h |
@@ -1,6 +1,6 @@ |
/* Definitions of target machine for GNU compiler, for DEC Alpha w/ELF. |
- Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2007, 2008 |
- Free Software Foundation, Inc. |
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2007, 2008, |
+ 2009, 2010 Free Software Foundation, Inc. |
Contributed by Richard Henderson (rth@tamu.edu). |
This file is part of GCC. |
@@ -142,18 +142,20 @@ do { \ |
ASM_OUTPUT_ALIGNED_LOCAL (FILE, NAME, SIZE, ALIGN); \ |
} while (0) |
-/* Biggest alignment supported by the object file format of this |
- machine. Use this macro to limit the alignment which can be |
- specified using the `__attribute__ ((aligned (N)))' construct. If |
- not defined, the default value is `BIGGEST_ALIGNMENT'. |
+/* The biggest alignment supported by ELF in bits. 32-bit ELF |
+ supports section alignment up to (0x80000000 * 8), while |
+ 64-bit ELF supports (0x8000000000000000 * 8). If this macro |
+ is not defined, the default is the largest alignment supported |
+ by 32-bit ELF and representable on a 32-bit host. Use this |
+ macro to limit the alignment which can be specified using |
+ the `__attribute__ ((aligned (N)))' construct. |
This value is really 2^63. Since gcc figures the alignment in bits, |
we could only potentially get to 2^60 on suitable hosts. Due to other |
considerations in varasm, we must restrict this to what fits in an int. */ |
#undef MAX_OFILE_ALIGNMENT |
-#define MAX_OFILE_ALIGNMENT \ |
- (1 << (HOST_BITS_PER_INT < 64 ? HOST_BITS_PER_INT - 2 : 62)) |
+#define MAX_OFILE_ALIGNMENT (((unsigned int) 1 << 28) * 8) |
/* This is the pseudo-op used to generate a contiguous sequence of byte |
values from a double-quoted string WITHOUT HAVING A TERMINATING NUL |
@@ -270,20 +272,38 @@ do { \ |
/* Write the extra assembler code needed to declare an object properly. */ |
+#ifdef HAVE_GAS_GNU_UNIQUE_OBJECT |
+#define USE_GNU_UNIQUE_OBJECT 1 |
+#else |
+#define USE_GNU_UNIQUE_OBJECT 0 |
+#endif |
+ |
#undef ASM_DECLARE_OBJECT_NAME |
-#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \ |
- do { \ |
- HOST_WIDE_INT size; \ |
- ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \ |
- size_directive_output = 0; \ |
- if (!flag_inhibit_size_directive \ |
- && DECL_SIZE (DECL) \ |
- && (size = int_size_in_bytes (TREE_TYPE (DECL))) > 0) \ |
- { \ |
- size_directive_output = 1; \ |
- ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, size); \ |
- } \ |
- ASM_OUTPUT_LABEL(FILE, NAME); \ |
+#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \ |
+ do { \ |
+ HOST_WIDE_INT size; \ |
+ \ |
+ /* For template static data member instantiations or \ |
+ inline fn local statics and their guard variables, use \ |
+ gnu_unique_object so that they will be combined even under \ |
+ RTLD_LOCAL. Don't use gnu_unique_object for typeinfo, \ |
+ vtables and other read-only artificial decls. */ \ |
+ if (USE_GNU_UNIQUE_OBJECT && DECL_ONE_ONLY (DECL) \ |
+ && (!DECL_ARTIFICIAL (DECL) || !TREE_READONLY (DECL))) \ |
+ ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "gnu_unique_object"); \ |
+ else \ |
+ ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \ |
+ \ |
+ size_directive_output = 0; \ |
+ if (!flag_inhibit_size_directive \ |
+ && (DECL) && DECL_SIZE (DECL)) \ |
+ { \ |
+ size_directive_output = 1; \ |
+ size = int_size_in_bytes (TREE_TYPE (DECL)); \ |
+ ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, size); \ |
+ } \ |
+ \ |
+ ASM_OUTPUT_LABEL (FILE, NAME); \ |
} while (0) |
/* Output the size directive for a decl in rest_of_decl_compilation |