darwin.c (machopic_function_base_name): If dynamic-no-pic is on should not get here.

2003-03-10  Andrew Pinski  <apinski@apple.com>

	* config/darwin.c (machopic_function_base_name): If dynamic-no-pic
	is on should not get here.
	(machopic_indirect_data_reference): If dynamic-no-pic is on just
	generate high/low parts of the address.
	(machopic_legitimize_pic_address): Change MACHOPIC_PURE to
	MACHOPIC_INDIRECT. Dynamic-no-pic uses 0 as the pic base. Generate
	symbol and labels with a new reg.  Dynamic-no-pic does not have a
	pic_offset_table_rtx.
	(machopic_select_section): Change references of flag_pic to
	MACHOPIC_INDIRECT.
	(machopic_asm_out_destructor): Likewise.
	* config/darwin.h (ASM_DECLARE_UNRESOLVED_REFERENCE): Change
	reference of flag_pic to MACHOPIC_INDIRECT.
	(MACHO_DYNAMIC_NO_PIC_P): Define as TARGET_DYNAMIC_NO_PIC.
	(MACHOPIC_INDIRECT): Is also true when dynamic-no-pic is on.
	(MACHOPIC_JUST_INDIRECT): Is also true when dynamic-no-pic is on.
	(MACHOPIC_PURE): Is not pure when dynamic-no-pic is on.
	* config/i386/darwin.h (MASK_MACHO_DYNAMIC_NO_PIC): Define as
	0 for right now as dynamic-no-pic is not implemented on Darwin/ia32.
	* config/rs6000/darwin.h (MASK_MACHO_DYNAMIC_NO_PIC): Define.
	(TARGET_DYNAMIC_NO_PIC): Define.
	(SUBTARGET_SWITCHES): Define, have sub-target switches for
	dynamic-no-pic.
	(SUBTARGET_OVERRIDE_OPTIONS): Move check for -fpic from
	rs6000_override_options to here. Dynamic-no-pic overrides
	pic.
	(CC1_SPEC): Change from not static then pic to not static and not
	dynamic-no-pic then pic.
	* config/rs6000/rs6000.c (rs6000_override_options): Move the
	check for -fpic and DARWIN_ABI to config/rs6000/darwin.h
	(rs6000_legitimize_reload_address): Add case for loading floating in
	dynamic-no-pic.
	(rs6000_emit_move): Add case for dynamic-no-pic.  Change reference
	of flag_pic to MACHOPIC_INDIRECT.
	(secondary_reload_class): Conditional change the reference of
	flag_pic to MACHOPIC_INDIRECT.
	(rs6000_output_mi_thunk): Change reference of flag_pic to
	MACHOPIC_INDIRECT.
	(output_profile_hook): Likewise.
	(machopic_output_stub):	Non-pure (dynamic-no-pic) is now supported.
	* config/rs6000/rs6000.md (movdf_low): Add the case for
	MACHO_DYNAMIC_NO_PIC_P.
	(call): Change references for flag_pic in TARGET_MACHO to
	MACHOPIC_INDIRECT.
	(SUBTARGET_OVERRIDE_OPTIONS): Add case where -fpic is on and
	-mdynamic-no-pic is on.	 Also move case for -fpic from rs6000.c.
	* doc/invoke.texi (-mdynamic-no-pic): Document.

From-SVN: r64157
This commit is contained in:
Andrew Pinski 2003-03-11 01:41:11 +00:00 committed by Geoffrey Keating
parent 8c12473040
commit ab82a49f4e
8 changed files with 218 additions and 34 deletions

View File

@ -1,3 +1,52 @@
2003-03-10 Andrew Pinski <apinski@apple.com>
* config/darwin.c (machopic_function_base_name): If dynamic-no-pic
is on should not get here.
(machopic_indirect_data_reference): If dynamic-no-pic is on just
generate high/low parts of the address.
(machopic_legitimize_pic_address): Change MACHOPIC_PURE to
MACHOPIC_INDIRECT. Dynamic-no-pic uses 0 as the pic base. Generate
symbol and labels with a new reg. Dynamic-no-pic does not have a
pic_offset_table_rtx.
(machopic_select_section): Change references of flag_pic to
MACHOPIC_INDIRECT.
(machopic_asm_out_destructor): Likewise.
* config/darwin.h (ASM_DECLARE_UNRESOLVED_REFERENCE): Change
reference of flag_pic to MACHOPIC_INDIRECT.
(MACHO_DYNAMIC_NO_PIC_P): Define as TARGET_DYNAMIC_NO_PIC.
(MACHOPIC_INDIRECT): Is also true when dynamic-no-pic is on.
(MACHOPIC_JUST_INDIRECT): Is also true when dynamic-no-pic is on.
(MACHOPIC_PURE): Is not pure when dynamic-no-pic is on.
* config/i386/darwin.h (MASK_MACHO_DYNAMIC_NO_PIC): Define as
0 for right now as dynamic-no-pic is not implemented on Darwin/ia32.
* config/rs6000/darwin.h (MASK_MACHO_DYNAMIC_NO_PIC): Define.
(TARGET_DYNAMIC_NO_PIC): Define.
(SUBTARGET_SWITCHES): Define, have sub-target switches for
dynamic-no-pic.
(SUBTARGET_OVERRIDE_OPTIONS): Move check for -fpic from
rs6000_override_options to here. Dynamic-no-pic overrides
pic.
(CC1_SPEC): Change from not static then pic to not static and not
dynamic-no-pic then pic.
* config/rs6000/rs6000.c (rs6000_override_options): Move the
check for -fpic and DARWIN_ABI to config/rs6000/darwin.h
(rs6000_legitimize_reload_address): Add case for loading floating in
dynamic-no-pic.
(rs6000_emit_move): Add case for dynamic-no-pic. Change reference
of flag_pic to MACHOPIC_INDIRECT.
(secondary_reload_class): Conditional change the reference of
flag_pic to MACHOPIC_INDIRECT.
(rs6000_output_mi_thunk): Change reference of flag_pic to
MACHOPIC_INDIRECT.
(output_profile_hook): Likewise.
(machopic_output_stub): Non-pure (dynamic-no-pic) is now supported.
* config/rs6000/rs6000.md (movdf_low): Add the case for
MACHO_DYNAMIC_NO_PIC_P.
(call): Change references for flag_pic in TARGET_MACHO to
MACHOPIC_INDIRECT.
(SUBTARGET_OVERRIDE_OPTIONS): Add case where -fpic is on and
-mdynamic-no-pic is on. Also move case for -fpic from rs6000.c.
* doc/invoke.texi (-mdynamic-no-pic): Document.
2003-03-10 Devang Patel <dpatel@apple.com>
@ -16,7 +65,6 @@
check_function_return_warnings up to just after
delete_unreachable_blocks.
2003-03-10 Stephane Carrez <stcarrez@nerim.fr>
* config/m68hc11/m68hc11.h (HARD_REGNO_RENAME_OK): Define.

View File

