diff options
author | Nathan Froyd <froydnj@codesourcery.com> | 2010-08-08 17:39:49 +0000 |
---|---|---|
committer | Nathan Froyd <froydnj@gcc.gnu.org> | 2010-08-08 17:39:49 +0000 |
commit | e7c64c7dc154b9a018b137d7679cd3cd8e4d568d (patch) | |
tree | 8f3daa27d33b9bbe2bc5a94b4c007f4b427137aa /gcc | |
parent | b4a4e6ae0e06179b1ab6f91af0f6a60ca301aa75 (diff) | |
download | gcc-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/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 78 |
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 |