RFC: partially available registers

Tom Tromey tromey@redhat.com
Wed Jul 20 20:46:00 GMT 2011


Daniel> * I am not happy about having to implement both
Daniel> gdbarch_pseudo_register_read and gdbarch_pseudo_register_read_value,
Daniel> depending on which regcache read function was called.  So for a final
Daniel> version, is it practical to push this down and only call the value
Daniel> version if it is registered?  That means implementing the existing
Daniel> regcache read in terms of the new one, instead of the other way
Daniel> around.

Tom> I will look at it.  Thanks for looking at this.

I looked into this, and I changed some things, but I did not change it
completely.

One thing I did change is that I made pseudo_register_read_into_value a
full replacement for pseudo_register_read.  A target should either
define one or the other.  I switched i386 and amd64 to the _value form.

I didn't rewrite regcache_cooked_read in terms of
regcache_cooked_read_into_value, because that is less efficient than
the reverse.

Tom

2011-07-20  Tom Tromey  <tromey@redhat.com>

	* amd64-tdep.c (amd64_pseudo_register_read_into_value): Rename
	from amd64_pseudo_register_read.  Change arguments.  Call
	mark_value_bytes_unavailable when needed.
	(amd64_init_abi): Use set_gdbarch_pseudo_register_read_value, not
	set_gdbarch_pseudo_register_read.
	* sentinel-frame.c (sentinel_frame_prev_register): Use
	regcache_cooked_read_into_value.
	* regcache.h (regcache_cooked_read_into_value): Declare.
	* regcache.c (regcache_cooked_read_into_value): New function.
	(regcache_cooked_read): Call
	gdbarch_pseudo_register_read_into_value if available.
	* i386-tdep.h (i386_pseudo_register_read_into_value): Declare.
	(i386_pseudo_register_read): Remove.
	* i386-tdep.c (i386_pseudo_register_read_into_value): Rename from
	i386_pseudo_register_read.  Change arguments.  Call
	mark_value_bytes_unavailable when needed.
	(i386_gdbarch_init): Call
	set_gdbarch_pseudo_register_read_into_value, not
	set_gdbarch_pseudo_register_read.
	* gdbarch.sh (pseudo_register_read_into_value): New method.
	* gdbarch.c, gdbarch.h: Rebuild.
	* findvar.c (value_from_register): Call get_frame_register_value.

2011-07-20  Tom Tromey  <tromey@redhat.com>

	* gdb.dwarf2/typeddwarf.c: XFAIL 'z' on x86-64.
	* gdb.dwarf2/typeddwarf.exp (xfail-gdb-test): Add arch_pattern
	argument.
	* gdb.dwarf2/typeddwarf-amd64.S: New file.

diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
index de62ac7..9a55f01 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -275,11 +275,13 @@ amd64_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
     return i386_pseudo_register_name (gdbarch, regnum);
 }
 
-static enum register_status
-amd64_pseudo_register_read (struct gdbarch *gdbarch,
-			    struct regcache *regcache,
-			    int regnum, gdb_byte *buf)
+static void
+amd64_pseudo_register_read_into_value (struct gdbarch *gdbarch,
+				       struct regcache *regcache,
+				       int regnum,
+				       struct value *result_value)
 {
+  gdb_byte *buf = value_contents_raw (result_value);
   gdb_byte raw_buf[MAX_REGISTER_SIZE];
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   enum register_status status;
@@ -297,15 +299,19 @@ amd64_pseudo_register_read (struct gdbarch *gdbarch,
 				      raw_buf);
 	  if (status == REG_VALID)
 	    memcpy (buf, raw_buf + 1, 1);
+	  else
+	    mark_value_bytes_unavailable (result_value, 0,
+					  TYPE_LENGTH (value_type (result_value)));
 	}
       else
 	{
 	  status = regcache_raw_read (regcache, gpnum, raw_buf);
 	  if (status == REG_VALID)
 	    memcpy (buf, raw_buf, 1);
+	  else
+	    mark_value_bytes_unavailable (result_value, 0,
+					  TYPE_LENGTH (value_type (result_value)));
 	}
-
-      return status;
     }
   else if (i386_dword_regnum_p (gdbarch, regnum))
     {
@@ -314,11 +320,13 @@ amd64_pseudo_register_read (struct gdbarch *gdbarch,
       status = regcache_raw_read (regcache, gpnum, raw_buf);
       if (status == REG_VALID)
 	memcpy (buf, raw_buf, 4);
-
-      return status;
+      else
+	mark_value_bytes_unavailable (result_value, 0,
+				      TYPE_LENGTH (value_type (result_value)));
     }
   else
-    return i386_pseudo_register_read (gdbarch, regcache, regnum, buf);
+    i386_pseudo_register_read_into_value (gdbarch, regcache, regnum,
+					  result_value);
 }
 
 static void
@@ -2494,8 +2502,8 @@ amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   /* Avoid wiring in the MMX registers for now.  */
   tdep->num_mmx_regs = 0;
 
-  set_gdbarch_pseudo_register_read (gdbarch,
-				    amd64_pseudo_register_read);
+  set_gdbarch_pseudo_register_read_into_value (gdbarch,
+					       amd64_pseudo_register_read_into_value);
   set_gdbarch_pseudo_register_write (gdbarch,
 				     amd64_pseudo_register_write);
 
diff --git a/gdb/findvar.c b/gdb/findvar.c
index a700c02..59e86ef 100644
--- a/gdb/findvar.c
+++ b/gdb/findvar.c
@@ -647,14 +647,16 @@ value_from_register (struct type *type, int regnum, struct frame_info *frame)
   else
     {
       int len = TYPE_LENGTH (type);
+      struct value *v2;
 
       /* Construct the value.  */
       v = gdbarch_value_from_register (gdbarch, type, regnum, frame);
 
       /* Get the data.  */
-      ok = get_frame_register_bytes (frame, regnum, value_offset (v), len,
-				     value_contents_raw (v),
-				     &optim, &unavail);
+      v2 = get_frame_register_value (frame, regnum);
+
+      value_contents_copy (v, 0, v2, 0, len);
+      ok = 1;
     }
 
   if (!ok)
diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c
index 1e65c17..31b341a 100644
--- a/gdb/gdbarch.c
+++ b/gdb/gdbarch.c
@@ -161,6 +161,7 @@ struct gdbarch
   gdbarch_write_pc_ftype *write_pc;
   gdbarch_virtual_frame_pointer_ftype *virtual_frame_pointer;
   gdbarch_pseudo_register_read_ftype *pseudo_register_read;
+  gdbarch_pseudo_register_read_into_value_ftype *pseudo_register_read_into_value;
   gdbarch_pseudo_register_write_ftype *pseudo_register_write;
   int num_regs;
   int num_pseudo_regs;
@@ -313,6 +314,7 @@ struct gdbarch startup_gdbarch =
   0,  /* write_pc */
   legacy_virtual_frame_pointer,  /* virtual_frame_pointer */
   0,  /* pseudo_register_read */
+  0,  /* pseudo_register_read_into_value */
   0,  /* pseudo_register_write */
   0,  /* num_regs */
   0,  /* num_pseudo_regs */
@@ -594,6 +596,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
   /* Skip verify of write_pc, has predicate.  */
   /* Skip verify of virtual_frame_pointer, invalid_p == 0 */
   /* Skip verify of pseudo_register_read, has predicate.  */
