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:
Andrew Pinski 2003-07-16 19:05:53 +00:00 committed by Andrew Pinski
parent db2f435bea
commit 1622229cb1
4 changed files with 42 additions and 34 deletions

View file

@ -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

View file

@ -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*));

View file

@ -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,

View file

@ -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)) \