]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
rs6000.c (branch_island): Define.
authorNathan Froyd <froydnj@codesourcery.com>
Sun, 8 Aug 2010 17:39:49 +0000 (17:39 +0000)
committerNathan Froyd <froydnj@gcc.gnu.org>
Sun, 8 Aug 2010 17:39:49 +0000 (17:39 +0000)
* 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

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index e4ce02754ac7be0068083ba8225cb6c50e1cb10c..4c565b3fd05144c51a9474dfd7de5fb041782ac2 100644 (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
index 0f1f04052e6f6a337f24b7d8c8a01de2e403ea1b..5d465b89449d01b645d1c4152cca1f8aa32a75d0 100644 (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);
 
-#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