darwin.h (ENCODE_SECTION_INFO): Define.

* config/darwin.h (ENCODE_SECTION_INFO): Define.
        (REDO_SECTION_INFO_P): Ditto.
        (STRIP_NAME_ENCODING): Ditto.
        (ASM_DECLARE_OBJECT_NAME): Use ENCODE_SECTION_INFO.
        (ASM_OUTPUT_ALIGNED_DECL_LOCAL): Ditto.
        (ASM_OUTPUT_LABELREF): Use STRIP_NAME_ENCODING.
        (GEN_LAZY_PTR_NAME_FOR_SYMBOL): Ditto.
        * config/darwin.c: No longer include c-tree.h.
        (machopic_classify_ident): Rewrite to use symbol encoding.
        (lookup_name_darwin): Remove.
        (machopic_non_lazy_ptr_name): Handle encoded symbols.
        (machopic_stub_name): Use STRIP_NAME_ENCODING.
        (machopic_validate_stub_or_non_lazy_ptr): Ditto.
        (machopic_finish): Ditto, remove test of decl.
        (update_non_lazy_ptrs): New function.
        (darwin_encode_section_info): New function.
        * config/darwin-protos.h: Declare it.
        * config/rs6000/rs6000.c (machopic_output_stub): Use
        STRIP_NAME_ENCODING.

From-SVN: r42994
This commit is contained in:
Stan Shebs 2001-06-08 02:28:04 +00:00 committed by Stan Shebs
parent daa8df6512
commit df56a27fb8
5 changed files with 162 additions and 46 deletions

View File

@ -1,3 +1,25 @@
2001-06-07 Stan Shebs <shebs@apple.com>
* config/darwin.h (ENCODE_SECTION_INFO): Define.
(REDO_SECTION_INFO_P): Ditto.
(STRIP_NAME_ENCODING): Ditto.
(ASM_DECLARE_OBJECT_NAME): Use ENCODE_SECTION_INFO.
(ASM_OUTPUT_ALIGNED_DECL_LOCAL): Ditto.
(ASM_OUTPUT_LABELREF): Use STRIP_NAME_ENCODING.
(GEN_LAZY_PTR_NAME_FOR_SYMBOL): Ditto.
* config/darwin.c: No longer include c-tree.h.
(machopic_classify_ident): Rewrite to use symbol encoding.
(lookup_name_darwin): Remove.
(machopic_non_lazy_ptr_name): Handle encoded symbols.
(machopic_stub_name): Use STRIP_NAME_ENCODING.
(machopic_validate_stub_or_non_lazy_ptr): Ditto.
(machopic_finish): Ditto, remove test of decl.
(update_non_lazy_ptrs): New function.
(darwin_encode_section_info): New function.
* config/darwin-protos.h: Declare it.
* config/rs6000/rs6000.c (machopic_output_stub): Use
STRIP_NAME_ENCODING.
2001-06-07 Mark Mitchell <mark@codesourcery.com>
* tree.h (DECL_SOURCE_FILE): Improve documentation.

View File

@ -51,6 +51,7 @@ extern void machopic_define_ident PARAMS ((tree));
extern void machopic_define_name PARAMS ((const char*));
extern int machopic_name_defined_p PARAMS ((const char*));
extern int machopic_ident_defined_p PARAMS ((tree));
extern void darwin_encode_section_info PARAMS ((tree));
#endif /* TREE_CODE */

View File

