Hello Everyone,
     This patch is for the Cilkplus branch affecting the C and C++ compilers. 
This patch will fix a problem in metadata dwarf code generation part when we 
are trying to catch the register number when a spill occurs.

Thanks,

Balaji V. Iyer.
    
 
diff --git a/gcc/ChangeLog.cilk b/gcc/ChangeLog.cilk
index d50f02c..ebabff6 100644
--- a/gcc/ChangeLog.cilk
+++ b/gcc/ChangeLog.cilk
@@ -1,3 +1,9 @@
+2012-02-15  Balaji V. Iyer  <balaji.v.i...@intel.com>
+
+       * cilk.c (cilk_fix_stack_reg): New function.
+       (expand_buitin_cilk_metadata): Added a check for memory type rtx and do
+       a call to the cilk_fix_reg_stack function.
+       
 2012-02-14  Balaji V. Iyer  <balaji.v.i...@intel.com>
 
        * c-array-notation.c (contains_array_notation_exprs): Added a check
diff --git a/gcc/cilk.c b/gcc/cilk.c
index cc4ddcd..cd06f22 100644
--- a/gcc/cilk.c
+++ b/gcc/cilk.c
@@ -1032,6 +1032,32 @@ cilk_output_metadata (void)
   return;
 }
 
+/* This function will go through an RTL of type MEM and then check to see if
+ * the register is PSEUDO, if so then we replace it with stack_pointer_rtx.
+ * This is mainly used to find the DWARF codes for parameters that are pushed
+ * in the stack.
+ */
+static rtx
+cilk_fix_stack_reg (rtx mem_rtx)
+{
+  if (!mem_rtx || !MEM_P (mem_rtx))
+    return mem_rtx;
+
+  if (REG_P (XEXP (mem_rtx, 0)))
+    {
+      if (REGNO (XEXP (mem_rtx, 0)) >= FIRST_PSEUDO_REGISTER)
+       XEXP (mem_rtx, 0) = stack_pointer_rtx;
+    }
+  else if (GET_CODE (XEXP (mem_rtx, 0)) == PLUS)
+    {
+      rtx tmp_rtx = XEXP (mem_rtx, 0);
+      if (REG_P (XEXP (tmp_rtx, 0)))
+       if (REGNO (XEXP (tmp_rtx, 0)) >= FIRST_PSEUDO_REGISTER)
+         XEXP (XEXP (mem_rtx, 0), 0) = stack_pointer_rtx;
+    }
+  return mem_rtx;
+}
+
 rtx
 expand_builtin_cilk_metadata (const char *annotation ATTRIBUTE_UNUSED,
                              tree exp ATTRIBUTE_UNUSED)
@@ -1062,7 +1088,14 @@ expand_builtin_cilk_metadata (const char *annotation 
ATTRIBUTE_UNUSED,
          reg_rtx = XEXP (ii_rtx, 0);
          if (reg_rtx)
            if (GET_CODE (reg_rtx) == USE)
-             metadata_info.reg_rtx = XEXP (reg_rtx, 0);
+             {
+               reg_rtx = XEXP (reg_rtx, 0);
+               if (REG_P (reg_rtx))
+                 metadata_info.reg_rtx = reg_rtx;
+               else if (MEM_P (reg_rtx)) /* this means we are using stack */
+                 metadata_info.reg_rtx = cilk_fix_stack_reg (reg_rtx);
+             }
+         
        }
 
       loc_ref = loc_descriptor (metadata_info.reg_rtx, VOIDmode,
diff --git a/gcc/cp/cp-array-notation.c b/gcc/cp/cp-array-notation.c
old mode 100644
new mode 100755

Reply via email to