Commit e7c64c7d by Nathan Froyd Committed by Nathan Froyd

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
parent b4a4e6ae
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> 2010-08-08 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR boehm-gc/34544 PR boehm-gc/34544
......
...@@ -24499,7 +24499,16 @@ rs6000_fatal_bad_address (rtx op) ...@@ -24499,7 +24499,16 @@ rs6000_fatal_bad_address (rtx op)
#if TARGET_MACHO #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 /* Remember to generate a branch island for far calls to the given
function. */ function. */
...@@ -24508,37 +24517,29 @@ static void ...@@ -24508,37 +24517,29 @@ static void
add_compiler_branch_island (tree label_name, tree function_name, add_compiler_branch_island (tree label_name, tree function_name,
int line_number) int line_number)
{ {
tree branch_island = build_tree_list (function_name, label_name); branch_island *bi = VEC_safe_push (branch_island, gc, branch_islands, NULL);
TREE_TYPE (branch_island) = build_int_cst (NULL_TREE, line_number);
TREE_CHAIN (branch_island) = branch_island_list;
branch_island_list = branch_island;
}
#define BRANCH_ISLAND_LABEL_NAME(BRANCH_ISLAND) TREE_VALUE (BRANCH_ISLAND) bi->function_name = function_name;
#define BRANCH_ISLAND_FUNCTION_NAME(BRANCH_ISLAND) TREE_PURPOSE (BRANCH_ISLAND) bi->label_name = label_name;
#define BRANCH_ISLAND_LINE_NUMBER(BRANCH_ISLAND) \ bi->line_number = line_number;
TREE_INT_CST_LOW (TREE_TYPE (BRANCH_ISLAND)) }
/* Generate far-jump branch islands for everything on the /* Generate far-jump branch islands for everything recorded in
branch_island_list. Invoked immediately after the last instruction branch_islands. Invoked immediately after the last instruction of
of the epilogue has been emitted; the branch-islands must be the epilogue has been emitted; the branch islands must be appended
appended to, and contiguous with, the function body. Mach-O stubs to, and contiguous with, the function body. Mach-O stubs are
are generated in machopic_output_stub(). */ generated in machopic_output_stub(). */
static void static void
macho_branch_islands (void) macho_branch_islands (void)
{ {
char tmp_buf[512]; char tmp_buf[512];
tree branch_island;
for (branch_island = branch_island_list; while (!VEC_empty (branch_island, branch_islands))
branch_island;
branch_island = TREE_CHAIN (branch_island))
{ {
const char *label = branch_island *bi = VEC_last (branch_island, branch_islands);
IDENTIFIER_POINTER (BRANCH_ISLAND_LABEL_NAME (branch_island)); const char *label = IDENTIFIER_POINTER (bi->label_name);
const char *name = const char *name = IDENTIFIER_POINTER (bi->function_name);
IDENTIFIER_POINTER (BRANCH_ISLAND_FUNCTION_NAME (branch_island));
char name_buf[512]; char name_buf[512];
/* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF(). */ /* Cheap copy of the details from the Darwin ASM_OUTPUT_LABELREF(). */
if (name[0] == '*' || name[0] == '&') if (name[0] == '*' || name[0] == '&')
...@@ -24552,7 +24553,7 @@ macho_branch_islands (void) ...@@ -24552,7 +24553,7 @@ macho_branch_islands (void)
strcat (tmp_buf, label); strcat (tmp_buf, label);
#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO) #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG) 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 */ #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */
if (flag_pic) if (flag_pic)
{ {
...@@ -24589,11 +24590,10 @@ macho_branch_islands (void) ...@@ -24589,11 +24590,10 @@ macho_branch_islands (void)
output_asm_insn (tmp_buf, 0); output_asm_insn (tmp_buf, 0);
#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO) #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG) 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 */ #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 /* NO_PREVIOUS_DEF checks in the link list whether the function name is
...@@ -24602,11 +24602,11 @@ macho_branch_islands (void) ...@@ -24602,11 +24602,11 @@ macho_branch_islands (void)
static int static int
no_previous_def (tree function_name) no_previous_def (tree function_name)
{ {
tree branch_island; branch_island *bi;
for (branch_island = branch_island_list; unsigned ix;
branch_island;
branch_island = TREE_CHAIN (branch_island)) for (ix = 0; VEC_iterate (branch_island, branch_islands, ix, bi); ix++)
if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island)) if (function_name == bi->function_name)
return 0; return 0;
return 1; return 1;
} }
...@@ -24617,13 +24617,13 @@ no_previous_def (tree function_name) ...@@ -24617,13 +24617,13 @@ no_previous_def (tree function_name)
static tree static tree
get_prev_label (tree function_name) get_prev_label (tree function_name)
{ {
tree branch_island; branch_island *bi;
for (branch_island = branch_island_list; unsigned ix;
branch_island;
branch_island = TREE_CHAIN (branch_island)) for (ix = 0; VEC_iterate (branch_island, branch_islands, ix, bi); ix++)
if (function_name == BRANCH_ISLAND_FUNCTION_NAME (branch_island)) if (function_name == bi->function_name)
return BRANCH_ISLAND_LABEL_NAME (branch_island); return bi->label_name;
return 0; return NULL_TREE;
} }
/* INSN is either a function call or a millicode call. It may have an /* INSN is either a function call or a millicode call. It may have an
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment