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:
parent
b4a4e6ae0e
commit
e7c64c7dc1
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user