@ -231,6 +231,9 @@ machopic_function_base_name ()
static const char *name = NULL;
static const char *current_name;
/* if dynamic-no-pic is on, we should not get here */
if (MACHO_DYNAMIC_NO_PIC_P)
abort ();
current_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (current_function_decl));
if (name != current_name)
@ -426,7 +429,20 @@ machopic_indirect_data_reference (orig, reg)
{
const char *name = XSTR (orig, 0);
if (machopic_data_defined_p (name))
int defined = machopic_data_defined_p (name);
if (defined && MACHO_DYNAMIC_NO_PIC_P)
{
#if defined (TARGET_TOC)
emit_insn (gen_macho_high (reg, orig));
emit_insn (gen_macho_low (reg, reg, orig));
#else
/* some other cpu -- writeme! */
abort ();
#endif
return reg;
}
else if (defined)
{
#if defined (TARGET_TOC) || defined (HAVE_lo_sum)
rtx pic_base = gen_rtx (SYMBOL_REF, Pmode,
@ -569,7 +585,7 @@ machopic_legitimize_pic_address (orig, mode, reg)
{
rtx pic_ref = orig;
if (! MACHOPIC_PURE)
if (! MACHOPIC_INDIRECT)
return orig;
/* First handle a simple SYMBOL_REF or LABEL_REF */
@ -592,6 +608,10 @@ machopic_legitimize_pic_address (orig, mode, reg)
return reg;
}
/* if dynamic-no-pic then use 0 as the pic base */
if (MACHO_DYNAMIC_NO_PIC_P)
pic_base = CONST0_RTX (Pmode);
else
pic_base = gen_rtx (SYMBOL_REF, Pmode, machopic_function_base_name ());
if (GET_CODE (orig) == MEM)
@ -605,6 +625,27 @@ machopic_legitimize_pic_address (orig, mode, reg)
}
#ifdef HAVE_lo_sum
if (MACHO_DYNAMIC_NO_PIC_P
&& (GET_CODE (XEXP (orig, 0)) == SYMBOL_REF
|| GET_CODE (XEXP (orig, 0)) == LABEL_REF))
{
#if defined (TARGET_TOC) /* ppc */
rtx temp_reg = (no_new_pseudos) ? reg : gen_reg_rtx (Pmode);
rtx asym = XEXP (orig, 0);
rtx mem;
emit_insn (gen_macho_high (temp_reg, asym));
mem = gen_rtx_MEM (GET_MODE (orig),
gen_rtx (LO_SUM, Pmode, temp_reg, asym));
RTX_UNCHANGING_P (mem) = 1;
emit_insn (gen_rtx (SET, VOIDmode, reg, mem));
#else
/* Some other CPU -- WriteMe! but right now there are no other platform that can use dynamic-no-pic */
abort ();
#endif
pic_ref = reg;
}
else
if (GET_CODE (XEXP (orig, 0)) == SYMBOL_REF
|| GET_CODE (XEXP (orig, 0)) == LABEL_REF)
{
@ -692,7 +733,9 @@ machopic_legitimize_pic_address (orig, mode, reg)
hi_sum_reg = reg;
emit_insn (gen_rtx (SET, Pmode, hi_sum_reg,
gen_rtx (PLUS, Pmode,
(MACHO_DYNAMIC_NO_PIC_P)
? gen_rtx (HIGH, Pmode, offset)
: gen_rtx (PLUS, Pmode,
pic_offset_table_rtx,
gen_rtx (HIGH, Pmode, offset))));
emit_insn (gen_rtx (SET, VOIDmode, reg,
@ -1137,7 +1180,8 @@ machopic_select_section (exp, reloc, align)
objc_string_object_section ();
else if (TREE_READONLY (exp) || TREE_CONSTANT (exp))
{
if (TREE_SIDE_EFFECTS (exp) || (flag_pic && reloc))
if (TREE_SIDE_EFFECTS (exp) || (MACHOPIC_INDIRECT && reloc))
const_data_section ();
else
readonly_data_section ();
@ -1200,7 +1244,8 @@ machopic_select_section (exp, reloc, align)
else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp))
&& !TREE_SIDE_EFFECTS (exp))
{
if (flag_pic && reloc)
if (MACHOPIC_INDIRECT && reloc)
const_data_section ();
else
readonly_data_section ();
@ -1210,7 +1255,8 @@ machopic_select_section (exp, reloc, align)
}
else if (TREE_READONLY (exp) || TREE_CONSTANT (exp))
{
if (TREE_SIDE_EFFECTS (exp) || (flag_pic && reloc))
if (TREE_SIDE_EFFECTS (exp) || (MACHOPIC_INDIRECT && reloc))
const_data_section ();
else
readonly_data_section ();
@ -1243,14 +1289,16 @@ machopic_asm_out_constructor (symbol, priority)
rtx symbol;
int priority ATTRIBUTE_UNUSED;
{
if (flag_pic)
if (MACHOPIC_INDIRECT)
mod_init_section ();
else
constructor_section ();
assemble_align (POINTER_SIZE);
assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
if (!flag_pic)
if (! MACHOPIC_INDIRECT)
fprintf (asm_out_file, ".reference .constructors_used\n");
}
@ -1259,14 +1307,15 @@ machopic_asm_out_destructor (symbol, priority)
rtx symbol;
int priority ATTRIBUTE_UNUSED;
{
if (flag_pic)
if (MACHOPIC_INDIRECT)
mod_term_section ();
else
destructor_section ();
assemble_align (POINTER_SIZE);
assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
if (!flag_pic)
if (! MACHOPIC_INDIRECT)
fprintf (asm_out_file, ".reference .destructors_used\n");
}

View File

@ -676,7 +676,7 @@ objc_section_init () \
#define ASM_DECLARE_UNRESOLVED_REFERENCE(FILE,NAME) \
do { \
if (FILE) { \
if (flag_pic) \
if (MACHOPIC_INDIRECT) \
fprintf (FILE, "\t.lazy_reference "); \
else \
fprintf (FILE, "\t.reference "); \
@ -722,9 +722,10 @@ enum machopic_addr_class {
/* Macros defining the various PIC cases. */
#define MACHOPIC_INDIRECT (flag_pic)
#define MACHOPIC_JUST_INDIRECT (flag_pic == 1)
#define MACHOPIC_PURE (flag_pic == 2)
#define MACHO_DYNAMIC_NO_PIC_P (TARGET_DYNAMIC_NO_PIC)
#define MACHOPIC_INDIRECT (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
#define MACHOPIC_JUST_INDIRECT (flag_pic == 1 || MACHO_DYNAMIC_NO_PIC_P)
#define MACHOPIC_PURE (flag_pic == 2 && ! MACHO_DYNAMIC_NO_PIC_P)
#undef TARGET_ENCODE_SECTION_INFO
#define TARGET_ENCODE_SECTION_INFO darwin_encode_section_info

View File

@ -68,6 +68,11 @@ Boston, MA 02111-1307, USA. */
#undef TARGET_DEEP_BRANCH_PREDICTION
#define TARGET_DEEP_BRANCH_PREDICTION 0
/* For now, disable dynamic-no-pic. We'll need to go through i386.c
with a fine-tooth comb looking for refs to flag_pic! */
#define MASK_MACHO_DYNAMIC_NO_PIC 0
#define TARGET_DYNAMIC_NO_PIC (target_flags & MASK_MACHO_DYNAMIC_NO_PIC)
/* Define the syntax of pseudo-ops, labels and comments. */
#define LPREFIX "L"

View File

@ -35,14 +35,15 @@ Boston, MA 02111-1307, USA. */
#define TARGET_TOC 0
#define TARGET_NO_TOC 1
/* Darwin switches. */
/* Use dynamic-no-pic codegen (no picbase reg; not suitable for shlibs.) */
#define MASK_MACHO_DYNAMIC_NO_PIC 0x00800000
#define TARGET_DYNAMIC_NO_PIC (target_flags & MASK_MACHO_DYNAMIC_NO_PIC)
/* Handle #pragma weak and #pragma pack. */
#define HANDLE_SYSV_PRAGMA 1
/* The Darwin ABI always includes AltiVec, can't be (validly) turned
off. */
#define SUBTARGET_OVERRIDE_OPTIONS \
rs6000_altivec_abi = 1;
#define TARGET_OS_CPP_BUILTINS() \
do \
@ -55,12 +56,45 @@ Boston, MA 02111-1307, USA. */
} \
while (0)
/* */
#undef SUBTARGET_SWITCHES
#define SUBTARGET_SWITCHES \
{"dynamic-no-pic", MASK_MACHO_DYNAMIC_NO_PIC, \
N_("Generate code suitable for executables (NOT shared libs)")}, \
{"no-dynamic-no-pic", -MASK_MACHO_DYNAMIC_NO_PIC, ""},
/* The Darwin ABI always includes AltiVec, can't be (validly) turned
off. */
#define SUBTARGET_OVERRIDE_OPTIONS \
do { \
rs6000_altivec_abi = 1; \
if (DEFAULT_ABI == ABI_DARWIN) \
{ \
if (MACHO_DYNAMIC_NO_PIC_P) \
{ \
if (flag_pic) \
warning ("-mdynamic-no-pic overrides -fpic or -fPIC"); \
flag_pic = 0; \
} \
else if (flag_pic == 1) \
{ \
/* Darwin doesn't support -fpic. */ \
warning ("-fpic is not supported; -fPIC assumed"); \
flag_pic = 2; \
} \
} \
}while(0)
/* We want -fPIC by default, unless we're using -static to compile for
the kernel or some such. */
#define CC1_SPEC "\
%{static: %{Zdynamic: %e conflicting code gen style switches are used}}\
%{!static:-fPIC}"
%{!static:%{!mdynamic-no-pic:-fPIC}}"
/* Make both r2 and r3 available for allocation. */
#define FIXED_R2 0

View File

@ -643,10 +643,6 @@ rs6000_override_options (default_cpu)
flag_pic = 0;
}
/* For Darwin, always silently make -fpic and -fPIC identical. */
if (flag_pic == 1 && DEFAULT_ABI == ABI_DARWIN)
flag_pic = 2;
/* Set debug flags */
if (rs6000_debug_name)
{
@ -2228,6 +2224,9 @@ rs6000_legitimize_address (x, oldx, mode)
}
else if (TARGET_MACHO && TARGET_32BIT && TARGET_NO_TOC
&& ! flag_pic
#if TARGET_MACHO
&& ! MACHO_DYNAMIC_NO_PIC_P
#endif
&& GET_CODE (x) != CONST_INT
&& GET_CODE (x) != CONST_DOUBLE
&& CONSTANT_P (x)
@ -2367,6 +2366,20 @@ rs6000_legitimize_reload_address (x, mode, opnum, type, ind_levels, win)
*win = 1;
return x;
}
if (GET_CODE (x) == SYMBOL_REF
&& DEFAULT_ABI == ABI_DARWIN
&& !ALTIVEC_VECTOR_MODE (mode)
&& MACHO_DYNAMIC_NO_PIC_P)
{
/* Darwin load of floating point constant. */
x = gen_rtx (LO_SUM, GET_MODE (x),
gen_rtx (HIGH, Pmode, x), x);
push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
opnum, (enum reload_type)type);
*win = 1;
return x;
}
#endif
if (TARGET_TOC
&& CONSTANT_POOL_EXPR_P (x)
@ -2780,6 +2793,18 @@ rs6000_emit_move (dest, source, mode)
if (DEFAULT_ABI == ABI_DARWIN)
{
#if TARGET_MACHO
if (MACHO_DYNAMIC_NO_PIC_P)
{
/* Take care of any required data indirection. */
operands[1] = rs6000_machopic_legitimize_pic_address (
operands[1], mode, operands[0]);
if (operands[0] != operands[1])
emit_insn (gen_rtx_SET (VOIDmode,
operands[0], operands[1]));
return;
}
#endif
emit_insn (gen_macho_high (target, operands[1]));
emit_insn (gen_macho_low (operands[0], target, operands[1]));
return;
@ -2824,7 +2849,7 @@ rs6000_emit_move (dest, source, mode)
#if TARGET_MACHO
/* Darwin uses a special PIC legitimizer. */
if (DEFAULT_ABI == ABI_DARWIN && flag_pic)
if (DEFAULT_ABI == ABI_DARWIN && MACHOPIC_INDIRECT)
{
operands[1] =
rs6000_machopic_legitimize_pic_address (operands[1], mode,
@ -7213,7 +7238,11 @@ secondary_reload_class (class, mode, in)
{
int regno;
if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN && flag_pic))
if (TARGET_ELF || (DEFAULT_ABI == ABI_DARWIN
#if TARGET_MACHO
&& MACHOPIC_INDIRECT
#endif
))
{
/* We cannot copy a symbolic operand directly into anything
other than BASE_REGS for TARGET_ELF. So indicate that a
@ -11567,7 +11596,7 @@ rs6000_output_mi_thunk (file, thunk_fndecl, delta, vcall_offset, function)
funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
#if TARGET_MACHO
if (flag_pic)
if (MACHOPIC_INDIRECT)
funexp = machopic_indirect_call_target (funexp);
#endif
@ -12218,7 +12247,7 @@ output_profile_hook (labelno)
#if TARGET_MACHO
/* For PIC code, set up a stub and collect the caller's address
from r0, which is where the prologue puts it. */
if (flag_pic)
if (MACHOPIC_INDIRECT)
{
mcount_name = machopic_stub_name (mcount_name);
if (current_function_uses_pic_offset_table)
@ -13106,7 +13135,12 @@ machopic_output_stub (file, symb, stub)
fprintf (file, "\tbctr\n");
}
else
fprintf (file, "non-pure not supported\n");
{
fprintf (file, "\tlis r11,ha16(%s)\n", lazy_ptr_name);
fprintf (file, "\tlwzu r12,lo16(%s)(r11)\n", lazy_ptr_name);
fprintf (file, "\tmtctr r12\n");
fprintf (file, "\tbctr\n");
}
machopic_lazy_symbol_ptr_section ();
fprintf (file, "%s:\n", lazy_ptr_name);

View File

@ -7531,9 +7531,14 @@
operands2[2] = operands[2];
operands2[3] = gen_rtx_REG (SImode, RS6000_PIC_OFFSET_TABLE_REGNUM);
output_asm_insn (\"{l|lwz} %0,lo16(%2)(%1)\", operands);
#if TARGET_MACHO
if (MACHO_DYNAMIC_NO_PIC_P)
output_asm_insn (\"{liu|lis} %L0,ha16(%2+4)\", operands);
else
/* We cannot rely on ha16(low half)==ha16(high half), alas,
although in practice it almost always is. */
output_asm_insn (\"{cau|addis} %L0,%3,ha16(%2+4)\", operands2);
#endif
return (\"{l|lwz} %L0,lo16(%2+4)(%L0)\");
}
default:
@ -9986,7 +9991,7 @@
"
{
#if TARGET_MACHO
if (flag_pic)
if (MACHOPIC_INDIRECT)
operands[0] = machopic_indirect_call_target (operands[0]);
#endif
@ -10034,7 +10039,7 @@
"
{
#if TARGET_MACHO
if (flag_pic)
if (MACHOPIC_INDIRECT)
operands[1] = machopic_indirect_call_target (operands[1]);
#endif
@ -10399,7 +10404,7 @@
"
{
#if TARGET_MACHO
if (flag_pic)
if (MACHOPIC_INDIRECT)
operands[0] = machopic_indirect_call_target (operands[0]);
#endif
@ -10586,7 +10591,7 @@
"
{
#if TARGET_MACHO
if (flag_pic)
if (MACHOPIC_INDIRECT)
operands[1] = machopic_indirect_call_target (operands[1]);
#endif

View File

@ -441,6 +441,7 @@ in the following sections.
-mstrict-align -mno-strict-align -mrelocatable @gol
-mno-relocatable -mrelocatable-lib -mno-relocatable-lib @gol
-mtoc -mno-toc -mlittle -mlittle-endian -mbig -mbig-endian @gol
-mdynamic-no-pic @gol
-mcall-aix -mcall-sysv -mcall-netbsd @gol
-maix-struct-return -msvr4-struct-return @gol
-mabi=altivec -mabi=no-altivec @gol
@ -7225,6 +7226,13 @@ On System V.4 and embedded PowerPC systems compile code for the
processor in big endian mode. The @option{-mbig-endian} option is
the same as @option{-mbig}.
@item -mdynamic-no-pic
@opindex mdynamic-no-pic
On Darwin and Mac OS X systems, compile code so that it is not
relocatable, but that its external references are relocatable. The
resulting code is suitable for applications, but not shared
libraries.
@item -mcall-sysv
@opindex mcall-sysv
On System V.4 and embedded PowerPC systems compile code using calling