Imported Upstream version 4.8.1
[platform/upstream/gcc48.git] / gcc / config / rs6000 / xcoff.h
index e5c4782..512bcb5 100644 (file)
@@ -1,7 +1,6 @@
 /* Definitions of target machine for GNU compiler,
    for some generic XCOFF file format
-   Copyright (C) 2001, 2002, 2003, 2004, 2007, 2008
-   Free Software Foundation, Inc.
+   Copyright (C) 2001-2013 Free Software Foundation, Inc.
 
    This file is part of GCC.
 
@@ -98,6 +97,9 @@
 #define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
 #define TARGET_STRIP_NAME_ENCODING  rs6000_xcoff_strip_name_encoding
 #define TARGET_SECTION_TYPE_FLAGS  rs6000_xcoff_section_type_flags
+#ifdef HAVE_AS_TLS
+#define TARGET_ENCODE_SECTION_INFO rs6000_xcoff_encode_section_info
+#endif
 
 /* FP save and restore routines.  */
 #define        SAVE_FP_PREFIX "._savef"
        RS6000_OUTPUT_BASENAME ((FILE), (NAME));                \
        if ((ALIGN) > 32)                               \
         fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", (SIZE), \
-                 exact_log2 ((ALIGN) / BITS_PER_UNIT)); \
+                 floor_log2 ((ALIGN) / BITS_PER_UNIT)); \
        else if ((SIZE) > 4)                            \
          fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",3\n", (SIZE)); \
        else                                            \
 
 /* This says how to output an assembler line
    to define a local common symbol.
-   Alignment cannot be specified, but we can try to maintain
+   The assembler in AIX 6.1 and later supports an alignment argument.
+   For earlier releases of AIX, we try to maintain
    alignment after preceding TOC section if it was aligned
    for 64-bit mode.  */
 
 #define LOCAL_COMMON_ASM_OP "\t.lcomm "
 
+#if TARGET_AIX_VERSION >= 61
+#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)      \
+  do { fputs (LOCAL_COMMON_ASM_OP, (FILE));                    \
+       RS6000_OUTPUT_BASENAME ((FILE), (NAME));                        \
+       if ((ALIGN) > 32)                                       \
+        fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%s,%u\n",    \
+                 (SIZE), xcoff_bss_section_name,                       \
+                 floor_log2 ((ALIGN) / BITS_PER_UNIT));                \
+       else if ((SIZE) > 4)                                    \
+        fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%s,3\n",     \
+                 (SIZE), xcoff_bss_section_name);              \
+       else                                                    \
+        fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%s\n",       \
+                 (SIZE), xcoff_bss_section_name);              \
+     } while (0)
+#endif
+
 #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)    \
   do { fputs (LOCAL_COMMON_ASM_OP, (FILE));            \
        RS6000_OUTPUT_BASENAME ((FILE), (NAME));                \
                xcoff_bss_section_name);                \
      } while (0)
 
+#ifdef HAVE_AS_TLS
+#define ASM_OUTPUT_TLS_COMMON(FILE, DECL, NAME, SIZE)  \
+  do { fputs(COMMON_ASM_OP, (FILE));                   \
+       RS6000_OUTPUT_BASENAME ((FILE), (NAME));                \
+       fprintf ((FILE), "[UL],"HOST_WIDE_INT_PRINT_UNSIGNED"\n", \
+       (SIZE));                                                \
+  } while (0)
+#endif
+
 /* This is how we tell the assembler that two symbols have the same value.  */
 #define SET_ASM_OP "\t.set "