flags.h (g_switch_value, [...]): Declare.
authorRichard Henderson <rth@cygnus.com>
Wed, 25 Feb 1998 00:00:29 +0000 (16:00 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 25 Feb 1998 00:00:29 +0000 (16:00 -0800)
        * flags.h (g_switch_value, g_switch_set): Declare.
        * alpha.c (override_options): Set g_switch_value=8 if not set.
        * alpha/elf.h (CC1_SPEC): New.
        (ASM_SPEC): New.
        (LINK_SPEC): Pass along the -G value we were given.
        (LOCAL_ASM_OP): Remove.
        (ASM_OUTPUT_ALIGNED_LOCAL): Output to .bss or .sbss by size.
        (MAX_OFILE_ALIGNMENT): New.
        (BSS_SECTION_ASM_OP, SBSS_SECTION_ASM_OP, SDATA_SECTION_ASM_OP): New.
        (EXTRA_SECTIONS): Add sbss and sdata.
        (SECTION_FUNCTION_TEMPLATE): New.
        (EXTRA_SECTION_FUNCTIONS): Use it.
        (CTORS_SECTION_FUNCTION, DTORS_SECTION_FUNCTION): Remove.
        (SELECT_SECTION): Use sdata when small enough.
        * alpha/linux.h (ASM_SPEC): Remove.

From-SVN: r18225

gcc/ChangeLog
gcc/config/alpha/alpha.c
gcc/config/alpha/elf.h
gcc/config/alpha/linux.h
gcc/flags.h

index a3e6b15e808a53a9c2fca25de929901ee2c6ff24..847eb3ebea6965c441a69f1e3ae9107a247aa701 100644 (file)
@@ -1,3 +1,22 @@
+Tue Feb 24 23:54:07 1998  Richard Henderson  <rth@cygnus.com>
+
+       * flags.h (g_switch_value, g_switch_set): Declare.
+       * alpha.c (override_options): Set g_switch_value=8 if not set.
+       * alpha/elf.h (CC1_SPEC): New.
+       (ASM_SPEC): New.
+       (LINK_SPEC): Pass along the -G value we were given.
+       (LOCAL_ASM_OP): Remove.
+       (ASM_OUTPUT_ALIGNED_LOCAL): Output to .bss or .sbss by size.
+       (MAX_OFILE_ALIGNMENT): New.
+       (BSS_SECTION_ASM_OP, SBSS_SECTION_ASM_OP, SDATA_SECTION_ASM_OP): New.
+       (EXTRA_SECTIONS): Add sbss and sdata.
+       (SECTION_FUNCTION_TEMPLATE): New.
+       (EXTRA_SECTION_FUNCTIONS): Use it.
+       (CTORS_SECTION_FUNCTION, DTORS_SECTION_FUNCTION): Remove.
+       (SELECT_SECTION): Use sdata when small enough.
+       * alpha/linux.h (ASM_SPEC): Remove.
+       
+
 Mon Feb 23 15:09:18 1998  Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de>
         * config.sub (sco5): Fix typo.
 
index 561a8eb580a263304c9a42d0b59ef02020f584f7..171b311e201cbb3f7b74c126e653d24ef28f9e11 100644 (file)
@@ -301,6 +301,10 @@ override_options ()
 
     alpha_memory_latency = lat;
   }
+
+  /* Default the definition of "small data" to 8 bytes.  */
+  if (!g_switch_set)
+    g_switch_value = 8;
 }
 \f
 /* Returns 1 if VALUE is a mask that contains full bytes of zero or ones.  */
index 8d9b76e132b8899411652d850206e2f1366b415b..04bd3350be922b35e06ea7e9a968cf87fef2b7b1 100644 (file)
@@ -30,8 +30,15 @@ Boston, MA 02111-1307, USA.    */
 
 #undef ASM_FINAL_SPEC
 
+#undef CC1_SPEC
+#define CC1_SPEC  "%{G*}"
+
+#undef ASM_SPEC
+#define ASM_SPEC  "%{G*} %{relax:-relax}"
+
 #undef LINK_SPEC
-#define LINK_SPEC "-m elf64alpha -G 8 %{O*:-O3} %{!O*:-O1}     \
+#define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax}         \
+  %{O*:-O3} %{!O*:-O1}                                         \
   %{shared:-shared}                                            \
   %{!shared:                                                   \
     %{!static:                                                 \
@@ -142,15 +149,27 @@ do {                                                                      \
    the linker seems to want the alignment of data objects
    to depend on their types.  We do exactly that here.  */
 
-#define LOCAL_ASM_OP   ".local"
-
 #undef ASM_OUTPUT_ALIGNED_LOCAL
 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)              \
 do {                                                                   \
-  fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP);                            \
-  assemble_name ((FILE), (NAME));                                      \
-  fprintf ((FILE), "\n");                                              \
-  ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN);                 \
+  if ((SIZE) <= g_switch_value)                                                \
+    sbss_section();                                                    \
+  else                                                                 \
+    bss_section();                                                     \
+  fprintf (FILE, "\t%s\t ", TYPE_ASM_OP);                              \
+  assemble_name (FILE, NAME);                                          \
+  putc (',', FILE);                                                    \
+  fprintf (FILE, TYPE_OPERAND_FMT, "object");                          \
+  putc ('\n', FILE);                                                   \
+  if (!flag_inhibit_size_directive)                                    \
+    {                                                                  \
+      fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);                          \
+      assemble_name (FILE, NAME);                                      \
+      fprintf (FILE, ",%d\n", (SIZE));                                 \
+    }                                                                  \
+  ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT));      \
+  ASM_OUTPUT_LABEL(FILE, NAME);                                                \
+  ASM_OUTPUT_SKIP((FILE), (SIZE));                                     \
 } while (0)
 
 /* This is the pseudo-op used to generate a 64-bit word of data with a
@@ -158,6 +177,18 @@ do {                                                                       \
 
 #define INT_ASM_OP             ".quad"
 
+/* 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'. 
+
+   This value is really 2^63.  Since gcc figures the alignment in bits,
+   we could only potentially get to 2^60 on suitible hosts.  Due to other
+   considerations in varasm, we must restrict this to what fits in an int.  */
+
+#define MAX_OFILE_ALIGNMENT \
+  (1 << (HOST_BITS_PER_INT < 64 ? HOST_BITS_PER_INT - 2 : 62))
+
 /* This is the pseudo-op used to generate a contiguous sequence of byte
    values from a double-quoted string WITHOUT HAVING A TERMINATING NUL
    AUTOMATICALLY APPENDED.  This is the same for most svr4 assemblers.  */