+  /* Skip verify of pseudo_register_read_into_value, has predicate.  */
   /* Skip verify of pseudo_register_write, has predicate.  */
   if (gdbarch->num_regs == -1)
     fprintf_unfiltered (log, "\n\tnum_regs");
@@ -1085,6 +1088,12 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
                       "gdbarch_dump: pseudo_register_read = <%s>\n",
                       host_address_to_string (gdbarch->pseudo_register_read));
   fprintf_unfiltered (file,
+                      "gdbarch_dump: gdbarch_pseudo_register_read_into_value_p() = %d\n",
+                      gdbarch_pseudo_register_read_into_value_p (gdbarch));
+  fprintf_unfiltered (file,
+                      "gdbarch_dump: pseudo_register_read_into_value = <%s>\n",
+                      host_address_to_string (gdbarch->pseudo_register_read_into_value));
+  fprintf_unfiltered (file,
                       "gdbarch_dump: gdbarch_pseudo_register_write_p() = %d\n",
                       gdbarch_pseudo_register_write_p (gdbarch));
   fprintf_unfiltered (file,
@@ -1700,6 +1709,30 @@ set_gdbarch_pseudo_register_read (struct gdbarch *gdbarch,
 }
 
 int
+gdbarch_pseudo_register_read_into_value_p (struct gdbarch *gdbarch)
+{
+  gdb_assert (gdbarch != NULL);
+  return gdbarch->pseudo_register_read_into_value != NULL;
+}
+
+void
+gdbarch_pseudo_register_read_into_value (struct gdbarch *gdbarch, struct regcache *regcache, int cookednum, struct value *result)
+{
+  gdb_assert (gdbarch != NULL);
+  gdb_assert (gdbarch->pseudo_register_read_into_value != NULL);
+  if (gdbarch_debug >= 2)
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_pseudo_register_read_into_value called\n");
+  gdbarch->pseudo_register_read_into_value (gdbarch, regcache, cookednum, result);
+}
+
+void
+set_gdbarch_pseudo_register_read_into_value (struct gdbarch *gdbarch,
+                                             gdbarch_pseudo_register_read_into_value_ftype pseudo_register_read_into_value)
+{
+  gdbarch->pseudo_register_read_into_value = pseudo_register_read_into_value;
+}
+
+int
 gdbarch_pseudo_register_write_p (struct gdbarch *gdbarch)
 {
   gdb_assert (gdbarch != NULL);
diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h
index 50221d7..bf4f03d 100644
--- a/gdb/gdbarch.h
+++ b/gdb/gdbarch.h
@@ -216,6 +216,18 @@ typedef enum register_status (gdbarch_pseudo_register_read_ftype) (struct gdbarc
 extern enum register_status gdbarch_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, int cookednum, gdb_byte *buf);
 extern void set_gdbarch_pseudo_register_read (struct gdbarch *gdbarch, gdbarch_pseudo_register_read_ftype *pseudo_register_read);
 
+/* Read a register into a struct value.  The value is already
+   allocated, only its contents must be updated.  If the register is
+   wholly or partly unavailable, this should call
+   mark_value_bytes_unavailable as appropriate.  If this is defined,
+   then pseudo_register_read will never be called. */
+
+extern int gdbarch_pseudo_register_read_into_value_p (struct gdbarch *gdbarch);
+
+typedef void (gdbarch_pseudo_register_read_into_value_ftype) (struct gdbarch *gdbarch, struct regcache *regcache, int cookednum, struct value *result);
+extern void gdbarch_pseudo_register_read_into_value (struct gdbarch *gdbarch, struct regcache *regcache, int cookednum, struct value *result);
+extern void set_gdbarch_pseudo_register_read_into_value (struct gdbarch *gdbarch, gdbarch_pseudo_register_read_into_value_ftype *pseudo_register_read_into_value);
+
 extern int gdbarch_pseudo_register_write_p (struct gdbarch *gdbarch);
 
 typedef void (gdbarch_pseudo_register_write_ftype) (struct gdbarch *gdbarch, struct regcache *regcache, int cookednum, const gdb_byte *buf);
diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh
index a628f8c..b8d2de8 100755
--- a/gdb/gdbarch.sh
+++ b/gdb/gdbarch.sh
@@ -418,6 +418,12 @@ F:void:write_pc:struct regcache *regcache, CORE_ADDR val:regcache, val
 m:void:virtual_frame_pointer:CORE_ADDR pc, int *frame_regnum, LONGEST *frame_offset:pc, frame_regnum, frame_offset:0:legacy_virtual_frame_pointer::0
 #
 M:enum register_status:pseudo_register_read:struct regcache *regcache, int cookednum, gdb_byte *buf:regcache, cookednum, buf
+# Read a register into a struct value.  The value is already
+# allocated, only its contents must be updated.  If the register is
+# wholly or partly unavailable, this should call
+# mark_value_bytes_unavailable as appropriate.  If this is defined,
+# then pseudo_register_read will never be called.
+M:void:pseudo_register_read_into_value:struct regcache *regcache, int cookednum, struct value *result:regcache, cookednum, result
 M:void:pseudo_register_write:struct regcache *regcache, int cookednum, const gdb_byte *buf:regcache, cookednum, buf
 #
 v:int:num_regs:::0:-1
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index 366d0fa..aa81303 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -2780,12 +2780,15 @@ i386_mmx_regnum_to_fp_regnum (struct regcache *regcache, int regnum)
   return (I387_ST0_REGNUM (tdep) + fpreg);
 }
 
-enum register_status
-i386_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
-			   int regnum, gdb_byte *buf)
+void
+i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
+				      struct regcache *regcache,
+				      int regnum,
+				      struct value *result_value)
 {
   gdb_byte raw_buf[MAX_REGISTER_SIZE];
   enum register_status status;
+  gdb_byte *buf = value_contents_raw (result_value);
 
   if (i386_mmx_regnum_p (gdbarch, regnum))
     {
@@ -2794,8 +2797,10 @@ i386_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
       /* Extract (always little endian).  */
       status = regcache_raw_read (regcache, fpnum, raw_buf);
       if (status != REG_VALID)
-	return status;
-      memcpy (buf, raw_buf, register_size (gdbarch, regnum));
+	mark_value_bytes_unavailable (result_value, 0,
+				      TYPE_LENGTH (value_type (result_value)));
+      else
+	memcpy (buf, raw_buf, register_size (gdbarch, regnum));
     }
   else
     {
@@ -2810,15 +2815,17 @@ i386_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
 				      I387_XMM0_REGNUM (tdep) + regnum,
 				      raw_buf);
 	  if (status != REG_VALID)
-	    return status;
-	  memcpy (buf, raw_buf, 16);
+	    mark_value_bytes_unavailable (result_value, 0, 16);
+	  else
+	    memcpy (buf, raw_buf, 16);
 	  /* Read upper 128bits.  */
 	  status = regcache_raw_read (regcache,
 				      tdep->ymm0h_regnum + regnum,
 				      raw_buf);
 	  if (status != REG_VALID)
-	    return status;
-	  memcpy (buf + 16, raw_buf, 16);
+	    mark_value_bytes_unavailable (result_value, 16, 32);
+	  else
+	    memcpy (buf + 16, raw_buf, 16);
 	}
       else if (i386_word_regnum_p (gdbarch, regnum))
 	{
@@ -2827,8 +2834,10 @@ i386_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
 	  /* Extract (always little endian).  */
 	  status = regcache_raw_read (regcache, gpnum, raw_buf);
 	  if (status != REG_VALID)
-	    return status;
-	  memcpy (buf, raw_buf, 2);
+	    mark_value_bytes_unavailable (result_value, 0,
+					  TYPE_LENGTH (value_type (result_value)));
+	  else
+	    memcpy (buf, raw_buf, 2);
 	}
       else if (i386_byte_regnum_p (gdbarch, regnum))
 	{
@@ -2841,8 +2850,9 @@ i386_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
 	     upper registers.  */
 	  status = regcache_raw_read (regcache, gpnum % 4, raw_buf);
 	  if (status != REG_VALID)
-	    return status;
-	  if (gpnum >= 4)
+	    mark_value_bytes_unavailable (result_value, 0,
+					  TYPE_LENGTH (value_type (result_value)));
+	  else if (gpnum >= 4)
 	    memcpy (buf, raw_buf + 1, 1);
 	  else
 	    memcpy (buf, raw_buf, 1);
@@ -2850,8 +2860,6 @@ i386_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
       else
 	internal_error (__FILE__, __LINE__, _("invalid regnum"));
     }
-
-  return REG_VALID;
 }
 
 void
@@ -7333,7 +7341,8 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   frame_base_set_default (gdbarch, &i386_frame_base);
 
   /* Pseudo registers may be changed by amd64_init_abi.  */
-  set_gdbarch_pseudo_register_read (gdbarch, i386_pseudo_register_read);
+  set_gdbarch_pseudo_register_read_into_value (gdbarch,
+					       i386_pseudo_register_read_into_value);
   set_gdbarch_pseudo_register_write (gdbarch, i386_pseudo_register_write);
 
   set_tdesc_pseudo_register_type (gdbarch, i386_pseudo_register_type);
diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h
index 7fc719c..de11f68 100644
--- a/gdb/i386-tdep.h
+++ b/gdb/i386-tdep.h
@@ -311,10 +311,11 @@ extern int i386_ymm_regnum_p (struct gdbarch *gdbarch, int regnum);
 extern const char *i386_pseudo_register_name (struct gdbarch *gdbarch,
 					      int regnum);
 
-extern enum register_status i386_pseudo_register_read (struct gdbarch *gdbarch,
-						       struct regcache *regcache,
-						       int regnum,
-						       gdb_byte *buf);
+extern void i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
+						  struct regcache *regcache,
+						  int regnum,
+						  struct value *result);
+
 extern void i386_pseudo_register_write (struct gdbarch *gdbarch,
 					struct regcache *regcache,
 					int regnum, const gdb_byte *buf);
diff --git a/gdb/regcache.c b/gdb/regcache.c
index 41f218d..258e8a6 100644
--- a/gdb/regcache.c
+++ b/gdb/regcache.c
@@ -709,11 +709,62 @@ regcache_cooked_read (struct regcache *regcache, int regnum, gdb_byte *buf)
 
       return regcache->register_status[regnum];
     }
+  else if (gdbarch_pseudo_register_read_into_value_p (regcache->descr->gdbarch))
+    {
+      struct value *mark, *computed;
+      enum register_status result = REG_VALID;
+
+      mark = value_mark ();
+      computed = allocate_value (register_type (regcache->descr->gdbarch,
+						regnum));
+      VALUE_LVAL (computed) = lval_register;
+      VALUE_REGNUM (computed) = regnum;
+
+      gdbarch_pseudo_register_read_into_value (regcache->descr->gdbarch,
+					       regcache, regnum, computed);
+      if (value_entirely_available (computed))
+	memcpy (buf, value_contents_raw (computed),
+		regcache->descr->sizeof_register[regnum]);
+      else
+	{
+	  memset (buf, 0, regcache->descr->sizeof_register[regnum]);
+	  result = REG_UNAVAILABLE;
+	}
+
+      value_free_to_mark (mark);
+
+      return result;
+    }
   else
     return gdbarch_pseudo_register_read (regcache->descr->gdbarch, regcache,
 					 regnum, buf);
 }
 
+void
+regcache_cooked_read_into_value (struct regcache *regcache, int regnum,
+				 struct value *result)
+{
+  gdb_assert (regnum >= 0);
+  gdb_assert (regnum < regcache->descr->nr_cooked_registers);
+
+  if (regnum < regcache->descr->nr_raw_registers
+      || (regcache->readonly_p
+	  && regcache->register_status[regnum] != REG_UNKNOWN)
+      || !gdbarch_pseudo_register_read_into_value_p (regcache->descr->gdbarch))
+    {
+      /* It is more efficient in general to do this delegation in this
+	 direction than in the other one, even though the value-based
+	 API is preferred.  */
+      if (regcache_cooked_read (regcache, regnum,
+				value_contents_raw (result)) == REG_UNAVAILABLE)
+	mark_value_bytes_unavailable (result, 0,
+				      TYPE_LENGTH (value_type (result)));
+    }
+  else
+    gdbarch_pseudo_register_read_into_value (regcache->descr->gdbarch,
+					     regcache, regnum, result);
+}
+
 enum register_status
 regcache_cooked_read_signed (struct regcache *regcache, int regnum,
 			     LONGEST *val)
