alpha.c (SYMBOL_FLAG_NEAR, [...]): Remove.
* config/alpha/alpha.c (SYMBOL_FLAG_NEAR, SYMBOL_FLAG_SAMEGP): Remove. (alpha_end_function): Don't set them. (decl_in_text_section): Remove. (alpha_encode_section_info): Remove. (samegp_function_operand): Use SYMBOL_REF LOCAL_P and EXTERNAL_P. (direct_call_operand): Use SYMBOL_REF_DECL and compare actual sections, rather than decl_in_text_section results. From-SVN: r65785
This commit is contained in:
parent
0b176c1af2
commit
59c60a985d
@ -1,3 +1,13 @@
|
|||||||
|
2003-04-18 Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
|
* config/alpha/alpha.c (SYMBOL_FLAG_NEAR, SYMBOL_FLAG_SAMEGP): Remove.
|
||||||
|
(alpha_end_function): Don't set them.
|
||||||
|
(decl_in_text_section): Remove.
|
||||||
|
(alpha_encode_section_info): Remove.
|
||||||
|
(samegp_function_operand): Use SYMBOL_REF LOCAL_P and EXTERNAL_P.
|
||||||
|
(direct_call_operand): Use SYMBOL_REF_DECL and compare actual
|
||||||
|
sections, rather than decl_in_text_section results.
|
||||||
|
|
||||||
2003-04-18 Roger Sayle <roger@eyesopen.com>
|
2003-04-18 Roger Sayle <roger@eyesopen.com>
|
||||||
|
|
||||||
* rtlanal.c (reg_overlap_mentioned_p): Handle ZERO_EXTRACT
|
* rtlanal.c (reg_overlap_mentioned_p): Handle ZERO_EXTRACT
|
||||||
|
@ -171,10 +171,6 @@ static struct alpha_rtx_cost_data const alpha_rtx_cost_data[PROCESSOR_MAX] =
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Machine-specific symbol_ref flags. */
|
|
||||||
#define SYMBOL_FLAG_NEAR (SYMBOL_FLAG_MACH_DEP << 0)
|
|
||||||
#define SYMBOL_FLAG_SAMEGP (SYMBOL_FLAG_MACH_DEP << 1)
|
|
||||||
|
|
||||||
/* Declarations of static functions. */
|
/* Declarations of static functions. */
|
||||||
static bool alpha_function_ok_for_sibcall
|
static bool alpha_function_ok_for_sibcall
|
||||||
PARAMS ((tree, tree));
|
PARAMS ((tree, tree));
|
||||||
@ -182,14 +178,10 @@ static int tls_symbolic_operand_1
|
|||||||
PARAMS ((rtx, enum machine_mode, int, int));
|
PARAMS ((rtx, enum machine_mode, int, int));
|
||||||
static enum tls_model tls_symbolic_operand_type
|
static enum tls_model tls_symbolic_operand_type
|
||||||
PARAMS ((rtx));
|
PARAMS ((rtx));
|
||||||
static bool decl_in_text_section
|
|
||||||
PARAMS ((tree));
|
|
||||||
static bool decl_has_samegp
|
static bool decl_has_samegp
|
||||||
PARAMS ((tree));
|
PARAMS ((tree));
|
||||||
static bool alpha_in_small_data_p
|
static bool alpha_in_small_data_p
|
||||||
PARAMS ((tree));
|
PARAMS ((tree));
|
||||||
static void alpha_encode_section_info
|
|
||||||
PARAMS ((tree, int));
|
|
||||||
static rtx get_tls_get_addr
|
static rtx get_tls_get_addr
|
||||||
PARAMS ((void));
|
PARAMS ((void));
|
||||||
static int some_small_symbolic_operand_1
|
static int some_small_symbolic_operand_1
|
||||||
@ -301,8 +293,6 @@ static void vms_asm_out_destructor PARAMS ((rtx, int));
|
|||||||
|
|
||||||
#undef TARGET_IN_SMALL_DATA_P
|
#undef TARGET_IN_SMALL_DATA_P
|
||||||
#define TARGET_IN_SMALL_DATA_P alpha_in_small_data_p
|
#define TARGET_IN_SMALL_DATA_P alpha_in_small_data_p
|
||||||
#undef TARGET_ENCODE_SECTION_INFO
|
|
||||||
#define TARGET_ENCODE_SECTION_INFO alpha_encode_section_info
|
|
||||||
|
|
||||||
#if TARGET_ABI_UNICOSMK
|
#if TARGET_ABI_UNICOSMK
|
||||||
static void unicosmk_asm_named_section PARAMS ((const char *, unsigned int));
|
static void unicosmk_asm_named_section PARAMS ((const char *, unsigned int));
|
||||||
@ -1045,15 +1035,27 @@ samegp_function_operand (op, mode)
|
|||||||
enum machine_mode mode ATTRIBUTE_UNUSED;
|
enum machine_mode mode ATTRIBUTE_UNUSED;
|
||||||
{
|
{
|
||||||
if (GET_CODE (op) != SYMBOL_REF)
|
if (GET_CODE (op) != SYMBOL_REF)
|
||||||
return 0;
|
return false;
|
||||||
|
|
||||||
/* Easy test for recursion. */
|
/* Easy test for recursion. */
|
||||||
if (op == XEXP (DECL_RTL (current_function_decl), 0))
|
if (op == XEXP (DECL_RTL (current_function_decl), 0))
|
||||||
return 1;
|
return true;
|
||||||
|
|
||||||
/* Otherwise, encode_section_info recorded whether we are to treat
|
/* Functions that are not local can be overridden, and thus may
|
||||||
this symbol as having the same GP. */
|
not share the same gp. */
|
||||||
return (SYMBOL_REF_FLAGS (op) & SYMBOL_FLAG_SAMEGP) != 0;
|
if (! SYMBOL_REF_LOCAL_P (op))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* If -msmall-data is in effect, assume that there is only one GP
|
||||||
|
for the module, and so any local symbol has this property. We
|
||||||
|
need explicit relocations to be able to enforce this for symbols
|
||||||
|
not defined in this unit of translation, however. */
|
||||||
|
if (TARGET_EXPLICIT_RELOCS && TARGET_SMALL_DATA)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* Functions that are not external are defined in this UoT,
|
||||||
|
and thus must share the same gp. */
|
||||||
|
return ! SYMBOL_REF_EXTERNAL_P (op);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return 1 if OP is a SYMBOL_REF for which we can make a call via bsr. */
|
/* Return 1 if OP is a SYMBOL_REF for which we can make a call via bsr. */
|
||||||
@ -1063,11 +1065,11 @@ direct_call_operand (op, mode)
|
|||||||
rtx op;
|
rtx op;
|
||||||
enum machine_mode mode;
|
enum machine_mode mode;
|
||||||
{
|
{
|
||||||
bool is_near;
|
tree op_decl, cfun_sec, op_sec;
|
||||||
|
|
||||||
/* Must share the same GP. */
|
/* Must share the same GP. */
|
||||||
if (!samegp_function_operand (op, mode))
|
if (!samegp_function_operand (op, mode))
|
||||||
return 0;
|
return false;
|
||||||
|
|
||||||
/* If profiling is implemented via linker tricks, we can't jump
|
/* If profiling is implemented via linker tricks, we can't jump
|
||||||
to the nogp alternate entry point. Note that current_function_profile
|
to the nogp alternate entry point. Note that current_function_profile
|
||||||
@ -1077,18 +1079,36 @@ direct_call_operand (op, mode)
|
|||||||
but is approximately correct for the OSF ABIs. Don't know
|
but is approximately correct for the OSF ABIs. Don't know
|
||||||
what to do for VMS, NT, or UMK. */
|
what to do for VMS, NT, or UMK. */
|
||||||
if (!TARGET_PROFILING_NEEDS_GP && profile_flag)
|
if (!TARGET_PROFILING_NEEDS_GP && profile_flag)
|
||||||
return 0;
|
return false;
|
||||||
|
|
||||||
is_near = (SYMBOL_REF_FLAGS (op) & SYMBOL_FLAG_NEAR) != 0;
|
|
||||||
|
|
||||||
|
/* Must be a function. In some cases folks create thunks in static
|
||||||
|
data structures and then make calls to them. If we allow the
|
||||||
|
direct call, we'll get an error from the linker about !samegp reloc
|
||||||
|
against a symbol without a .prologue directive. */
|
||||||
|
if (!SYMBOL_REF_FUNCTION_P (op))
|
||||||
|
return false;
|
||||||
|
|
||||||
/* Must be "near" so that the branch is assumed to reach. With
|
/* Must be "near" so that the branch is assumed to reach. With
|
||||||
-msmall-text, this is true of all local symbols. */
|
-msmall-text, this is assumed true of all local symbols. Since
|
||||||
|
we've already checked samegp, locality is already assured. */
|
||||||
if (TARGET_SMALL_TEXT)
|
if (TARGET_SMALL_TEXT)
|
||||||
return is_near;
|
return true;
|
||||||
|
|
||||||
/* Otherwise, a decl is "near" if it is defined in the same section.
|
/* Otherwise, a decl is "near" if it is defined in the same section. */
|
||||||
See alpha_encode_section_info for commentary. */
|
if (flag_function_sections)
|
||||||
return is_near && decl_in_text_section (cfun->decl);
|
return false;
|
||||||
|
|
||||||
|
op_decl = SYMBOL_REF_DECL (op);
|
||||||
|
if (DECL_ONE_ONLY (current_function_decl)
|
||||||
|
|| (op_decl && DECL_ONE_ONLY (op_decl)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
cfun_sec = DECL_SECTION_NAME (current_function_decl);
|
||||||
|
op_sec = op_decl ? DECL_SECTION_NAME (op_decl) : NULL;
|
||||||
|
return ((!cfun_sec && !op_sec)
|
||||||
|
|| (cfun_sec && op_sec
|
||||||
|
&& strcmp (TREE_STRING_POINTER (cfun_sec),
|
||||||
|
TREE_STRING_POINTER (op_sec)) == 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return true if OP is a LABEL_REF, or SYMBOL_REF or CONST referencing
|
/* Return true if OP is a LABEL_REF, or SYMBOL_REF or CONST referencing
|
||||||
@ -1818,22 +1838,6 @@ tls_symbolic_operand_type (symbol)
|
|||||||
return model;
|
return model;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return true if the function DECL will be placed in the default text
|
|
||||||
section. */
|
|
||||||
/* ??? Ideally we'd be able to always move from a SYMBOL_REF back to the
|
|
||||||
decl, as that would allow us to determine if two functions are in the
|
|
||||||
same section, which is what we really want to know. */
|
|
||||||
|
|
||||||
static bool
|
|
||||||
decl_in_text_section (decl)
|
|
||||||
tree decl;
|
|
||||||
{
|
|
||||||
return (DECL_SECTION_NAME (decl) == NULL_TREE
|
|
||||||
&& ! (flag_function_sections
|
|
||||||
|| (targetm.have_named_sections
|
|
||||||
&& DECL_ONE_ONLY (decl))));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return true if the function DECL will share the same GP as any
|
/* Return true if the function DECL will share the same GP as any
|
||||||
function in the current unit of translation. */
|
function in the current unit of translation. */
|
||||||
|
|
||||||
@ -1889,58 +1893,6 @@ alpha_in_small_data_p (exp)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we are referencing a function that is static, make the SYMBOL_REF
|
|
||||||
special. We use this to see indicate we can branch to this function
|
|
||||||
without setting PV or restoring GP.
|
|
||||||
|
|
||||||
If this is a variable that is known to be defined locally, add "@v"
|
|
||||||
to the name. If in addition the variable is to go in .sdata/.sbss,
|
|
||||||
then add "@s" instead. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
alpha_encode_section_info (decl, first)
|
|
||||||
tree decl;
|
|
||||||
int first;
|
|
||||||
{
|
|
||||||
default_encode_section_info (decl, first);
|
|
||||||
|
|
||||||
if (TREE_CODE (decl) == FUNCTION_DECL)
|
|
||||||
{
|
|
||||||
rtx symbol = XEXP (DECL_RTL (decl), 0);
|
|
||||||
int flags = SYMBOL_REF_FLAGS (symbol);
|
|
||||||
|
|
||||||
/* Mark whether the decl is "near" in distance. If -msmall-text is
|
|
||||||
in effect, this is trivially true of all local symbols. */
|
|
||||||
if (TARGET_SMALL_TEXT)
|
|
||||||
{
|
|
||||||
if (flags & SYMBOL_FLAG_LOCAL)
|
|
||||||
flags |= SYMBOL_FLAG_NEAR;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Otherwise, a decl is "near" if it is defined in this same
|
|
||||||
section. What we really need is to be able to access the
|
|
||||||
target decl of a call from the call_insn pattern, so that
|
|
||||||
we can determine if the call is from the same section. We
|
|
||||||
can't do that at present, so handle the common case and
|
|
||||||
match up .text with .text.
|
|
||||||
|
|
||||||
Delay marking public functions until they are emitted; otherwise
|
|
||||||
we don't know that they exist in this unit of translation. */
|
|
||||||
/* Now we *DO* have access to SYMBOL_REF_DECL. Fixme. */
|
|
||||||
if (!TREE_PUBLIC (decl) && decl_in_text_section (decl))
|
|
||||||
flags |= SYMBOL_FLAG_NEAR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Indicate whether the target function shares the same GP as any
|
|
||||||
function emitted in this unit of translation. */
|
|
||||||
if (decl_has_samegp (decl))
|
|
||||||
flags |= SYMBOL_FLAG_SAMEGP;
|
|
||||||
|
|
||||||
SYMBOL_REF_FLAGS (symbol) = flags;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if TARGET_ABI_OPEN_VMS
|
#if TARGET_ABI_OPEN_VMS
|
||||||
static bool
|
static bool
|
||||||
alpha_linkage_symbol_p (symname)
|
alpha_linkage_symbol_p (symname)
|
||||||
@ -8070,7 +8022,7 @@ void
|
|||||||
alpha_end_function (file, fnname, decl)
|
alpha_end_function (file, fnname, decl)
|
||||||
FILE *file;
|
FILE *file;
|
||||||
const char *fnname;
|
const char *fnname;
|
||||||
tree decl;
|
tree decl ATTRIBUTE_UNUSED;
|
||||||
{
|
{
|
||||||
/* End the function. */
|
/* End the function. */
|
||||||
if (!TARGET_ABI_UNICOSMK && !flag_inhibit_size_directive)
|
if (!TARGET_ABI_UNICOSMK && !flag_inhibit_size_directive)
|
||||||
@ -8085,26 +8037,6 @@ alpha_end_function (file, fnname, decl)
|
|||||||
alpha_write_linkage (file, fnname, decl);
|
alpha_write_linkage (file, fnname, decl);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Show that we know this function if it is called again.
|
|
||||||
This is only meaningful for symbols that bind locally. */
|
|
||||||
if ((*targetm.binds_local_p) (decl))
|
|
||||||
{
|
|
||||||
rtx symbol = XEXP (DECL_RTL (decl), 0);
|
|
||||||
int flags = SYMBOL_REF_FLAGS (symbol);
|
|
||||||
|
|
||||||
/* Mark whether the decl is "near". See the commentary in
|
|
||||||
alpha_encode_section_info wrt the .text section. */
|
|
||||||
if (decl_in_text_section (decl))
|
|
||||||
flags |= SYMBOL_FLAG_NEAR;
|
|
||||||
|
|
||||||
/* Mark whether the decl shares a GP with other functions
|
|
||||||
in this unit of translation. This is trivially true of
|
|
||||||
local symbols. */
|
|
||||||
flags |= SYMBOL_FLAG_SAMEGP;
|
|
||||||
|
|
||||||
SYMBOL_REF_FLAGS (symbol) = flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Output jump tables and the static subroutine information block. */
|
/* Output jump tables and the static subroutine information block. */
|
||||||
if (TARGET_ABI_UNICOSMK)
|
if (TARGET_ABI_UNICOSMK)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user