@@ -195,6 +226,11 @@ do {                                                                       \
 #define CTORS_SECTION_ASM_OP   ".section\t.ctors,\"aw\""
 #define DTORS_SECTION_ASM_OP   ".section\t.dtors,\"aw\""
 
+/* Handle the small data sections.  */
+#define BSS_SECTION_ASM_OP     ".section\t.bss"
+#define SBSS_SECTION_ASM_OP    ".section\t.sbss,\"aw\""
+#define SDATA_SECTION_ASM_OP   ".section\t.sdata,\"aw\""
+
 /* On svr4, we *do* have support for the .init and .fini sections, and we
    can put stuff in there to be executed before and after `main'.  We let
    crtstuff.c and other files know this by defining the following symbols.
@@ -210,7 +246,7 @@ do {                                                                        \
    includes this file.  */
 
 #undef EXTRA_SECTIONS
-#define EXTRA_SECTIONS in_const, in_ctors, in_dtors
+#define EXTRA_SECTIONS in_const, in_ctors, in_dtors, in_sbss, in_sdata
 
 /* A default list of extra section function definitions.  For targets
    that use additional sections (e.g. .tdesc) you should override this
@@ -219,8 +255,10 @@ do {                                                                       \
 #undef EXTRA_SECTION_FUNCTIONS
 #define EXTRA_SECTION_FUNCTIONS                                                \
   CONST_SECTION_FUNCTION                                               \
-  CTORS_SECTION_FUNCTION                                               \
-  DTORS_SECTION_FUNCTION
+  SECTION_FUNCTION_TEMPLATE(ctors_section, in_ctors, CTORS_SECTION_ASM_OP) \
+  SECTION_FUNCTION_TEMPLATE(dtors_section, in_dtors, DTORS_SECTION_ASM_OP) \
+  SECTION_FUNCTION_TEMPLATE(sbss_section, in_sbss, SBSS_SECTION_ASM_OP)        \
+  SECTION_FUNCTION_TEMPLATE(sdata_section, in_sdata, SDATA_SECTION_ASM_OP)
 
 #undef READONLY_DATA_SECTION
 #define READONLY_DATA_SECTION() const_section ()
@@ -240,27 +278,16 @@ const_section ()                                                  \
     }                                                                  \
 }
 
-#define CTORS_SECTION_FUNCTION                                         \
-void                                                                   \
-ctors_section ()                                                       \
+#define SECTION_FUNCTION_TEMPLATE(FN, ENUM, OP)                                \
+void FN ()                                                             \
 {                                                                      \
-  if (in_section != in_ctors)                                          \
+  if (in_section != ENUM)                                              \
     {                                                                  \
-      fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP);            \
-      in_section = in_ctors;                                           \
+      fprintf (asm_out_file, "%s\n", OP);                              \
+      in_section = ENUM;                                               \
     }                                                                  \
 }
 
-#define DTORS_SECTION_FUNCTION                                         \
-void                                                                   \
-dtors_section ()                                                       \
-{                                                                      \
-  if (in_section != in_dtors)                                          \
-    {                                                                  \
-      fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP);            \
-      in_section = in_dtors;                                           \
-    }                                                                  \
-}
 
 /* Switch into a generic section.
    This is currently only used to support section attributes.
@@ -314,7 +341,13 @@ dtors_section ()                                                   \
          || !DECL_INITIAL (DECL)                                       \
          || (DECL_INITIAL (DECL) != error_mark_node                    \
              && !TREE_CONSTANT (DECL_INITIAL (DECL))))                 \
-       data_section ();                                                \
+       {                                                               \
+         int size = int_size_in_bytes (TREE_TYPE (DECL));              \
+         if (size >= 0 && size <= g_switch_value)                      \
+           sdata_section ();                                           \
+         else                                                          \
+           data_section ();                                            \
+       }                                                               \
       else                                                             \
        const_section ();                                               \
     }                                                                  \
index eb2a91ecb7e976601504b28157cc1c055af913b4..0dd303705a9552665c984ba7c77895ded4f84289 100644 (file)
@@ -30,9 +30,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #undef LIB_SPEC
 #define LIB_SPEC "%{pg:-lgmon} %{pg:-lc_p} %{!pg:-lc}"
 
-#undef ASM_SPEC
-#define ASM_SPEC "-nocpp"
-
 /* Generate calls to memcpy, etc., not bcopy, etc. */
 #define TARGET_MEM_FUNCTIONS
 
index fd1678bd734675f67f530c186d42d707e9b66e38..d07be98230bc4acb92cf763308898e62838a84d6 100644 (file)
@@ -468,3 +468,7 @@ extern int flag_prefix_function_name;
 /* Nonzero if the current function is a thunk, so we should try to cut
    corners where we can.  */
 extern int current_function_is_thunk;
+
+/* Value of the -G xx switch, and whether it was passed or not.  */
+extern int g_switch_value;
+extern int g_switch_set;