]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Patches from David Mosberger, and a patch to make bootstrap work.
authorJim Wilson <wilson@gcc.gnu.org>
Wed, 3 May 2000 18:46:05 +0000 (11:46 -0700)
committerJim Wilson <wilson@gcc.gnu.org>
Wed, 3 May 2000 18:46:05 +0000 (11:46 -0700)
* config/ia64/ia64.c (ia64_encode_section_info): Add check for
TREE_ASM_WRITTEN.
* config/ia64/ia64.c (ia64_override_options): Force -mconstant-gp
if -mauto-pic is on.
...

From-SVN: r33638

gcc/ChangeLog
gcc/config/ia64/ia64.c
gcc/config/ia64/ia64.h
gcc/config/ia64/ia64.md
gcc/config/ia64/linux.h
gcc/config/ia64/sysv4.h

index eed7f65b3a48f2a8a2f0721476a33f2391943180..c3559a4af11c8101bc0e4d74ec01a802e33cb729 100644 (file)
@@ -1,3 +1,37 @@
+Wed May  3 11:43:53 2000  Jim Wilson  <wilson@cygnus.com>
+
+       * config/ia64/ia64.c (ia64_encode_section_info): Add check for
+       TREE_ASM_WRITTEN.
+
+2000-05-03  David Mosberger  <davidm@hpl.hp.com>
+
+       * config/ia64/ia64.c (ia64_override_options): Force -mconstant-gp
+       if -mauto-pic is on.
+       (ia64_epilogue_uses): Mark "gp" (r1) as used by the epilogue if
+       -mconstant-gp is in effect and function-descriptors are being used
+       to make indirect calls.
+       * config/ia64/ia64.h (MASK_CONST_GP): New macro.
+       (MASK_AUTO_PIC): Ditto.
+       (TARGET_CONST_GP): Ditto.
+       (TARGET_AUTO_PIC): Ditto.
+       (TARGET_SWITCHES): Add -mconstant-gp and -mauto-pic options.
+       (ASM_OUTPUT_DOUBLE_INT): Don't generate @fptr() if -mauto-pic or
+       -mno-pic is in effect.
+       (ASM_OUTPUT_XDATA_DOUBLE_INT): Ditto.
+       * config/ia64/ia64.md (movdi): Use gen_load_gprel64() if
+       -mauto-pic is in effect.
+       (gprel64_offset): New pattern.
+       (load_gprel64): Ditto.
+       (call): Handle -mauto-pic like -mno-pic (don't use fptr).  If
+       -mconstant-gp is in effect, no need to preserve gp around direct
+       calls.
+       (call_value): Ditto.
+       * config/ia64/linux.h (PROFILE_BEFORE_PROLOGUE): Define.
+       (FUNCTION_PROFILER): Define.
+       * config/ia64/sysv4.h (ASM_OUTPUT_CONSTRUCTOR): Don't generate
+       @fptr() directive when -mno-pic or -mauto-pic is in effect.
+       (ASM_OUTPUT_DESTRUCTOR): Ditto.
+
 2000-05-03  Richard Henderson  <rth@cygnus.com>
 
        * Makefile.in (STAGESTUFF): Add libgcc libgcc.mk.
index f5af6546208fd8c1a63a40ecc485c97423494858..b334dc63c121997464d50dd13d4c93c26d30652d 100644 (file)
@@ -2057,6 +2057,9 @@ ia64_mark_machine_status (p)
 void
 ia64_override_options ()
 {
+  if (TARGET_AUTO_PIC)
+    target_flags |= MASK_CONST_GP;
+
   if (ia64_fixed_range_string)
     fix_range (ia64_fixed_range_string);
 
@@ -2707,6 +2710,14 @@ int
 ia64_epilogue_uses (regno)
      int regno;
 {
+  /* When a function makes a call through a function descriptor, we
+     will write a (potentially) new value to "gp".  After returning
+     from such a call, we need to make sure the function restores the
+     original gp-value, even if the function itself does not use the
+     gp anymore.  */
+  if (regno == R_GR(1) && TARGET_CONST_GP && !(TARGET_AUTO_PIC || TARGET_NO_PIC))
+    return 1;
+
   /* For functions defined with the syscall_linkage attribute, all input
      registers are marked as live at all function exits.  This prevents the
      register allocator from using the input registers, which in turn makes it
@@ -2812,6 +2823,14 @@ ia64_encode_section_info (decl)
          || ! strcmp (str, "__DTOR_END__"))
        ;
 
+      /* If the variable has already been defined in the output file, then it
+        is too late to put it in sdata if it wasn't put there in the first
+        place.  The test is here rather than above, because if it is already
+        in sdata, then it can stay there.  */
+        
+      else if (TREE_ASM_WRITTEN (decl))
+       ;
+
       /* If this is an incomplete type with size 0, then we can't put it in
         sdata because it might be too big when completed.  */
       else if (size > 0 && size <= ia64_section_threshold
index 163f983190d1b2adbd2073265f55e0295bfee11b..e97ffef8aa84408d83499f291d4661f2c76aabe8 100644 (file)
@@ -66,6 +66,10 @@ extern int target_flags;
 
 #define MASK_NO_SDATA   0x00000080     /* Disable sdata/scommon/sbss.  */
 
+#define MASK_CONST_GP  0x00000100      /* treat gp as program-wide constant */
+
+#define MASK_AUTO_PIC  0x00000200      /* generate automatically PIC */
+
 #define MASK_DWARF2_ASM 0x40000000     /* test dwarf2 line info via gas.  */
 
 #define TARGET_BIG_ENDIAN      (target_flags & MASK_BIG_ENDIAN)
@@ -84,13 +88,17 @@ extern int target_flags;
 
 #define TARGET_NO_SDATA                (target_flags & MASK_NO_SDATA)
 
+#define TARGET_CONST_GP                (target_flags & MASK_CONST_GP)
+
+#define TARGET_AUTO_PIC                (target_flags & MASK_AUTO_PIC)
+
 #define TARGET_DWARF2_ASM      (target_flags & MASK_DWARF2_ASM)
 
 /* This macro defines names of command options to set and clear bits in
    `target_flags'.  Its definition is an initializer with a subgrouping for
    each command option.  */
 
-#define TARGET_SWITCHES \
+#define TARGET_SWITCHES                                                        \
 {                                                                      \
   { "big-endian",      MASK_BIG_ENDIAN,                                \
       "Generate big endian code" },                                    \
@@ -118,6 +126,10 @@ extern int target_flags;
       "Disable use of sdata/scommon/sbss"},                            \
   { "sdata",           -MASK_NO_SDATA,                                 \
       "Enable use of sdata/scommon/sbss"},                             \
+  { "constant-gp",     MASK_CONST_GP,                                  \
+      "gp is constant (but save/restore gp on indirect calls)" },      \
+  { "auto-pic",                MASK_AUTO_PIC,                                  \
+      "Generate self-relocatable code" },                              \
   { "dwarf2-asm",      MASK_DWARF2_ASM,                                \
       "Enable Dwarf 2 line debug info via GNU as"},                    \
   { "no-dwarf2-asm",   -MASK_DWARF2_ASM,                               \
@@ -2116,10 +2128,10 @@ do {                                                                    \
 #define ASM_OUTPUT_DOUBLE_INT(FILE, VALUE)                             \
 do {                                                                   \
   fprintf (FILE, "\tdata8\t");                                         \
-  if (SYMBOL_REF_FLAG (VALUE))                                         \
+  if (!(TARGET_NO_PIC || TARGET_AUTO_PIC) && SYMBOL_REF_FLAG (VALUE))  \
     fprintf (FILE, "@fptr(");                                          \
   output_addr_const (FILE, (VALUE));                                   \
-  if (SYMBOL_REF_FLAG (VALUE))                                         \
+  if (!(TARGET_NO_PIC || TARGET_AUTO_PIC) && SYMBOL_REF_FLAG (VALUE))  \
     fprintf (FILE, ")");                                               \
   fprintf (FILE, "\n");                                                        \
 } while (0)
@@ -2161,16 +2173,16 @@ do {                                                                    \
 
 #define ASM_OUTPUT_XDATA_DOUBLE_INT(FILE, SECTION, VALUE)              \
 do {                                                                   \
+  int need_closing_paren = 0;                                          \
   fprintf (FILE, "\t.xdata8\t\"%s\", ", SECTION);                      \
-  if (GET_CODE (VALUE) == SYMBOL_REF)                                  \
+  if (!(TARGET_NO_PIC || TARGET_AUTO_PIC)                              \
+      && GET_CODE (VALUE) == SYMBOL_REF)                               \
     {                                                                  \
-      if (SYMBOL_REF_FLAG (VALUE))                                     \
-       fprintf (FILE, "@fptr(");                                       \
-      else                                                             \
-       fprintf (FILE, "@segrel(");                                     \
+      fprintf (FILE, SYMBOL_REF_FLAG (VALUE) ? "@fptr(" : "@segrel("); \
+      need_closing_paren = 1;                                          \
     }                                                                  \
-  output_addr_const (FILE, (VALUE));                                   \
-  if (GET_CODE (VALUE) == SYMBOL_REF)                                  \
+  output_addr_const (FILE, VALUE);                                     \
+  if (need_closing_paren)                                              \
     fprintf (FILE, ")");                                               \
   fprintf (FILE, "\n");                                                        \
 } while (0)
index e9ef493ecdd1f563bfeff7ea58d5382b2be5b5df..6f243f80a670d6372b1babfecc1aef72463c01a0 100644 (file)
       else
        temp = operands[0];
 
-      if (GET_CODE (operands[1]) == SYMBOL_REF && SYMBOL_REF_FLAG (operands[1]))
+      if (TARGET_AUTO_PIC)
+       emit_insn (gen_load_gprel64 (temp, operands[1]));
+      else if (GET_CODE (operands[1]) == SYMBOL_REF
+              && SYMBOL_REF_FLAG (operands[1]))
        emit_insn (gen_load_fptr (temp, operands[1]));
       else if (sdata_symbolic_operand (operands[1], DImode))
        emit_insn (gen_load_gprel (temp, operands[1]));
   "addl %0 = @gprel(%1), gp"
   [(set_attr "type" "A")])
 
+(define_insn "gprel64_offset"
+  [(set (match_operand:DI 0 "register_operand" "=r")
+       (minus:DI (match_operand:DI 1 "symbolic_operand" "") (reg:DI 1)))]
+  ""
+  "movl %0 = @gprel(%1)"
+  [(set_attr "type" "L")])
+
+(define_expand "load_gprel64"
+  [(set (match_dup 2)
+       (minus:DI (match_operand:DI 1 "symbolic_operand" "") (reg:DI 1)))
+   (set (match_operand:DI 0 "register_operand" "")
+       (plus:DI (reg:DI 1) (match_dup 2)))]
+  ""
+  "{
+  if (reload_in_progress)
+    operands[2] = operands[0];
+  else
+    operands[2] = gen_reg_rtx (DImode);
+}")
+
 (define_expand "load_symptr"
   [(set (match_dup 2)
        (plus:DI (reg:DI 1) (match_operand:DI 1 "symbolic_operand" "")))
   rtx addr = XEXP (operands[0], 0);
   enum machine_mode mode = GET_MODE (addr);
 
-  if (TARGET_NO_PIC)
+  if (TARGET_NO_PIC || TARGET_AUTO_PIC)
     emit_call_insn (gen_call_internal (addr, operands[1],
                                       gen_rtx_REG (DImode, R_BR (0))));
 
   /* If this is an indirect call, then we have the address of a descriptor.  */
   else if (! symbolic_operand (addr, mode))
     emit_insn (gen_indirect_call_pic (addr, operands[1]));
+  else if (TARGET_CONST_GP)
+    emit_call_insn (gen_call_internal (addr, operands[1],
+                                      gen_rtx_REG (DImode, R_BR (0))));
   /* ??? This is an unsatisfying solution.  Should rethink.  */
   else if (setjmp_operand (addr, mode))
     emit_insn (gen_setjmp_call_pic (addr, operands[1]));
   rtx addr = XEXP (operands[1], 0);
   enum machine_mode mode = GET_MODE (addr);
 
-  if (TARGET_NO_PIC)
+  if (TARGET_NO_PIC || TARGET_AUTO_PIC)
     emit_call_insn (gen_call_value_internal (operands[0], addr, operands[2],
                                             gen_rtx_REG (DImode, R_BR (0))));
 
        emit_insn (gen_indirect_call_value_pic (operands[0], addr,
                                                operands[2]));
     }
+  else if (TARGET_CONST_GP)
+    emit_call_insn (gen_call_value_internal (operands[0], addr, operands[2],
+                                            gen_rtx_REG (DImode, R_BR (0))));
   /* ??? This is an unsatisfying solution.  Should rethink.  */
   else if (setjmp_operand (addr, mode))
     emit_insn (gen_setjmp_call_value_pic (operands[0], addr, operands[2]));
index 62fc1a721deaf50ddae5718c1af25cafb251f7ee..5108cfa8211c27d1d4ac4a0c42a77a13e0032918 100644 (file)
 
 #define DONT_USE_BUILTIN_SETJMP
 #define JMP_BUF_SIZE  (8 * 76)
+
+/* Output any profiling code before the prologue.  */
+
+#undef PROFILE_BEFORE_PROLOGUE
+#define PROFILE_BEFORE_PROLOGUE 1
+
+/* A C statement or compound statement to output to FILE some assembler code to
+   call the profiling subroutine `mcount'.  */
+
+#undef FUNCTION_PROFILER
+#define FUNCTION_PROFILER(FILE, LABELNO)               \
+do {                                                   \
+  char buf[20];                                                \
+  ASM_GENERATE_INTERNAL_LABEL (buf, "LP", LABELNO);    \
+  fputs ("\talloc out0 = ar.pfs, 8, 0, 4, 0\n", FILE); \
+  if (TARGET_AUTO_PIC)                                 \
+    fputs ("\tmovl out3 = @gprel(", FILE);             \
+  else                                                 \
+    fputs ("\taddl out3 = @ltoff(", FILE);             \
+  assemble_name (FILE, buf);                           \
+  if (TARGET_AUTO_PIC)                                 \
+    fputs (");;\n", FILE);                             \
+  else                                                 \
+    fputs ("), r1;;\n", FILE);                         \
+  fputs ("\tmov out1 = r1\n", FILE);                   \
+  fputs ("\tmov out2 = b0\n", FILE);                   \
+  fputs ("\tbr.call.sptk.many b0 = _mcount;;\n", FILE);        \
+} while (0)
+
 /* End of linux.h */
index 95f73a34847c9bba97ef542273a1e983197f5e96..7e9e2c97a9055ad227c25aa771c901cf9779b51e 100644 (file)
@@ -84,9 +84,15 @@ while (0)
 #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)                              \
   do {                                                                 \
     ctors_section ();                                                  \
-    fputs ("\tdata8\t @fptr(", FILE);                                  \
+    if (TARGET_NO_PIC || TARGET_AUTO_PIC)                              \
+      fputs ("\tdata8\t ", FILE);                                      \
+    else                                                               \
+      fputs ("\tdata8\t @fptr(", FILE);                                        \
     assemble_name (FILE, NAME);                                                \
-    fputs (")\n", FILE);                                               \
+    if (TARGET_NO_PIC || TARGET_AUTO_PIC)                              \
+      fputs ("\n", FILE);                                              \
+    else                                                               \
+      fputs (")\n", FILE);                                             \
   } while (0)
 
 /* A C statement (sans semicolon) to output an element in the table of
@@ -96,9 +102,15 @@ while (0)
 #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)                                       \
   do {                                                                 \
     dtors_section ();                                                  \
-    fputs ("\tdata8\t @fptr(", FILE);                                  \
+    if (TARGET_NO_PIC || TARGET_AUTO_PIC)                              \
+      fputs ("\tdata8\t ", FILE);                                      \
+    else                                                               \
+      fputs ("\tdata8\t @fptr(", FILE);                                        \
     assemble_name (FILE, NAME);                                        \
-    fputs (")\n", FILE);                                               \
+    if (TARGET_NO_PIC || TARGET_AUTO_PIC)                              \
+      fputs ("\n", FILE);                                              \
+    else                                                               \
+      fputs (")\n", FILE);                                             \
   } while (0)
 
 /* svr4.h undefines this, so we need to define it here.  */