rs6000.c (branch_island): Define.

* config/rs6000/rs6000.c (branch_island): Define.  Define a VEC of it.
	(branch_island_list): Delete.
	(branch_islands): Declare.
	(add_compiler_branch_island): Adjust for branch_islands instead of
	branch_island_list.
	(macho_branch_islands): Likewise.
	(no_previous_def): Likewise.
	(get_prev_label): Likewise.

From-SVN: r163011
This commit is contained in:
Nathan Froyd 2010-08-08 17:39:49 +00:00 committed by Nathan Froyd
parent b4a4e6ae0e
commit e7c64c7dc1
2 changed files with 50 additions and 39 deletions

View File

@ -1,3 +1,14 @@
2010-08-08 Nathan Froyd <froydnj@codesourcery.com>
* config/rs6000/rs6000.c (branch_island): Define. Define a VEC of it.
(branch_island_list): Delete.
(branch_islands): Declare.
(add_compiler_branch_island): Adjust for branch_islands instead of
branch_island_list.
(macho_branch_islands): Likewise.
(no_previous_def): Likewise.
(get_prev_label): Likewise.
2010-08-08 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR boehm-gc/34544

View File

@ -24499,7 +24499,16 @@ rs6000_fatal_bad_address (rtx op)
#if TARGET_MACHO
static tree branch_island_list = 0;
typedef struct branch_island_d {
tree function_name;
tree label_name;
int line_number;
} branch_island;
DEF_VEC_O(branch_island);
DEF_VEC_ALLOC_O(branch_island,gc);
static VEC(branch_island,gc) *branch_islands;
/* Remember to generate a branch island for far calls to the given
function. */
@ -24508,37 +24517,29 @@ static void
add_compiler_branch_island (tree label_name, tree function_name,
int line_number)
{
tree branch_island = build_tree_list (function_name, label_name);
TREE_TYPE (branch_island) = build_int_cst (NULL_TREE, line_number);
TREE_CHAIN (branch_island) = branch_island_list;
branch_island_list = branch_island;
branch_island *bi = VEC_safe_push (branch_island, gc, branch_islands, NULL);
bi->function_name = function_name;
bi->label_name = label_name;
bi->line_number = line_number;
}
#define BRANCH_ISLAND_LABEL_NAME(BRANCH_ISLAND) TREE_VALUE (BRANCH_ISLAND)
#define BRANCH_ISLAND_FUNCTION_NAME(BRANCH_ISLAND) TREE_PURPOSE (BRANCH_ISLAND)
#define BRANCH_ISLAND_LINE_NUMBER(BRANCH_ISLAND) \
TREE_INT_CST_LOW (TREE_TYPE (BRANCH_ISLAND))
/* Generate far-jump branch islands for everything on the
branch_island_list. Invoked immediately after the last instruction
of the epilogue has been emitted; the branch-islands must be
appended to, and contiguous with, the function body. Mach-O stubs
are generated in machopic_output_stub(). */
/* Generate far-jump branch islands for everything recorded in
branch_islands. Invoked immediately after the last instruction of
the epilogue has been emitted; the branch islands must be appended
to, and contiguous with, the function body. Mach-O stubs are
generated in machopic_output_stub(). */
static void
macho_branch_islands (void)
{
char tmp_buf[512];
tree branch_island;
for (branch_island = branch_island_list;
branch_island;
branch_island = TREE_CHAIN (branch_island))
while (!VEC_empty (branch_island, branch_islands))
{
const char *label =
IDENTIFIER_POINTER (BRANCH_ISLAND_LABEL_NAME (branch_island));
const char *name =
IDENTIFIER_POINTER (BRANCH_ISLAND_FUNCTION_NAME (branch_island));
branch_island *bi = VEC_last (branch_island, branch_islands);
const char *label = IDENTIFIER_POINTER (bi->label_name);
const char *name = IDENTIFIER_POINTER (bi->function_name);
char name_buf[512];
/* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF(). */
if (name[0] == '*' || name[0] == '&')
@ -24552,7 +24553,7 @@ macho_branch_islands (void)
strcat (tmp_buf, label);
#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
dbxout_stabd (N_SLINE, BRANCH_ISLAND_LINE_NUMBER (branch_island));
dbxout_stabd (N_SLINE, bi->line_number);
#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
if (flag_pic)
{
@ -24589,11 +24590,10 @@ macho_branch_islands (void)
output_asm_insn (tmp_buf, 0);
#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
dbxout_stabd (N_SLINE, BRANCH_ISLAND_LINE_NUMBER (branch_island));
dbxout_stabd (N_SLINE, bi->line_number);
#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
VEC_pop (branch_island, branch_islands);
}
branch_island_list = 0;
}
/* NO_PREVIOUS_DEF checks in the link list whether the function name is
@ -24602,11 +24602,11 @@ macho_branch_islands (void)
static int
no_previous_def (tree function_name)
{
tree branch_island;
for (branch_island = branch_island_list;
branch_island;
branch_island = TREE_CHAIN (branch_island))
if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
branch_island *bi;
unsigned ix;
for (ix = 0; VEC_iterate (branch_island, branch_islands, ix, bi); ix++)
if (function_name == bi->function_name)
return 0;
return 1;
}
@ -24617,13 +24617,13 @@ no_previous_def (tree function_name)
static tree
get_prev_label (tree function_name)
{
tree branch_island;
for (branch_island = branch_island_list;
branch_island;
branch_island = TREE_CHAIN (branch_island))
if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island))
return BRANCH_ISLAND_LABEL_NAME (branch_island);
return 0;
branch_island *bi;
unsigned ix;
for (ix = 0; VEC_iterate (branch_island, branch_islands, ix, bi); ix++)
if (function_name == bi->function_name)
return bi->label_name;
return NULL_TREE;
}
/* INSN is either a function call or a millicode call. It may have an