aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Froyd <froydnj@codesourcery.com>2010-08-08 17:39:49 +0000
committerNathan Froyd <froydnj@gcc.gnu.org>2010-08-08 17:39:49 +0000
commite7c64c7dc154b9a018b137d7679cd3cd8e4d568d (patch)
tree8f3daa27d33b9bbe2bc5a94b4c007f4b427137aa /gcc
parentb4a4e6ae0e06179b1ab6f91af0f6a60ca301aa75 (diff)
downloadgcc-e7c64c7dc154b9a018b137d7679cd3cd8e4d568d.zip
gcc-e7c64c7dc154b9a018b137d7679cd3cd8e4d568d.tar.gz
gcc-e7c64c7dc154b9a018b137d7679cd3cd8e4d568d.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/config/rs6000/rs6000.c78
2 files changed, 50 insertions, 39 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e4ce027..4c565b3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 0f1f040..5d465b8 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -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);
-#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))
+ bi->function_name = function_name;
+ bi->label_name = label_name;
+ bi->line_number = line_number;
+}
-/* 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