Partial Fix PR/10129
2003-07-17 Andrew Pinski <pinskia@physics.uc.edu> Partial Fix PR/10129 * config/darwin.c (machopic_function_base_name): Only Return "<pic base>". (machopic_output_function_base_name): New; print the true pic label. (machopic_classify_ident): Pic Base is always a defined data. * config/darwin.h (ASM_OUTPUT_LABELREF): Support the pic base label. * config/darwin-proto.h (machopic_output_function_base_name): Prototype. From-SVN: r69472
This commit is contained in:
parent
db2f435bea
commit
1622229cb1
4 changed files with 42 additions and 34 deletions
|
@ -1,3 +1,12 @@
|
|||
2003-07-17 Andrew Pinski <pinskia@physics.uc.edu>
|
||||
|
||||
Partial Fix PR/10129
|
||||
* config/darwin.c (machopic_function_base_name): Only Return "<pic base>".
|
||||
(machopic_output_function_base_name): New; print the true pic label.
|
||||
(machopic_classify_ident): Pic Base is always a defined data.
|
||||
* config/darwin.h (ASM_OUTPUT_LABELREF): Support the pic base label.
|
||||
* config/darwin-proto.h (machopic_output_function_base_name): Prototype.
|
||||
|
||||
2003-07-16 Andrew Pinski <pinskia@physics.uc.edu>
|
||||
|
||||
* gcse.c (gcse_constant_p): COMPARE of the same registers is a constant
|
||||
|
|
|
@ -23,6 +23,7 @@ extern int name_needs_quotes PARAMS ((const char *));
|
|||
extern void machopic_validate_stub_or_non_lazy_ptr PARAMS ((const char *, int));
|
||||
|
||||
extern const char *machopic_function_base_name PARAMS ((void));
|
||||
extern void machopic_output_function_base_name (FILE *);
|
||||
extern const char *machopic_non_lazy_ptr_name PARAMS ((const char*));
|
||||
extern const char *machopic_stub_name PARAMS ((const char*));
|
||||
|
||||
|
|
|
@ -81,6 +81,10 @@ machopic_classify_ident (ident)
|
|||
&& name[4] == 'C'
|
||||
&& name[5] == '_'));
|
||||
tree temp;
|
||||
|
||||
/* The PIC base symbol is always defined. */
|
||||
if (! strcmp (name, "<pic base>"))
|
||||
return MACHOPIC_DEFINED_DATA;
|
||||
|
||||
if (name[0] != '!')
|
||||
{
|
||||
|
@ -218,56 +222,48 @@ machopic_define_name (name)
|
|||
machopic_define_ident (get_identifier (name));
|
||||
}
|
||||
|
||||
/* This is a static to make inline functions work. The rtx
|
||||
representing the PIC base symbol always points to here.
|
||||
|
||||
FIXME: The rest of the compiler doesn't expect strings to change. */
|
||||
|
||||
static GTY(()) char * function_base;
|
||||
static GTY(()) const char * function_base_func_name;
|
||||
static GTY(()) int current_pic_label_num;
|
||||
|
||||
const char *
|
||||
machopic_function_base_name ()
|
||||
{
|
||||
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 (function_base_func_name != current_name)
|
||||
{
|
||||
current_function_uses_pic_offset_table = 1;
|
||||
if (function_base == NULL)
|
||||
function_base =
|
||||
(char *) ggc_alloc_string ("<pic base>", sizeof ("<pic base>"));
|
||||
|
||||
/* Save mucho space and time. Some of the C++ mangled names are over
|
||||
700 characters long! Note that we produce a label containing a '-'
|
||||
if the function we're compiling is an Objective-C method, as evinced
|
||||
by the incredibly scientific test below. This is because code in
|
||||
rs6000.c makes the same ugly test when loading the PIC reg. */
|
||||
|
||||
/* It's hard to describe just how ugly this is. The reason for
|
||||
the '%011d' is that after a PCH load, we can't change the
|
||||
size of the string, because PCH will have uniqued it and
|
||||
allocated it in the string pool. */
|
||||
if (function_base == NULL)
|
||||
function_base =
|
||||
(char *) ggc_alloc_string ("", sizeof ("*\"L12345678901$pb\""));
|
||||
|
||||
++current_pic_label_num;
|
||||
if (*current_name == '+' || *current_name == '-')
|
||||
sprintf (function_base, "*\"L-%010d$pb\"", current_pic_label_num);
|
||||
else
|
||||
sprintf (function_base, "*\"L%011d$pb\"", current_pic_label_num);
|
||||
|
||||
function_base_func_name = current_name;
|
||||
}
|
||||
current_function_uses_pic_offset_table = 1;
|
||||
|
||||
return function_base;
|
||||
}
|
||||
|
||||
static GTY(()) const char * function_base_func_name;
|
||||
static GTY(()) int current_pic_label_num;
|
||||
|
||||
void
|
||||
machopic_output_function_base_name (FILE *file)
|
||||
{
|
||||
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 (function_base_func_name != current_name)
|
||||
{
|
||||
++current_pic_label_num;
|
||||
function_base_func_name = current_name;
|
||||
}
|
||||
fprintf (file, "\"L%011d$pb\"", current_pic_label_num);
|
||||
}
|
||||
|
||||
static GTY(()) tree machopic_non_lazy_pointers;
|
||||
|
||||
/* Return a non-lazy pointer name corresponding to the given name,
|
||||
|
|
|
@ -396,7 +396,9 @@ do { text_section (); \
|
|||
#define ASM_OUTPUT_LABELREF(FILE,NAME) \
|
||||
do { \
|
||||
const char *xname = darwin_strip_name_encoding (NAME); \
|
||||
if (xname[0] == '&' || xname[0] == '*') \
|
||||
if (! strcmp (xname, "<pic base>")) \
|
||||
machopic_output_function_base_name(FILE); \
|
||||
else if (xname[0] == '&' || xname[0] == '*') \
|
||||
{ \
|
||||
int len = strlen (xname); \
|
||||
if (len > 6 && !strcmp ("$stub", xname + len - 5)) \
|
||||
|
|
Loading…
Add table
Reference in a new issue