* rs6000.c (SMALL_DATA_REG): Register to use for small data relocs.
(print_operand): Use SMALL_DATA_REG for the register involved in
small data relocations.
(print_operand_address): Ditto.
* rs6000/linux.h (LINK_SPEC): Pass -dynamic-linker /lib/ld.so.1 if
-dynamic linker is not used.
* rs6000.md (call insns): For local calls, use @local suffix under
System V. Don't use @plt under Solaris.
From-SVN: r16771
Wed Nov 26 13:04:46 1997 Michael Meissner <meissner@cygnus.com>
+ * rs6000.c (SMALL_DATA_REG): Register to use for small data relocs.
+ (print_operand): Use SMALL_DATA_REG for the register involved in
+ small data relocations.
+ (print_operand_address): Ditto.
+
+ * rs6000/linux.h (LINK_SPEC): Pass -dynamic-linker /lib/ld.so.1 if
+ -dynamic linker is not used.
+
+ * rs6000.md (call insns): For local calls, use @local suffix under
+ System V. Don't use @plt under Solaris.
+
* rs6000.c (output_function_profiler): Put label address in r0, and
store LR in 4(sp) for System V/eabi.
#undef LINK_SPEC
#define LINK_SPEC "-m elf32ppc %{shared:-shared} \
%{!shared: \
- %{!static: %{rdynamic:-export-dynamic}} \
+ %{!static: \
+ %{rdynamic:-export-dynamic} \
+ %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
%{static:-static}}"
#undef LIB_DEFAULT_SPEC
#if TARGET_ELF
#define SMALL_DATA_RELOC ((rs6000_sdata == SDATA_EABI) ? "sda21" : "sdarel")
+#define SMALL_DATA_REG ((rs6000_sdata == SDATA_EABI) ? 0 : 13)
#else
#define SMALL_DATA_RELOC "sda21"
+#define SMALL_DATA_REG 0
#endif
void
else
output_address (plus_constant (XEXP (x, 0), 4));
if (small_data_operand (x, GET_MODE (x)))
- fprintf (file, "@%s(%s)", SMALL_DATA_RELOC, reg_names[0]);
+ fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
+ reg_names[SMALL_DATA_REG]);
}
return;
else
output_address (plus_constant (XEXP (x, 0), 8));
if (small_data_operand (x, GET_MODE (x)))
- fprintf (file, "@%s(%s)", SMALL_DATA_RELOC, reg_names[0]);
+ fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
+ reg_names[SMALL_DATA_REG]);
}
return;
else
output_address (plus_constant (XEXP (x, 0), 12));
if (small_data_operand (x, GET_MODE (x)))
- fprintf (file, "@%s(%s)", SMALL_DATA_RELOC, reg_names[0]);
+ fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
+ reg_names[SMALL_DATA_REG]);
}
return;
{
output_addr_const (file, x);
if (small_data_operand (x, GET_MODE (x)))
- fprintf (file, "@%s(%s)", SMALL_DATA_RELOC, reg_names[0]);
+ fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
+ reg_names[SMALL_DATA_REG]);
#ifdef TARGET_NO_TOC
else if (TARGET_NO_TOC)
else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
output_asm_insn (\"creqv 6,6,6\", operands);
- return \"bl %z0\";
+ return (DEFAULT_ABI == ABI_V4 && flag_pic) ? \"bl %z0@local\" : \"bl %z0\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,8")])
else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
output_asm_insn (\"creqv 6,6,6\", operands);
- return flag_pic ? \"bl %z0@plt\" : \"bl %z0\";
+ return (DEFAULT_ABI == ABI_V4 && flag_pic) ? \"bl %z0@plt\" : \"bl %z0\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,8")])
else if (INTVAL (operands[3]) & CALL_V4_CLEAR_FP_ARGS)
output_asm_insn (\"creqv 6,6,6\", operands);
- return \"bl %z1\";
+ return (DEFAULT_ABI == ABI_V4 && flag_pic) ? \"bl %z1@local\" : \"bl %z1\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,8")])
else if (INTVAL (operands[3]) & CALL_V4_CLEAR_FP_ARGS)
output_asm_insn (\"creqv 6,6,6\", operands);
- return flag_pic ? \"bl %z1@plt\" : \"bl %z1\";
+ return (DEFAULT_ABI == ABI_V4 && flag_pic) ? \"bl %z1@plt\" : \"bl %z1\";
}"
[(set_attr "type" "branch")
(set_attr "length" "4,8")])