This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[1/2] i386 ROP mitigation: make more of regrename callable


This just creates a new function in regrename.c, which I need for the 2/2 patch that I'll submit in a moment.

Bootstrapped and tested on x86_64-linux. Ok?


Bernd
	* regrename.h (regrename_find_superclass): Declare.
	(regrename_find_superclass): New function, code moved from ...
	(rename_chains): ... here.  Call it.

diff --git a/gcc/regrename.c b/gcc/regrename.c
index c328c1b..788c8fd 100644
--- a/gcc/regrename.c
+++ b/gcc/regrename.c
@@ -409,6 +416,33 @@ find_rename_reg (du_head_p this_head, enum reg_class super_class,
   return best_new_reg;
 }
 
+/* Iterate over elements in the chain HEAD in order to:
+   1. Count number of uses, storing it in *PN_USES.
+   2. Narrow the set of registers we can use for renaming, adding
+      unavailable registers to *PUNAVAILABLE, which must be
+      initialized by the caller.
+   3. Compute the superunion of register classes in this chain
+      and return it.  */
+reg_class
+regrename_find_superclass (du_head_p head, int *pn_uses,
+			   HARD_REG_SET *punavailable)
+{
+  int n_uses = 0;
+  reg_class super_class = NO_REGS;
+  for (du_chain *tmp = head->first; tmp; tmp = tmp->next_use)
+    {
+      if (DEBUG_INSN_P (tmp->insn))
+	continue;
+      n_uses++;
+      IOR_COMPL_HARD_REG_SET (*punavailable,
+			      reg_class_contents[tmp->cl]);
+      super_class
+	= reg_class_superunion[(int) super_class][(int) tmp->cl];
+    }
+  *pn_uses = n_uses;
+  return super_class;
+}
+
 /* Perform register renaming on the current function.  */
 static void
 rename_chains (void)
@@ -432,10 +466,8 @@ rename_chains (void)
     {
       int best_new_reg;
       int n_uses;
-      struct du_chain *tmp;
       HARD_REG_SET this_unavailable;
       int reg = this_head->regno;
-      enum reg_class super_class = NO_REGS;
 
       if (this_head->cannot_rename)
 	continue;
@@ -449,23 +481,8 @@ rename_chains (void)
 
       COPY_HARD_REG_SET (this_unavailable, unavailable);
 
-      /* Iterate over elements in the chain in order to:
-	 1. Count number of uses, and narrow the set of registers we can
-	    use for renaming.
-	 2. Compute the superunion of register classes in this chain.  */
-      n_uses = 0;
-      super_class = NO_REGS;
-      for (tmp = this_head->first; tmp; tmp = tmp->next_use)
-	{
-	  if (DEBUG_INSN_P (tmp->insn))
-	    continue;
-	  n_uses++;
-	  IOR_COMPL_HARD_REG_SET (this_unavailable,
-				  reg_class_contents[tmp->cl]);
-	  super_class
-	    = reg_class_superunion[(int) super_class][(int) tmp->cl];
-	}
-
+      reg_class super_class = regrename_find_superclass (this_head, &n_uses,
+							 &this_unavailable);
       if (n_uses < 2)
 	continue;
 
diff --git a/gcc/regrename.h b/gcc/regrename.h
index bbe156d..f9f9481 100644
--- a/gcc/regrename.h
+++ b/gcc/regrename.h
@@ -92,5 +96,7 @@ extern du_head_p regrename_chain_from_id (unsigned int);
 extern int find_rename_reg (du_head_p, enum reg_class, HARD_REG_SET *, int,
 			    bool);
 extern bool regrename_do_replace (du_head_p, int);
+extern reg_class regrename_find_superclass (du_head_p, int *,
+					    HARD_REG_SET *);
 
 #endif

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]