@ -35,8 +35,6 @@ Boston, MA 02111-1307, USA. */
#include "tree.h"
#include "expr.h"
#include "reload.h"
/* need for IDENTIFIER_GLOBAL_VALUE and IDENTIFIER_LOCAL_VALUE */
#include "c-tree.h"
#include "function.h"
#include "ggc.h"
@ -46,6 +44,7 @@ extern void machopic_output_stub PARAMS ((FILE *, const char *, const char *));
static int machopic_data_defined_p PARAMS ((const char *));
static int func_name_maybe_scoped PARAMS ((const char *));
static void update_non_lazy_ptrs PARAMS ((const char *));
/* Make everything that used to go in the text section really go there. */
@ -85,10 +84,11 @@ machopic_classify_ident (ident)
&& name[3] == 'J'
&& name[4] == 'C'
&& name[5] == '_'));
tree temp, decl = lookup_name_darwin (ident);
tree temp;
if (!decl)
if (name[0] != '!')
{
/* Here if no special encoding to be found. */
if (lprefix)
{
const char *name = IDENTIFIER_POINTER (ident);
@ -114,36 +114,24 @@ machopic_classify_ident (ident)
return MACHOPIC_UNDEFINED;
}
/* variable declarations */
else if (TREE_CODE (decl) == VAR_DECL)
{
if ((DECL_INITIAL (decl)
|| TREE_STATIC (decl))
&& ! TREE_PUBLIC (decl))
return MACHOPIC_DEFINED_DATA;
}
else if (name[1] == 'D')
return MACHOPIC_DEFINED_DATA;
/* function declarations */
else if (TREE_CODE (decl) == FUNCTION_DECL
&& (!DECL_EXTERNAL (decl)))
{
if (TREE_STATIC (decl)
|| TREE_ASM_WRITTEN (decl))
return MACHOPIC_DEFINED_FUNCTION;
}
else if (name[1] == 'T')
return MACHOPIC_DEFINED_FUNCTION;
for (temp = machopic_defined_list; temp != NULL_TREE; temp = TREE_CHAIN (temp))
{
if (ident == TREE_VALUE (temp))
{
if (TREE_CODE (decl) == FUNCTION_DECL)
if (name[1] == 'T')
return MACHOPIC_DEFINED_FUNCTION;
else
return MACHOPIC_DEFINED_DATA;
}
}
if (TREE_CODE (decl) == FUNCTION_DECL)
if (name[1] == 't' || name[1] == 'T')
{
if (lprefix)
return MACHOPIC_DEFINED_FUNCTION;
@ -218,20 +206,6 @@ machopic_define_name (name)
machopic_define_ident (get_identifier (name));
}
tree
lookup_name_darwin (name)
tree name;
{
tree val;
if (!global_bindings_p()
&& IDENTIFIER_LOCAL_VALUE (name))
val = IDENTIFIER_LOCAL_VALUE (name);
else
val = IDENTIFIER_GLOBAL_VALUE (name);
return val;
}
/* This is a static to make inline functions work. The rtx
representing the PIC base symbol always points to here. */
@ -279,6 +253,7 @@ char *
machopic_non_lazy_ptr_name (name)
const char *name;
{
char *temp_name;
tree temp, ident = get_identifier (name);
for (temp = machopic_non_lazy_pointers;
@ -289,6 +264,22 @@ machopic_non_lazy_ptr_name (name)
return IDENTIFIER_POINTER (TREE_PURPOSE (temp));
}
STRIP_NAME_ENCODING (name, name);
/* Try again, but comparing names this time. */
for (temp = machopic_non_lazy_pointers;
temp != NULL_TREE;
temp = TREE_CHAIN (temp))
{
if (TREE_VALUE (temp))
{
temp_name = IDENTIFIER_POINTER (TREE_VALUE (temp));
STRIP_NAME_ENCODING (temp_name, temp_name);
if (strcmp (name, temp_name) == 0)
return IDENTIFIER_POINTER (TREE_PURPOSE (temp));
}
}
{
char *buffer;
tree ptr_name;
@ -345,6 +336,8 @@ machopic_stub_name (name)
return IDENTIFIER_POINTER (TREE_PURPOSE (temp));
}
STRIP_NAME_ENCODING (name, name);
{
char *buffer;
tree ptr_name;
@ -384,7 +377,8 @@ machopic_validate_stub_or_non_lazy_ptr (name, validate_stub)
const char *name;
int validate_stub;
{
tree temp, ident = get_identifier (name);
char *real_name;
tree temp, ident = get_identifier (name), id2;
for (temp = (validate_stub ? machopic_stubs : machopic_non_lazy_pointers);
temp != NULL_TREE;
@ -396,6 +390,10 @@ machopic_validate_stub_or_non_lazy_ptr (name, validate_stub)
TREE_USED (temp) = 1;
if (TREE_CODE (TREE_VALUE (temp)) == IDENTIFIER_NODE)
TREE_SYMBOL_REFERENCED (TREE_VALUE (temp)) = 1;
STRIP_NAME_ENCODING (real_name, IDENTIFIER_POINTER (TREE_VALUE (temp)));
id2 = maybe_get_identifier (real_name);
if (id2)
TREE_SYMBOL_REFERENCED (id2) = 1;
}
}
@ -890,19 +888,11 @@ machopic_finish (asm_out_file)
char *stub_name = IDENTIFIER_POINTER (TREE_PURPOSE (temp));
char *sym;
char *stub;
tree decl = lookup_name_darwin (TREE_VALUE (temp));
if (! TREE_USED (temp))
continue;
/* Don't emit stubs for static inline functions which have not
been compiled. */
if (decl
&& TREE_CODE (decl) == FUNCTION_DECL
&& DECL_INLINE (decl)
&& ! TREE_PUBLIC (decl)
&& ! TREE_ASM_WRITTEN (decl))
continue;
STRIP_NAME_ENCODING (sym_name, sym_name);
sym = alloca (strlen (sym_name) + 2);
if (sym_name[0] == '*' || sym_name[0] == '&')
@ -1000,3 +990,83 @@ machopic_operand_p (op)
return 0;
}
/* This function records whether a given name corresponds to a defined
or undefined function or variable, for machopic_classify_ident to
use later. */
void
darwin_encode_section_info (decl)
tree decl;
{
char code = '\0';
int defined = 0;
if ((TREE_CODE (decl) == FUNCTION_DECL
|| TREE_CODE (decl) == VAR_DECL)
&& ((TREE_STATIC (decl)
&& (!DECL_COMMON (decl) || !TREE_PUBLIC (decl)))
|| DECL_INITIAL (decl)))
defined = 1;
if (TREE_CODE (decl) == FUNCTION_DECL)
code = (defined ? 'T' : 't');
else if (TREE_CODE (decl) == VAR_DECL)
code = (defined ? 'D' : 'd');
if (code != '\0')
{
rtx sym_ref = XEXP (DECL_RTL (decl), 0);
if (*(XSTR (sym_ref, 0)) == '!')
{
(XSTR(sym_ref, 0))[1] = code;
update_non_lazy_ptrs (XSTR (sym_ref, 0));
return;
}
{
size_t len = strlen (XSTR (sym_ref, 0));
size_t newlen = len + 4;
char *str = alloca (newlen);
str[0] = '!';
str[1] = code;
str[2] = '_';
str[3] = '_';
memcpy (str + 4, XSTR (sym_ref, 0), len + 1);
XSTR (sym_ref, 0) = ggc_alloc_string (str, newlen);
}
}
}
/* Scan the list of non-lazy pointers and update any recorded names whose
stripped name matches the argument. */
static void
update_non_lazy_ptrs (name)
const char *name;
{
char *name1, *name2;
tree temp;
STRIP_NAME_ENCODING (name1, name);
for (temp = machopic_non_lazy_pointers;
temp != NULL_TREE;
temp = TREE_CHAIN (temp))
{
char *sym_name = IDENTIFIER_POINTER (TREE_VALUE (temp));
if (*sym_name == '!')
{
STRIP_NAME_ENCODING (name2, sym_name);
if (strcmp (name1, name2) == 0)
{
IDENTIFIER_POINTER (TREE_VALUE (temp)) = name;
break;
}
}
}
}

View File

@ -234,6 +234,10 @@ do { text_section (); \
&& (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
|| DECL_INITIAL (DECL)) \
machopic_define_name (xname); \
if ((TREE_STATIC (DECL) \
&& (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
|| DECL_INITIAL (DECL)) \
ENCODE_SECTION_INFO (DECL); \
ASM_OUTPUT_LABEL (FILE, xname); \
} while (0)
@ -243,6 +247,7 @@ do { text_section (); \
#undef ASM_OUTPUT_LABELREF
#define ASM_OUTPUT_LABELREF(FILE,NAME) \
do { \
STRIP_NAME_ENCODING (NAME, NAME); \
if (NAME[0] == '&') \
{ \
int len = strlen (NAME); \
@ -280,6 +285,10 @@ do { text_section (); \
fputs (".lcomm ", (FILE)); \
assemble_name ((FILE), (NAME)); \
fprintf ((FILE), ",%u,%u\n", (SIZE), floor_log2 ((ALIGN) / BITS_PER_UNIT)); \
if ((DECL) && ((TREE_STATIC (DECL) \
&& (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
|| DECL_INITIAL (DECL))) \
ENCODE_SECTION_INFO (DECL); \
if ((DECL) && ((TREE_STATIC (DECL) \
&& (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
|| DECL_INITIAL (DECL))) \
@ -705,6 +714,16 @@ enum machopic_addr_class {
#define MACHOPIC_JUST_INDIRECT (flag_pic == 1)
#define MACHOPIC_PURE (flag_pic == 2)
#define ENCODE_SECTION_INFO(DECL) \
darwin_encode_section_info (DECL)
/* Be conservative and always redo the encoding. */
#define REDO_SECTION_INFO_P(DECL) (1)
#define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \
((VAR) = ((SYMBOL_NAME[0] == '!') ? (SYMBOL_NAME) + 4 : (SYMBOL_NAME)))
#define GEN_BINDER_NAME_FOR_STUB(BUF,STUB,STUB_LENGTH) \
do { \
const char *stub_ = (STUB); \
@ -741,6 +760,7 @@ enum machopic_addr_class {
do { \
const char *symbol_ = (SYMBOL); \
char *buffer_ = (BUF); \
STRIP_NAME_ENCODING (symbol_, symbol_); \
if (symbol_[0] == '"') \
{ \
strcpy (buffer_, "\"L"); \

View File

@ -8406,6 +8406,9 @@ machopic_output_stub (file, symb, stub)
char *local_label_0, *local_label_1, *local_label_2;
static int label = 0;
/* Lose our funky encoding stuff so it doesn't contaminate the stub. */
STRIP_NAME_ENCODING (symb, symb);
label += 1;
length = strlen (stub);