diff --git a/gdb/regcache.h b/gdb/regcache.h
index 3708c86..417575c 100644
--- a/gdb/regcache.h
+++ b/gdb/regcache.h
@@ -104,6 +104,13 @@ enum register_status regcache_cooked_read (struct regcache *regcache,
 void regcache_cooked_write (struct regcache *regcache, int rawnum,
 			    const gdb_byte *buf);
 
+/* Read register REGNUM from REGCACHE into an already-allocated value,
+   RESULT.  This will fill in the contents of RESULT and, if
+   necessary, call mark_value_bytes_unavailable as appropriate.  */
+
+void regcache_cooked_read_into_value (struct regcache *regcache, int regnum,
+				      struct value *result);
+
 /* Read a register as a signed/unsigned quantity.  */
 extern enum register_status
   regcache_cooked_read_signed (struct regcache *regcache,
diff --git a/gdb/sentinel-frame.c b/gdb/sentinel-frame.c
index 6c2f3e0..86814af 100644
--- a/gdb/sentinel-frame.c
+++ b/gdb/sentinel-frame.c
@@ -59,13 +59,7 @@ sentinel_frame_prev_register (struct frame_info *this_frame,
   VALUE_REGNUM (value) = regnum;
   VALUE_FRAME_ID (value) = get_frame_id (this_frame);
 
-  /* Use the regcache_cooked_read() method so that it, on the fly,
-     constructs either a raw or pseudo register from the raw
-     register cache.  */
-  if (regcache_cooked_read (cache->regcache,
-			    regnum,
-			    value_contents_raw (value)) == REG_UNAVAILABLE)
-    mark_value_bytes_unavailable (value, 0, TYPE_LENGTH (regtype));
+  regcache_cooked_read_into_value (cache->regcache, regnum, value);
 
   return value;
 }
diff --git a/gdb/testsuite/gdb.dwarf2/typeddwarf-amd64.S b/gdb/testsuite/gdb.dwarf2/typeddwarf-amd64.S
new file mode 100644
index 0000000..f97357a
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/typeddwarf-amd64.S
@@ -0,0 +1,1568 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2011 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* This source file was generated from typeddwarf.c using the following
+   command line:
+
+   gcc -S -g -O2 typeddwarf.c -o typeddwarf-amd64.S
+
+*/
+
+
+	.file	"typeddwarf.c"
+	.text
+.Ltext0:
+	.globl	f1
+	.type	f1, @function
+f1:
+.LFB0:
+	.file 1 "typeddwarf.c"
+	.loc 1 10 0
+	.cfi_startproc
+.LVL0:
+	.loc 1 29 0
+	movl	vv(%rip), %eax
+	addl	$1, %eax
+	movl	%eax, vv(%rip)
+	.loc 1 30 0
+	ret
+	.cfi_endproc
+.LFE0:
+	.size	f1, .-f1
+	.globl	f2
+	.type	f2, @function
+f2:
+.LFB1:
+	.loc 1 34 0
+	.cfi_startproc
+.LVL1:
+	.loc 1 53 0
+	movl	vv(%rip), %eax
+	addl	$1, %eax
+	movl	%eax, vv(%rip)
+	.loc 1 54 0
+	cvttsd2si	%xmm0, %eax
+	movl	%eax, vv(%rip)
+	.loc 1 55 0
+	cvttsd2si	%xmm1, %eax
+	movl	%eax, vv(%rip)
+	.loc 1 56 0
+	cvttsd2si	%xmm2, %eax
+	movl	%eax, vv(%rip)
+	.loc 1 57 0
+	cvttss2si	%xmm3, %eax
+	movl	%eax, vv(%rip)
+	.loc 1 58 0
+	cvttss2si	%xmm4, %r8d
+	movl	%r8d, vv(%rip)
+	.loc 1 59 0
+	movl	%edi, vv(%rip)
+	.loc 1 60 0
+	movl	%esi, vv(%rip)
+	.loc 1 61 0
+	movl	%edx, vv(%rip)
+	.loc 1 62 0
+	movl	%ecx, vv(%rip)
+	.loc 1 63 0
+	movl	%eax, vv(%rip)
+	.loc 1 64 0
+	ret
+	.cfi_endproc
+.LFE1:
+	.size	f2, .-f2
+	.globl	f3
+	.type	f3, @function
+f3:
+.LFB2:
+	.loc 1 68 0
+	.cfi_startproc
+.LVL2:
+	.loc 1 73 0
+	movl	vv(%rip), %eax
+	addl	$1, %eax
+	movl	%eax, vv(%rip)
+	.loc 1 74 0
+	ret
+	.cfi_endproc
+.LFE2:
+	.size	f3, .-f3
+	.globl	f4
+	.type	f4, @function
+f4:
+.LFB3:
+	.loc 1 78 0
+	.cfi_startproc
+.LVL3:
+	.loc 1 82 0
+	movl	vv(%rip), %eax
+	addl	$1, %eax
+	movl	%eax, vv(%rip)
+	.loc 1 83 0
+	ret
+	.cfi_endproc
+.LFE3:
+	.size	f4, .-f4
+	.globl	_start
+	.type	_start, @function
+_start:
+.LFB4:
+	.loc 1 87 0
+	.cfi_startproc
+	subq	$8, %rsp
+.LCFI0:
+	.cfi_def_cfa_offset 16
+	.loc 1 88 0
+	movl	$9, %ecx
+	movl	$8, %edx
+	movl	$7, %esi
+	movl	$6, %edi
+	movss	.LC2(%rip), %xmm4
+	movss	.LC3(%rip), %xmm3
+	movsd	.LC0(%rip), %xmm2
+	movsd	.LC1(%rip), %xmm1
+	movsd	.LC4(%rip), %xmm0
+	call	f1
+.LVL4:
+	.loc 1 89 0
+	movl	$9, %ecx
+	movl	$8, %edx
+	movl	$7, %esi
+	movl	$6, %edi
+	movss	.LC2(%rip), %xmm4
+	movss	.LC3(%rip), %xmm3
+	movsd	.LC0(%rip), %xmm2
+	movsd	.LC1(%rip), %xmm1
+	movsd	.LC4(%rip), %xmm0
+	call	f2
+.LVL5:
+	.loc 1 90 0
+	movl	$4, %ecx
+	movl	$3, %edx
+	movl	$2, %esi
+	movl	$1, %edi
+	call	f3
+.LVL6:
+	.loc 1 91 0
+	movdqa	.LC5(%rip), %xmm2
+	movq	.LC6(%rip), %xmm1
+	movd	.LC7(%rip), %xmm0
+	call	f4
+.LVL7:
+	.loc 1 93 0
+	movl	$0, %eax
+	addq	$8, %rsp
+.LCFI1:
+	.cfi_def_cfa_offset 8
+	ret
+	.cfi_endproc
+.LFE4:
+	.size	_start, .-_start
+	.comm	vv,4,4
+	.section	.rodata.cst8,"aM",@progbits,8
+	.align 8
+.LC0:
+	.long	0
+	.long	1074266112
+	.align 8
+.LC1:
+	.long	0
+	.long	1073741824
+	.section	.rodata.cst4,"aM",@progbits,4
+	.align 4
+.LC2:
+	.long	1084227584
+	.align 4
+.LC3:
+	.long	1082130432
+	.section	.rodata.cst8
+	.align 8
+.LC4:
+	.long	0
+	.long	1072693248
+	.section	.rodata.cst16,"aM",@progbits,16
+	.align 16
+.LC5:
+	.quad	640
+	.quad	3476215962376601600
+	.section	.rodata.cst8
+	.align 8
+.LC6:
+	.quad	3575858104132173984
+	.section	.rodata.cst4
+	.align 4
+.LC7:
+	.long	838860880
+	.text
+.Letext0:
+	.section	.debug_info,"",@progbits
+.Ldebug_info0:
+	.long	0x6c4
+	.value	0x2
+	.long	.Ldebug_abbrev0
+	.byte	0x8
+	.uleb128 0x1
+	.long	.LASF8
+	.byte	0x1
+	.long	.LASF9
+	.long	.LASF10
+	.quad	.Ltext0
+	.quad	.Letext0
+	.long	.Ldebug_line0
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x4
+	.long	.LASF0
+	.uleb128 0x2
+	.byte	0x4
+	.byte	0x4
+	.long	.LASF1
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x7
+	.long	.LASF2
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x5
+	.long	.LASF3
+	.uleb128 0x2
+	.byte	0x4
+	.byte	0x7
+	.long	.LASF4
+	.uleb128 0x3
+	.byte	0x4
+	.byte	0x5
+	.string	"int"
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0xf
+	.long	.LASF5
+	.uleb128 0x2
+	.byte	0x4
+	.byte	0xf
+	.long	.LASF6
+	.uleb128 0x2
+	.byte	0x10
+	.byte	0xf
+	.long	.LASF7
+	.uleb128 0x4
+	.byte	0x1
+	.string	"f1"
+	.byte	0x1
+	.byte	0x9
+	.byte	0x1
+	.quad	.LFB0
+	.quad	.LFE0
+	.byte	0x2
+	.byte	0x77
+	.sleb128 8
+	.byte	0x1
+	.long	0x22b
+	.uleb128 0x5
+	.string	"a"
+	.byte	0x1
+	.byte	0x9
+	.long	0x2d
+	.byte	0x1
+	.byte	0x61
+	.uleb128 0x5
+	.string	"b"
+	.byte	0x1
+	.byte	0x9
+	.long	0x2d
+	.byte	0x1
+	.byte	0x62
+	.uleb128 0x5
+	.string	"c"
+	.byte	0x1
+	.byte	0x9
+	.long	0x2d
+	.byte	0x1
+	.byte	0x63
+	.uleb128 0x5
+	.string	"d"
+	.byte	0x1
+	.byte	0x9
+	.long	0x34
+	.byte	0x1
+	.byte	0x64
+	.uleb128 0x5
+	.string	"e"
+	.byte	0x1
+	.byte	0x9
+	.long	0x34
+	.byte	0x1
+	.byte	0x65
+	.uleb128 0x5
+	.string	"f"
+	.byte	0x1
+	.byte	0x9
+	.long	0x50
+	.byte	0x1
+	.byte	0x55
+	.uleb128 0x5
+	.string	"g"
+	.byte	0x1
+	.byte	0x9
+	.long	0x49
+	.byte	0x1
+	.byte	0x54
+	.uleb128 0x5
+	.string	"h"
+	.byte	0x1
+	.byte	0x9
+	.long	0x22b
+	.byte	0x1
+	.byte	0x51
+	.uleb128 0x5
+	.string	"i"
+	.byte	0x1
+	.byte	0x9
+	.long	0x232
+	.byte	0x1
+	.byte	0x52
+	.uleb128 0x6
+	.string	"j"
+	.byte	0x1
+	.byte	0xb
+	.long	0x2d
+	.byte	0x6
+	.byte	0xf5
+	.uleb128 0x14
+	.uleb128 0x34
+	.byte	0xf7
+	.uleb128 0x2d
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"l"
+	.byte	0x1
+	.byte	0xc
+	.long	0x22b
+	.byte	0x8
+	.byte	0xf5
+	.uleb128 0x14
+	.uleb128 0x34
+	.byte	0xf7
+	.uleb128 0x2d
+	.byte	0xf9
+	.uleb128 0x3b
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"m"
+	.byte	0x1
+	.byte	0xe
+	.long	0x22b
+	.byte	0x1
+	.byte	0x63
+	.uleb128 0x6
+	.string	"n"
+	.byte	0x1
+	.byte	0x10
+	.long	0x34
+	.byte	0x7
+	.byte	0x72
+	.sleb128 0
+	.byte	0xf7
+	.uleb128 0x3b
+	.byte	0xf7
+	.uleb128 0x34
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"o"
+	.byte	0x1
+	.byte	0x11
+	.long	0x2d
+	.byte	0x7
+	.byte	0x71
+	.sleb128 0
+	.byte	0xf7
+	.uleb128 0x42
+	.byte	0xf7
+	.uleb128 0x2d
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"p"
+	.byte	0x1
+	.byte	0x12
+	.long	0x34
+	.byte	0x7
+	.byte	0x74
+	.sleb128 0
+	.byte	0xf7
+	.uleb128 0x49
+	.byte	0xf7
+	.uleb128 0x34
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"q"
+	.byte	0x1
+	.byte	0x13
+	.long	0x2d
+	.byte	0x7
+	.byte	0x75
+	.sleb128 0
+	.byte	0xf7
+	.uleb128 0x50
+	.byte	0xf7
+	.uleb128 0x2d
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"r"
+	.byte	0x1
+	.byte	0x14
+	.long	0x232
+	.byte	0x6
+	.byte	0xf5
+	.uleb128 0x11
+	.uleb128 0x2d
+	.byte	0xf7
+	.uleb128 0x3b
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"s"
+	.byte	0x1
+	.byte	0x15
+	.long	0x22b
+	.byte	0x8
+	.byte	0xf5
+	.uleb128 0x13
+	.uleb128 0x2d
+	.byte	0xf7
+	.uleb128 0x42
+	.byte	0xf7
+	.uleb128 0
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"t"
+	.byte	0x1
+	.byte	0x16
+	.long	0x49
+	.byte	0x8
+	.byte	0xf5
+	.uleb128 0x14
+	.uleb128 0x34
+	.byte	0xf7
+	.uleb128 0x49
+	.byte	0xf7
+	.uleb128 0
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"u"
+	.byte	0x1
+	.byte	0x17
+	.long	0x50
+	.byte	0x8
+	.byte	0xf5
+	.uleb128 0x12
+	.uleb128 0x2d
+	.byte	0xf7
+	.uleb128 0x50
+	.byte	0xf7
+	.uleb128 0
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"v"
+	.byte	0x1
+	.byte	0x18
+	.long	0x34
+	.byte	0x6
+	.byte	0xf5
+	.uleb128 0x11
+	.uleb128 0x2d
+	.byte	0xf7
+	.uleb128 0x34
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"w"
+	.byte	0x1
+	.byte	0x19
+	.long	0x2d
+	.byte	0x12
+	.byte	0xf5
+	.uleb128 0x14
+	.uleb128 0x34
+	.byte	0xf7
+	.uleb128 0x2d
+	.byte	0xf4
+	.uleb128 0x2d
+	.byte	0x8
+	.long	0
+	.long	0x3fd00000
+	.byte	0x1e
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"x"
+	.byte	0x1
+	.byte	0x1a
+	.long	0x2d
+	.byte	0x14
+	.byte	0xf5
+	.uleb128 0x11
+	.uleb128 0x2d
+	.byte	0xf5
+	.uleb128 0x12
+	.uleb128 0x2d
+	.byte	0x22
+	.byte	0xf4
+	.uleb128 0x2d
+	.byte	0x8
+	.long	0
+	.long	0x3ff00000
+	.byte	0x22
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"y"
+	.byte	0x1
+	.byte	0x1b
+	.long	0x2d
+	.byte	0x14
+	.byte	0xf5
+	.uleb128 0x12
+	.uleb128 0x2d
+	.byte	0xf5
+	.uleb128 0x13
+	.uleb128 0x2d
+	.byte	0x22
+	.byte	0xf4
+	.uleb128 0x2d
+	.byte	0x8
+	.long	0
+	.long	0x40000000
+	.byte	0x22
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"z"
+	.byte	0x1
+	.byte	0x1c
+	.long	0x34
+	.byte	0x12
+	.byte	0xf5
+	.uleb128 0x14
+	.uleb128 0x34
+	.byte	0xf3
+	.uleb128 0x3
+	.byte	0xf5
+	.uleb128 0x15
+	.uleb128 0x34
+	.byte	0x22
+	.byte	0xf4
+	.uleb128 0x34
+	.byte	0x4
+	.long	0x40400000
+	.byte	0x22
+	.byte	0x9f
+	.byte	0
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x5
+	.long	.LASF11
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x7
+	.long	.LASF12
+	.uleb128 0x4
+	.byte	0x1
+	.string	"f2"
+	.byte	0x1
+	.byte	0x21
+	.byte	0x1
+	.quad	.LFB1
+	.quad	.LFE1
+	.byte	0x2
+	.byte	0x77
+	.sleb128 8
+	.byte	0x1
+	.long	0x402
+	.uleb128 0x5
+	.string	"a"
+	.byte	0x1
+	.byte	0x21
+	.long	0x2d
+	.byte	0x1
+	.byte	0x61
+	.uleb128 0x5
+	.string	"b"
+	.byte	0x1
+	.byte	0x21
+	.long	0x2d
+	.byte	0x1
+	.byte	0x62
+	.uleb128 0x5
+	.string	"c"
+	.byte	0x1
+	.byte	0x21
+	.long	0x2d
+	.byte	0x1
+	.byte	0x63
+	.uleb128 0x5
+	.string	"d"
+	.byte	0x1
+	.byte	0x21
+	.long	0x34
+	.byte	0x1
+	.byte	0x64
+	.uleb128 0x5
+	.string	"e"
+	.byte	0x1
+	.byte	0x21
+	.long	0x34
+	.byte	0x1
+	.byte	0x65
+	.uleb128 0x5
+	.string	"f"
+	.byte	0x1
+	.byte	0x21
+	.long	0x50
+	.byte	0x1
+	.byte	0x55
+	.uleb128 0x5
+	.string	"g"
+	.byte	0x1
+	.byte	0x21
+	.long	0x49
+	.byte	0x1
+	.byte	0x54
+	.uleb128 0x5
+	.string	"h"
+	.byte	0x1
+	.byte	0x21
+	.long	0x22b
+	.byte	0x1
+	.byte	0x51
+	.uleb128 0x5
+	.string	"i"
+	.byte	0x1
+	.byte	0x21
+	.long	0x232
+	.byte	0x1
+	.byte	0x52
+	.uleb128 0x6
+	.string	"j"
+	.byte	0x1
+	.byte	0x23
+	.long	0x2d
+	.byte	0x6
+	.byte	0xf5
+	.uleb128 0x14
+	.uleb128 0x34
+	.byte	0xf7
+	.uleb128 0x2d
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"l"
+	.byte	0x1
+	.byte	0x24
+	.long	0x22b
+	.byte	0x8
+	.byte	0xf5
+	.uleb128 0x14
+	.uleb128 0x34
+	.byte	0xf7
+	.uleb128 0x2d
+	.byte	0xf9
+	.uleb128 0x3b
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"m"
+	.byte	0x1
+	.byte	0x26
+	.long	0x22b
+	.byte	0x1
+	.byte	0x63
+	.uleb128 0x6
+	.string	"n"
+	.byte	0x1
+	.byte	0x28
+	.long	0x34
+	.byte	0x7
+	.byte	0x72
+	.sleb128 0
+	.byte	0xf7
+	.uleb128 0x3b
+	.byte	0xf7
+	.uleb128 0x34
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"o"
+	.byte	0x1
+	.byte	0x29
+	.long	0x2d
+	.byte	0x7
+	.byte	0x71
+	.sleb128 0
+	.byte	0xf7
+	.uleb128 0x42
+	.byte	0xf7
+	.uleb128 0x2d
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"p"
+	.byte	0x1
+	.byte	0x2a
+	.long	0x34
+	.byte	0x7
+	.byte	0x74
+	.sleb128 0
+	.byte	0xf7
+	.uleb128 0x49
+	.byte	0xf7
+	.uleb128 0x34
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"q"
+	.byte	0x1
+	.byte	0x2b
+	.long	0x2d
+	.byte	0x7
+	.byte	0x75
+	.sleb128 0
+	.byte	0xf7
+	.uleb128 0x50
+	.byte	0xf7
+	.uleb128 0x2d
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"r"
+	.byte	0x1
+	.byte	0x2c
+	.long	0x232
+	.byte	0x6
+	.byte	0xf5
+	.uleb128 0x11
+	.uleb128 0x2d
+	.byte	0xf7
+	.uleb128 0x3b
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"s"
+	.byte	0x1
+	.byte	0x2d
+	.long	0x22b
+	.byte	0x8
+	.byte	0xf5
+	.uleb128 0x13
+	.uleb128 0x2d
+	.byte	0xf7
+	.uleb128 0x42
+	.byte	0xf7
+	.uleb128 0
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"t"
+	.byte	0x1
+	.byte	0x2e
+	.long	0x49
+	.byte	0x8
+	.byte	0xf5
+	.uleb128 0x14
+	.uleb128 0x34
+	.byte	0xf7
+	.uleb128 0x49
+	.byte	0xf7
+	.uleb128 0
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"u"
+	.byte	0x1
+	.byte	0x2f
+	.long	0x50
+	.byte	0x8
+	.byte	0xf5
+	.uleb128 0x12
+	.uleb128 0x2d
+	.byte	0xf7
+	.uleb128 0x50
+	.byte	0xf7
+	.uleb128 0
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"v"
+	.byte	0x1
+	.byte	0x30
+	.long	0x34
+	.byte	0x6
+	.byte	0xf5
+	.uleb128 0x11
+	.uleb128 0x2d
+	.byte	0xf7
+	.uleb128 0x34
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"w"
+	.byte	0x1
+	.byte	0x31
+	.long	0x2d
+	.byte	0x12
+	.byte	0xf5
+	.uleb128 0x14
+	.uleb128 0x34
+	.byte	0xf7
+	.uleb128 0x2d
+	.byte	0xf4
+	.uleb128 0x2d
+	.byte	0x8
+	.long	0
+	.long	0x3fd00000
+	.byte	0x1e
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"x"
+	.byte	0x1
+	.byte	0x32
+	.long	0x2d
+	.byte	0x20
+	.byte	0xf5
+	.uleb128 0x11
+	.uleb128 0x2d
+	.byte	0xf5
+	.uleb128 0x12
+	.uleb128 0x2d
+	.byte	0x22
+	.byte	0xf4
+	.uleb128 0x2d
+	.byte	0x8
+	.long	0
+	.long	0x40080000
+	.byte	0x1c
+	.byte	0xf4
+	.uleb128 0x2d
+	.byte	0x8
+	.long	0x78b58c40
+	.long	0x4415af1d
+	.byte	0x22
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"y"
+	.byte	0x1
+	.byte	0x33
+	.long	0x2d
+	.byte	0x14
+	.byte	0xf5
+	.uleb128 0x13
+	.uleb128 0x2d
+	.byte	0xf4
+	.uleb128 0x2d
+	.byte	0x8
+	.long	0
+	.long	0x401c0000
+	.byte	0x1e
+	.byte	0xf5
+	.uleb128 0x12
+	.uleb128 0x2d
+	.byte	0x22
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"z"
+	.byte	0x1
+	.byte	0x34
+	.long	0x34
+	.byte	0x10
+	.byte	0xf5
+	.uleb128 0x14
+	.uleb128 0x34
+	.byte	0xf5
+	.uleb128 0x15
+	.uleb128 0x34
+	.byte	0x22
+	.byte	0xf4
+	.uleb128 0x34
+	.byte	0x4
+	.long	0x40400000
+	.byte	0x22
+	.byte	0x9f
+	.byte	0
+	.uleb128 0x4
+	.byte	0x1
+	.string	"f3"
+	.byte	0x1
+	.byte	0x43
+	.byte	0x1
+	.quad	.LFB2
+	.quad	.LFE2
+	.byte	0x2
+	.byte	0x77
+	.sleb128 8
+	.byte	0x1
+	.long	0x4cd
+	.uleb128 0x5
+	.string	"a"
+	.byte	0x1
+	.byte	0x43
+	.long	0x22b
+	.byte	0x1
+	.byte	0x55
+	.uleb128 0x5
+	.string	"b"
+	.byte	0x1
+	.byte	0x43
+	.long	0x50
+	.byte	0x1
+	.byte	0x54
+	.uleb128 0x5
+	.string	"c"
+	.byte	0x1
+	.byte	0x43
+	.long	0x22b
+	.byte	0x1
+	.byte	0x51
+	.uleb128 0x5
+	.string	"d"
+	.byte	0x1
+	.byte	0x43
+	.long	0x49
+	.byte	0x1
+	.byte	0x52
+	.uleb128 0x6
+	.string	"w"
+	.byte	0x1
+	.byte	0x45
+	.long	0x22b
+	.byte	0x14
+	.byte	0x72
+	.sleb128 0
+	.byte	0xc
+	.long	0xffffffff
+	.byte	0x1a
+	.byte	0x12
+	.byte	0x75
+	.sleb128 0
+	.byte	0x16
+	.byte	0x14
+	.byte	0x2b
+	.byte	0x28
+	.value	0x1
+	.byte	0x16
+	.byte	0x13
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"x"
+	.byte	0x1
+	.byte	0x46
+	.long	0x22b
+	.byte	0xe
+	.byte	0x74
+	.sleb128 0
+	.byte	0x8
+	.byte	0x20
+	.byte	0x24
+	.byte	0x8
+	.byte	0x20
+	.byte	0x26
+	.byte	0x75
+	.sleb128 0
+	.byte	0x22
+	.byte	0x23
+	.uleb128 0x7
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"y"
+	.byte	0x1
+	.byte	0x47
+	.long	0x22b
+	.byte	0x13
+	.byte	0x72
+	.sleb128 0
+	.byte	0xc
+	.long	0xffffffff
+	.byte	0x1a
+	.byte	0x71
+	.sleb128 0
+	.byte	0x22
+	.byte	0x23
+	.uleb128 0x912345678
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"z"
+	.byte	0x1
+	.byte	0x48
+	.long	0x50
+	.byte	0x21
+	.byte	0x74
+	.sleb128 0
+	.byte	0x8
+	.byte	0x20
+	.byte	0x24
+	.byte	0x8
+	.byte	0x20
+	.byte	0x26
+	.byte	0x75
+	.sleb128 0
+	.byte	0x22
+	.byte	0x23
+	.uleb128 0x7
+	.byte	0x72
+	.sleb128 0
+	.byte	0xc
+	.long	0xffffffff
+	.byte	0x1a
+	.byte	0x71
+	.sleb128 0
+	.byte	0x22
+	.byte	0x23
+	.uleb128 0x912345678
+	.byte	0x22
+	.byte	0x9f
+	.byte	0
+	.uleb128 0x4
+	.byte	0x1
+	.string	"f4"
+	.byte	0x1
+	.byte	0x4d
+	.byte	0x1
+	.quad	.LFB3
+	.quad	.LFE3
+	.byte	0x2
+	.byte	0x77
+	.sleb128 8
+	.byte	0x1
+	.long	0x576
+	.uleb128 0x5
+	.string	"a"
+	.byte	0x1
+	.byte	0x4d
+	.long	0x5e
+	.byte	0x1
+	.byte	0x61
+	.uleb128 0x5
+	.string	"b"
+	.byte	0x1
+	.byte	0x4d
+	.long	0x57
+	.byte	0x1
+	.byte	0x62
+	.uleb128 0x5
+	.string	"c"
+	.byte	0x1
+	.byte	0x4d
+	.long	0x65
+	.byte	0x1
+	.byte	0x63
+	.uleb128 0x6
+	.string	"w"
+	.byte	0x1
+	.byte	0x4f
+	.long	0x5e
+	.byte	0x14
+	.byte	0xf5
+	.uleb128 0x11
+	.uleb128 0x5e
+	.byte	0xf4
+	.uleb128 0x5e
+	.byte	0x4
+	.long	0x32000050
+	.byte	0x1e
+	.byte	0xf4
+	.uleb128 0x5e
+	.byte	0x4
+	.long	0x3200003c
+	.byte	0x22
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"x"
+	.byte	0x1
+	.byte	0x50
+	.long	0x57
+	.byte	0x1c
+	.byte	0xf5
+	.uleb128 0x12
+	.uleb128 0x57
+	.byte	0xf4
+	.uleb128 0x57
+	.byte	0x8
+	.long	0x50
+	.long	0x31a00000
+	.byte	0x1b
+	.byte	0xf4
+	.uleb128 0x57
+	.byte	0x8
+	.long	0x3c
+	.long	0x31a00000
+	.byte	0x1c
+	.byte	0x9f
+	.uleb128 0x6
+	.string	"y"
+	.byte	0x1
+	.byte	0x51
+	.long	0x65
+	.byte	0x19
+	.byte	0xf5
+	.uleb128 0x13
+	.uleb128 0x65
+	.byte	0x1f
+	.byte	0xf4
+	.uleb128 0x65
+	.byte	0x10
+	.long	0x50
+	.long	0
+	.long	0
+	.long	0x303e0000
+	.byte	0x1b
+	.byte	0x9f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x1
+	.long	.LASF13
+	.byte	0x1
+	.byte	0x56
+	.long	0x50
+	.quad	.LFB4
+	.quad	.LFE4
+	.long	.LLST0
+	.byte	0x1
+	.long	0x6a1
+	.uleb128 0x8
+	.quad	.LVL4
+	.long	0x6c
+	.long	0x604
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x61
+	.byte	0xb
+	.byte	0xf4
+	.uleb128 0x2d
+	.byte	0x8
+	.long	0
+	.long	0x3ff00000
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x62
+	.byte	0xb
+	.byte	0xf4
+	.uleb128 0x2d
+	.byte	0x8
+	.long	0
+	.long	0x40000000
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x63
+	.byte	0xb
+	.byte	0xf4
+	.uleb128 0x2d
+	.byte	0x8
+	.long	0
+	.long	0x40080000
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x64
+	.byte	0x7
+	.byte	0xf4
+	.uleb128 0x34
+	.byte	0x4
+	.long	0x40800000
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x65
+	.byte	0x7
+	.byte	0xf4
+	.uleb128 0x34
+	.byte	0x4
+	.long	0x40a00000
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x55
+	.byte	0x1
+	.byte	0x36
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x54
+	.byte	0x1
+	.byte	0x37
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x51
+	.byte	0x1
+	.byte	0x38
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x52
+	.byte	0x1
+	.byte	0x39
+	.byte	0
+	.uleb128 0x8
+	.quad	.LVL5
+	.long	0x239
+	.long	0x66d
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x61
+	.byte	0xb
+	.byte	0xf4
+	.uleb128 0x2d
+	.byte	0x8
+	.long	0
+	.long	0x3ff00000
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x62
+	.byte	0xb
+	.byte	0xf4
+	.uleb128 0x2d
+	.byte	0x8
+	.long	0
+	.long	0x40000000
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x63
+	.byte	0xb
+	.byte	0xf4
+	.uleb128 0x2d
+	.byte	0x8
+	.long	0
+	.long	0x40080000
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x64
+	.byte	0x7
+	.byte	0xf4
+	.uleb128 0x34
+	.byte	0x4
+	.long	0x40800000
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x65
+	.byte	0x7
+	.byte	0xf4
+	.uleb128 0x34
+	.byte	0x4
+	.long	0x40a00000
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x55
+	.byte	0x1
+	.byte	0x36
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x54
+	.byte	0x1
+	.byte	0x37
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x51
+	.byte	0x1
+	.byte	0x38
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x52
+	.byte	0x1
+	.byte	0x39
+	.byte	0
+	.uleb128 0x8
+	.quad	.LVL6
+	.long	0x402
+	.long	0x693
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x55
+	.byte	0x1
+	.byte	0x31
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x54
+	.byte	0x1
+	.byte	0x32
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x51
+	.byte	0x1
+	.byte	0x33
+	.uleb128 0x9
+	.byte	0x1
+	.byte	0x52
+	.byte	0x1
+	.byte	0x34
+	.byte	0
+	.uleb128 0xa
+	.quad	.LVL7
+	.long	0x4cd
+	.byte	0
+	.uleb128 0xb
+	.string	"vv"
+	.byte	0x1
+	.byte	0x5
+	.long	0x6ad
+	.byte	0x1
+	.byte	0x1
+	.uleb128 0xc
+	.long	0x50
+	.uleb128 0xd
+	.string	"vv"
+	.byte	0x1
+	.byte	0x5
+	.long	0x6ad
+	.byte	0x1
+	.byte	0x9
+	.byte	0x3
+	.quad	vv
+	.byte	0
+	.section	.debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+	.uleb128 0x1
+	.uleb128 0x11
+	.byte	0x1
+	.uleb128 0x25
+	.uleb128 0xe
+	.uleb128 0x13
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1b
+	.uleb128 0xe
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x1
+	.uleb128 0x10
+	.uleb128 0x6
+	.byte	0
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0xe
+	.byte	0
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0x8
+	.byte	0
+	.byte	0
+	.uleb128 0x4
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0xc
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0xc
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x1
+	.uleb128 0x40
+	.uleb128 0xa
+	.uleb128 0x2117
+	.uleb128 0xc
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0xa
+	.byte	0
+	.byte	0
+	.uleb128 0x6
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0xa
+	.byte	0
+	.byte	0
+	.uleb128 0x7
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0xc
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x1
+	.uleb128 0x40
+	.uleb128 0x6
+	.uleb128 0x2117
+	.uleb128 0xc
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x9
+	.uleb128 0x410a
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0xa
+	.uleb128 0x2111
+	.uleb128 0xa
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.uleb128 0x4109
+	.byte	0
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0xc
+	.uleb128 0x3c
+	.uleb128 0xc
+	.byte	0
+	.byte	0
+	.uleb128 0xc
+	.uleb128 0x35
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0xd
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0xc
+	.uleb128 0x2
+	.uleb128 0xa
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_loc,"",@progbits
+.Ldebug_loc0:
+.LLST0:
+	.quad	.LFB4-.Ltext0
+	.quad	.LCFI0-.Ltext0
+	.value	0x2
+	.byte	0x77
+	.sleb128 8
+	.quad	.LCFI0-.Ltext0
+	.quad	.LCFI1-.Ltext0
+	.value	0x2
+	.byte	0x77
+	.sleb128 16
+	.quad	.LCFI1-.Ltext0
+	.quad	.LFE4-.Ltext0
+	.value	0x2
+	.byte	0x77
+	.sleb128 8
+	.quad	0
+	.quad	0
+	.section	.debug_aranges,"",@progbits
+	.long	0x2c
+	.value	0x2
+	.long	.Ldebug_info0
+	.byte	0x8
+	.byte	0
+	.value	0
+	.value	0
+	.quad	.Ltext0
+	.quad	.Letext0-.Ltext0
+	.quad	0
+	.quad	0
+	.section	.debug_line,"",@progbits
+.Ldebug_line0:
+	.section	.debug_str,"MS",@progbits,1
+.LASF4:
+	.string	"unsigned int"
+.LASF6:
+	.string	"_Decimal32"
+.LASF7:
+	.string	"_Decimal128"
+.LASF2:
+	.string	"long unsigned int"
+.LASF12:
+	.string	"long long unsigned int"
+.LASF5:
+	.string	"_Decimal64"
+.LASF13:
+	.string	"main"
+.LASF3:
+	.string	"long int"
+.LASF10:
+	.string	"/tmp"
+.LASF0:
+	.string	"double"
+.LASF11:
+	.string	"long long int"
+.LASF1:
+	.string	"float"
+.LASF8:
+	.string	"GNU C 4.7.0 20110708 (experimental) [trunk revision 176048]"
+.LASF9:
+	.string	"typeddwarf.c"
+	.ident	"GCC: (GNU) 4.7.0 20110708 (experimental) [trunk revision 176048]"
+	.section	.note.GNU-stack,"",@progbits
diff --git a/gdb/testsuite/gdb.dwarf2/typeddwarf.c b/gdb/testsuite/gdb.dwarf2/typeddwarf.c
index e5f7d67..40497da 100644
--- a/gdb/testsuite/gdb.dwarf2/typeddwarf.c
+++ b/gdb/testsuite/gdb.dwarf2/typeddwarf.c
@@ -25,7 +25,7 @@ f1 (double a, double b, double c, float d, float e, int f, unsigned int g, long
   double w = d / 4.0;		/* { dg-final { gdb-test 29 "w" "1" } } */
   double x = a + b + 1.0;	/* { dg-final { gdb-test 29 "x" "4" } } */
   double y = b + c + 2.0;	/* { dg-final { gdb-test 29 "y" "7" } } */
-  float z = d + e + 3.0f;	/* { dg-final { gdb-test 29 "z" "12" } } */
+  float z = d + e + 3.0f;	/* { dg-final { xfail-gdb-test 29 "z" "12" "x86_64-*-*"} } */
   vv++;
 }
 
diff --git a/gdb/testsuite/gdb.dwarf2/typeddwarf.exp b/gdb/testsuite/gdb.dwarf2/typeddwarf.exp
index e6a420a..36a17e5 100644
--- a/gdb/testsuite/gdb.dwarf2/typeddwarf.exp
+++ b/gdb/testsuite/gdb.dwarf2/typeddwarf.exp
@@ -22,12 +22,16 @@ if ![dwarf2_support] {
     return 0  
 }
 
-# This test can only be run on x86 targets.
-if { ![is_x86_like_target] } {
+# This test can only be run on x86 and amd64 targets.
+if { [is_x86_like_target] } {
+    set sfile ${test}.S
+} elseif {[istarget "x86_64-*-*"]} {
+    set sfile ${test}-amd64.S
+} else {
     return 0
 }
 
-if { [prepare_for_testing "${test}.exp" "${test}" ${test}.S {nodebug additional_flags=-nostdlib}] } {
+if { [prepare_for_testing "${test}.exp" "${test}" ${sfile} {nodebug additional_flags=-nostdlib}] } {
     return -1
 }
 
@@ -45,10 +49,19 @@ proc gdb-test {line var value} {
     lappend tests($line) [list $var $value 0]
 }
 
-proc xfail-gdb-test {line var value} {
+# Add an XFAIL'd test.  If ARCH_PATTERN is given, and does not match
+# the target, then the test is simply added and not XFAIL'd.
+proc xfail-gdb-test {line var value {arch_pattern ""}} {
     global tests
 
-    lappend tests($line) [list $var $value 1]
+    set flag 1
+    if {$arch_pattern != ""} {
+	if {! [istarget $arch_pattern]} {
+	    set flag 0
+	}
+    }
+
+    lappend tests($line) [list $var $value $flag]
 }
 
 proc scan_gdb_tests {} {



More information about the Gdb-patches mailing list