This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB 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]

RFC: implement typed DWARF stack


I would appreciate comments on this.  In the absence of comments I am
going to check it in.

Jakub recently implemented Cary Coutant's typed DWARF stack proposal in
GCC.

Cary's proposal:

    http://www.dwarfstd.org/doc/040408.1.html

The GCC thread:

    http://gcc.gnu.org/ml/gcc-patches/2011-03/msg01730.html

This patch converts the DWARF expression evaluator to use GDB's value
types.  This approach made it easy to support floating point and also
decimal floating point; and also paves the way for any future
improvements.

There is some ugliness involving signed and unsigned types; this arises
because "old-style" untyped DWARF values don't have a consistent type.
Also I needed a little bit of special code to handle logical right
shifts.

The test case comes from Jakub.  I am checking in just the x86 variant.
I modified the .c file slightly (just comments) to XFAIL the cases known
not to work.

Built and regtested on our internal buildbot.  This tests on x86-64 F14
in 4 different configurations.

Tom

2011-05-04  Tom Tromey  <tromey@redhat.com>

	* dwarf2read.c (dwarf_stack_op_name): Add new values.
	(dwarf2_get_die_type): New function.
	* dwarf2loc.c (dwarf_expr_get_base_type): New function.
	(allocate_piece_closure): Acquire reference to values.
	(read_pieced_value): Update for value-based expressions.
	(write_pieced_value): Likewise.
	(free_pieced_value_closure): Call value_free as needed.
	(dwarf2_evaluate_loc_desc_full): Set get_base_type field.
	Update for value-based expressions.
	* dwarf2loc.h (dwarf2_get_die_type): Declare.
	* dwarf2expr.h (struct dwarf_stack_value) <value>: Change type.
	<get_base_type>: New field.
	(struct dwarf_expr_piece) <value>: Change type.
	(dwarf_expr_piece, dwarf_expr_fetch): Update.
	(dwarf_expr_pop): Remove.
	(dwarf_expr_address_type): Declare.
	* dwarf2expr.c (dwarf_arch_cookie): New global.
	(struct dwarf_gdbarch_types): New.
	(dwarf_gdbarch_types_init, dwarf_expr_address_type): New
	functions.
	(dwarf_expr_push): Change type of 'value' argument.  Update.
	(dwarf_expr_pop): Now static.
	(dwarf_expr_fetch): Change return type.
	(dwarf_require_integral): New function.
	(dwarf_expr_fetch): Simplify.
	(add_piece): Update.
	(base_types_equal_p, dwarf_get_base_type, get_unsigned_type): New
	functions.
	(execute_stack_op) <sign_ext>: Remove.
	Use values for DWARF stack.
	<DW_OP_GNU_const_type, DW_OP_GNU_deref_type,
	DW_OP_GNU_regval_type, DW_OP_GNU_convert, DW_OP_GNU_reinterpret>:
	New cases.
	(_initialize_dwarf2expr): New function.
	* dwarf2-frame.c (no_base_type): New function.
	(execute_stack_op): Set get_base_type field.  Update.

2011-05-04  Tom Tromey  <tromey@redhat.com>

	* gdb.dwarf2/typeddwarf.S: New file.
	* gdb.dwarf2/typeddwarf.c: New file.
	* gdb.dwarf2/typeddwarf.exp: New file.

diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c
index e78c328..f0d1d28 100644
--- a/gdb/dwarf2-frame.c
+++ b/gdb/dwarf2-frame.c
@@ -353,6 +353,14 @@ no_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset)
 		  _("Support for DW_OP_call* is invalid in CFI"));
 }
 
+/* Helper function for execute_stack_op.  */
+
+static struct type *
+no_base_type (struct dwarf_expr_context *ctx, size_t die)
+{
+  error (_("Support for typed DWARF is not supported in CFI"));
+}
+
 /* Execute the required actions for both the DW_CFA_restore and
 DW_CFA_restore_extended instructions.  */
 static void
@@ -406,14 +414,17 @@ execute_stack_op (const gdb_byte *exp, ULONGEST len, int addr_size,
   ctx->get_frame_pc = no_get_frame_pc;
   ctx->get_tls_address = no_get_tls_address;
   ctx->dwarf_call = no_dwarf_call;
+  ctx->get_base_type = no_base_type;
 
-  dwarf_expr_push (ctx, initial, initial_in_stack_memory);
+  dwarf_expr_push (ctx, value_from_ulongest (dwarf_expr_address_type (ctx, 1),
+					     initial),
+		   initial_in_stack_memory);
   dwarf_expr_eval (ctx, exp, len);
 
   if (ctx->location == DWARF_VALUE_MEMORY)
     result = dwarf_expr_fetch_address (ctx, 0);
   else if (ctx->location == DWARF_VALUE_REGISTER)
-    result = read_reg (this_frame, dwarf_expr_fetch (ctx, 0));
+    result = read_reg (this_frame, value_as_long (dwarf_expr_fetch (ctx, 0)));
   else
     {
       /* This is actually invalid DWARF, but if we ever do run across
diff --git a/gdb/dwarf2expr.c b/gdb/dwarf2expr.c
index 91fccf9..7b1b8af 100644
--- a/gdb/dwarf2expr.c
+++ b/gdb/dwarf2expr.c
@@ -34,6 +34,54 @@
 static void execute_stack_op (struct dwarf_expr_context *,
 			      const gdb_byte *, const gdb_byte *);
 
+/* Cookie for gdbarch data.  */
+
+static struct gdbarch_data *dwarf_arch_cookie;
+
+/* This holds two gdbarch-specific types used by the DWARF expression
+   evaluator.  */
+
+struct dwarf_gdbarch_types
+{
+  /* The signed "address" type.  */
+  struct type *signed_addr;
+  /* The unsigned "address" type.  */
+  struct type *unsigned_addr;
+};
+
+/* Allocate and fill in dwarf_gdbarch_types for an arch.  */
+
+static void *
+dwarf_gdbarch_types_init (struct gdbarch *gdbarch)
+{
+  struct dwarf_gdbarch_types *types
+    = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct dwarf_gdbarch_types);
+
+  types->signed_addr
+    = arch_integer_type (gdbarch,
+			 8 * gdbarch_dwarf2_addr_size (gdbarch),
+			 0, "<signed DWARF address type>");
+  types->unsigned_addr
+    = arch_integer_type (gdbarch,
+			 8 * gdbarch_dwarf2_addr_size (gdbarch),
+			 1, "<unsigned DWARF address type>");
+
+  return types;
+}
+
+/* Return the type used for DWARF operations where the type is
+   unspecified in the DWARF spec.  SIGNED_P indicates whether the
+   returned type should be the signed or unsigned variant.  */
+
+struct type *
+dwarf_expr_address_type (struct dwarf_expr_context *ctx, int signed_p)
+{
+  struct dwarf_gdbarch_types *types = gdbarch_data (ctx->gdbarch,
+						    dwarf_arch_cookie);
+
+  return signed_p ? types->signed_addr : types->unsigned_addr;
+}
+
 /* Create a new context for the expression evaluator.  */
 
 struct dwarf_expr_context *
@@ -97,16 +145,11 @@ dwarf_expr_grow_stack (struct dwarf_expr_context *ctx, size_t need)
 /* Push VALUE onto CTX's stack.  */
 
 void
-dwarf_expr_push (struct dwarf_expr_context *ctx, ULONGEST value,
+dwarf_expr_push (struct dwarf_expr_context *ctx, struct value *value,
 		 int in_stack_memory)
 {
   struct dwarf_stack_value *v;
 
-  /* We keep all stack elements within the range defined by the
-     DWARF address size.  */
-  if (ctx->addr_size < sizeof (ULONGEST))
-    value &= ((ULONGEST) 1 << (ctx->addr_size * HOST_CHAR_BIT)) - 1;
-
   dwarf_expr_grow_stack (ctx, 1);
   v = &ctx->stack[ctx->stack_len++];
   v->value = value;
@@ -115,7 +158,7 @@ dwarf_expr_push (struct dwarf_expr_context *ctx, ULONGEST value,
 
 /* Pop the top item off of CTX's stack.  */
 
-void
+static void
 dwarf_expr_pop (struct dwarf_expr_context *ctx)
 {
   if (ctx->stack_len <= 0)
@@ -125,7 +168,7 @@ dwarf_expr_pop (struct dwarf_expr_context *ctx)
 
 /* Retrieve the N'th item on CTX's stack.  */
 
-ULONGEST
+struct value *
 dwarf_expr_fetch (struct dwarf_expr_context *ctx, int n)
 {
   if (ctx->stack_len <= n)
@@ -133,7 +176,17 @@ dwarf_expr_fetch (struct dwarf_expr_context *ctx, int n)
 	      "stack only has %d elements on it."),
 	    n, ctx->stack_len);
   return ctx->stack[ctx->stack_len - (1 + n)].value;
+}
 
+/* Require that TYPE be an integral type; throw an exception if not.  */
+
+static void
+dwarf_require_integral (struct type *type)
+{
+  if (TYPE_CODE (type) != TYPE_CODE_INT
+      && TYPE_CODE (type) != TYPE_CODE_CHAR
+      && TYPE_CODE (type) != TYPE_CODE_BOOL)
+    error (_("integral type expected in DWARF expression"));
 }
 
 /* Retrieve the N'th item on CTX's stack, converted to an address.  */
@@ -141,41 +194,10 @@ dwarf_expr_fetch (struct dwarf_expr_context *ctx, int n)
 CORE_ADDR
 dwarf_expr_fetch_address (struct dwarf_expr_context *ctx, int n)
 {
-  ULONGEST result = dwarf_expr_fetch (ctx, n);
-
-  /* For most architectures, calling extract_unsigned_integer() alone
-     is sufficient for extracting an address.  However, some
-     architectures (e.g. MIPS) use signed addresses and using
-     extract_unsigned_integer() will not produce a correct
-     result.  Make sure we invoke gdbarch_integer_to_address()
-     for those architectures which require it.  */
-  if (gdbarch_integer_to_address_p (ctx->gdbarch))
-    {
-      enum bfd_endian byte_order = gdbarch_byte_order (ctx->gdbarch);
-      gdb_byte *buf = alloca (ctx->addr_size);
-      struct type *int_type;
+  struct value *result_val = dwarf_expr_fetch (ctx, n);
 
-      switch (ctx->addr_size)
-	{
-	case 2:
-	  int_type = builtin_type (ctx->gdbarch)->builtin_uint16;
-	  break;
-	case 4:
-	  int_type = builtin_type (ctx->gdbarch)->builtin_uint32;
-	  break;
-	case 8:
-	  int_type = builtin_type (ctx->gdbarch)->builtin_uint64;
-	  break;
-	default:
-	  internal_error (__FILE__, __LINE__,
-			  _("Unsupported address size.\n"));
-	}
-
-      store_unsigned_integer (buf, ctx->addr_size, byte_order, result);
-      return gdbarch_integer_to_address (ctx->gdbarch, int_type, buf);
-    }
-
-  return (CORE_ADDR) result;
+  dwarf_require_integral (value_type (result_val));
+  return value_as_address (result_val);
 }
 
 /* Retrieve the in_stack_memory flag of the N'th item on CTX's stack.  */
@@ -188,7 +210,6 @@ dwarf_expr_fetch_in_stack_memory (struct dwarf_expr_context *ctx, int n)
 	      "stack only has %d elements on it."),
 	    n, ctx->stack_len);
   return ctx->stack[ctx->stack_len - (1 + n)].in_stack_memory;
-
 }
 
 /* Return true if the expression stack is empty.  */
@@ -238,7 +259,7 @@ add_piece (struct dwarf_expr_context *ctx, ULONGEST size, ULONGEST offset)
   else if (p->location == DWARF_VALUE_IMPLICIT_POINTER)
     {
       p->v.ptr.die = ctx->len;
-      p->v.ptr.offset = (LONGEST) dwarf_expr_fetch (ctx, 0);
+      p->v.ptr.offset = value_as_long (dwarf_expr_fetch (ctx, 0));
     }
   else
     {
@@ -335,6 +356,65 @@ dwarf_expr_require_composition (const gdb_byte *op_ptr, const gdb_byte *op_end,
 	   op_name);
 }
 
+/* Return true iff the types T1 and T2 are "the same".  This only does
+   checks that might reasonably be needed to compare DWARF base
+   types.  */
+
+static int
+base_types_equal_p (struct type *t1, struct type *t2)
+{
+  if (TYPE_CODE (t1) != TYPE_CODE (t2))
+    return 0;
+  if (TYPE_UNSIGNED (t1) != TYPE_UNSIGNED (t2))
+    return 0;
+  return TYPE_LENGTH (t1) == TYPE_LENGTH (t2);
+}
+
+/* A convenience function to call get_base_type on CTX and return the
+   result.  DIE is the DIE whose type we need.  SIZE is non-zero if
+   this function should verify that the resulting type has the correct
+   size.  */
+
+static struct type *
+dwarf_get_base_type (struct dwarf_expr_context *ctx, ULONGEST die, int size)
+{
+  struct type *result;
+
+  if (ctx->get_base_type)
+    {
+      result = ctx->get_base_type (ctx, die);
+      if (size != 0 && TYPE_LENGTH (result) != size)
+	error (_("DW_OP_GNU_const_type has different sizes for type and data"));
+    }
+  else
+    /* Anything will do.  */
+    result = builtin_type (ctx->gdbarch)->builtin_int;
+
+  return result;
+}
+
+/* Return the unsigned form of TYPE.  TYPE is necessarily an integral
+   type.  */
+
+static struct type *
+get_unsigned_type (struct gdbarch *gdbarch, struct type *type)
+{
+  switch (TYPE_LENGTH (type))
+    {
+    case 1:
+      return builtin_type (gdbarch)->builtin_uint8;
+    case 2:
+      return builtin_type (gdbarch)->builtin_uint16;
+    case 4:
+      return builtin_type (gdbarch)->builtin_uint32;
+    case 8:
+      return builtin_type (gdbarch)->builtin_uint64;
+    default:
+      error (_("no unsigned variant found for type, while evaluating "
+	       "DWARF expression"));
+    }
+}
+
 /* The engine for the expression evaluator.  Using the context in CTX,
    evaluate the expression between OP_PTR and OP_END.  */
 
@@ -342,10 +422,9 @@ static void
 execute_stack_op (struct dwarf_expr_context *ctx,
 		  const gdb_byte *op_ptr, const gdb_byte *op_end)
 {
-#define sign_ext(x) ((LONGEST) (((x) ^ sign_bit) - sign_bit))
-  ULONGEST sign_bit = (ctx->addr_size >= sizeof (ULONGEST) ? 0
-		       : ((ULONGEST) 1) << (ctx->addr_size * 8 - 1));
   enum bfd_endian byte_order = gdbarch_byte_order (ctx->gdbarch);
+  struct type *address_type = dwarf_expr_address_type (ctx, 1);
+  struct type *uaddress_type = dwarf_expr_address_type (ctx, 0);
 
   ctx->location = DWARF_VALUE_MEMORY;
   ctx->initialized = 1;  /* Default is initialized.  */
@@ -368,6 +447,7 @@ execute_stack_op (struct dwarf_expr_context *ctx,
       int in_stack_memory = 0;
       ULONGEST uoffset, reg;
       LONGEST offset;
+      struct value *result_val = NULL;
 
       switch (op)
 	{
@@ -404,6 +484,7 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 	case DW_OP_lit30:
 	case DW_OP_lit31:
 	  result = op - DW_OP_lit0;
+	  result_val = value_from_ulongest (address_type, result);
 	  break;
 
 	case DW_OP_addr:
@@ -416,47 +497,58 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 	     branching between the address and the TLS op.  */
 	  if (op_ptr >= op_end || *op_ptr != DW_OP_GNU_push_tls_address)
 	    result += ctx->offset;
+	  result_val = value_from_ulongest (address_type, result);
 	  break;
 
 	case DW_OP_const1u:
 	  result = extract_unsigned_integer (op_ptr, 1, byte_order);
+	  result_val = value_from_ulongest (address_type, result);
 	  op_ptr += 1;
 	  break;
 	case DW_OP_const1s:
 	  result = extract_signed_integer (op_ptr, 1, byte_order);
+	  result_val = value_from_ulongest (address_type, result);
 	  op_ptr += 1;
 	  break;
 	case DW_OP_const2u:
 	  result = extract_unsigned_integer (op_ptr, 2, byte_order);
+	  result_val = value_from_ulongest (address_type, result);
 	  op_ptr += 2;
 	  break;
 	case DW_OP_const2s:
 	  result = extract_signed_integer (op_ptr, 2, byte_order);
+	  result_val = value_from_ulongest (address_type, result);
 	  op_ptr += 2;
 	  break;
 	case DW_OP_const4u:
 	  result = extract_unsigned_integer (op_ptr, 4, byte_order);
+	  result_val = value_from_ulongest (address_type, result);
 	  op_ptr += 4;
 	  break;
 	case DW_OP_const4s:
 	  result = extract_signed_integer (op_ptr, 4, byte_order);
+	  result_val = value_from_ulongest (address_type, result);
 	  op_ptr += 4;
 	  break;
 	case DW_OP_const8u:
 	  result = extract_unsigned_integer (op_ptr, 8, byte_order);
+	  result_val = value_from_ulongest (address_type, result);
 	  op_ptr += 8;
 	  break;
 	case DW_OP_const8s:
 	  result = extract_signed_integer (op_ptr, 8, byte_order);
+	  result_val = value_from_ulongest (address_type, result);
 	  op_ptr += 8;
 	  break;
 	case DW_OP_constu:
 	  op_ptr = read_uleb128 (op_ptr, op_end, &uoffset);
 	  result = uoffset;
+	  result_val = value_from_ulongest (address_type, result);
 	  break;
 	case DW_OP_consts:
 	  op_ptr = read_sleb128 (op_ptr, op_end, &offset);
 	  result = offset;
+	  result_val = value_from_ulongest (address_type, result);
 	  break;
 
 	/* The DW_OP_reg operations are required to occur alone in
@@ -502,6 +594,7 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 		     "or DW_OP_bit_piece."));
 
 	  result = op - DW_OP_reg0;
+	  result_val = value_from_ulongest (address_type, result);
 	  ctx->location = DWARF_VALUE_REGISTER;
 	  break;
 
@@ -510,6 +603,7 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 	  dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_regx");
 
 	  result = reg;
+	  result_val = value_from_ulongest (address_type, result);
 	  ctx->location = DWARF_VALUE_REGISTER;
 	  break;
 
@@ -547,6 +641,7 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 	    /* The byte offset into the data.  */
 	    op_ptr = read_sleb128 (op_ptr, op_end, &len);
 	    result = (ULONGEST) len;
+	    result_val = value_from_ulongest (address_type, result);
 
 	    ctx->location = DWARF_VALUE_IMPLICIT_POINTER;
 	    dwarf_expr_require_composition (op_ptr, op_end,
@@ -590,6 +685,7 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 	    op_ptr = read_sleb128 (op_ptr, op_end, &offset);
 	    result = (ctx->read_reg) (ctx->baton, op - DW_OP_breg0);
 	    result += offset;
+	    result_val = value_from_ulongest (address_type, result);
 	  }
 	  break;
 	case DW_OP_bregx:
@@ -598,6 +694,7 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 	    op_ptr = read_sleb128 (op_ptr, op_end, &offset);
 	    result = (ctx->read_reg) (ctx->baton, reg);
 	    result += offset;
+	    result_val = value_from_ulongest (address_type, result);
 	  }
 	  break;
 	case DW_OP_fbreg:
@@ -620,11 +717,14 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 	    if (ctx->location == DWARF_VALUE_MEMORY)
 	      result = dwarf_expr_fetch_address (ctx, 0);
 	    else if (ctx->location == DWARF_VALUE_REGISTER)
-	      result = (ctx->read_reg) (ctx->baton, dwarf_expr_fetch (ctx, 0));
+	      result
+		= (ctx->read_reg) (ctx->baton,
+				   value_as_long (dwarf_expr_fetch (ctx, 0)));
 	    else
 	      error (_("Not implemented: computing frame "
 		       "base using explicit value operator"));
 	    result = result + offset;
+	    result_val = value_from_ulongest (address_type, result);
 	    in_stack_memory = 1;
 	    ctx->stack_len = before_stack_len;
 	    ctx->location = DWARF_VALUE_MEMORY;
@@ -632,7 +732,7 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 	  break;
 
 	case DW_OP_dup:
-	  result = dwarf_expr_fetch (ctx, 0);
+	  result_val = dwarf_expr_fetch (ctx, 0);
 	  in_stack_memory = dwarf_expr_fetch_in_stack_memory (ctx, 0);
 	  break;
 
@@ -642,7 +742,7 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 
 	case DW_OP_pick:
 	  offset = *op_ptr++;
-	  result = dwarf_expr_fetch (ctx, offset);
+	  result_val = dwarf_expr_fetch (ctx, offset);
 	  in_stack_memory = dwarf_expr_fetch_in_stack_memory (ctx, offset);
 	  break;
 	  
@@ -662,7 +762,7 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 	  }
 
 	case DW_OP_over:
-	  result = dwarf_expr_fetch (ctx, 1);
+	  result_val = dwarf_expr_fetch (ctx, 1);
 	  in_stack_memory = dwarf_expr_fetch_in_stack_memory (ctx, 1);
 	  break;
 
@@ -685,14 +785,27 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 
 	case DW_OP_deref:
 	case DW_OP_deref_size:
+	case DW_OP_GNU_deref_type:
 	  {
 	    int addr_size = (op == DW_OP_deref ? ctx->addr_size : *op_ptr++);
 	    gdb_byte *buf = alloca (addr_size);
 	    CORE_ADDR addr = dwarf_expr_fetch_address (ctx, 0);
+	    struct type *type;
+
 	    dwarf_expr_pop (ctx);
 
+	    if (op == DW_OP_GNU_deref_type)
+	      {
+		ULONGEST type_die;
+
+		op_ptr = read_uleb128 (op_ptr, op_end, &type_die);
+		type = dwarf_get_base_type (ctx, type_die, 0);
+	      }
+	    else
+	      type = address_type;
+
 	    (ctx->read_mem) (ctx->baton, buf, addr, addr_size);
-	    result = extract_unsigned_integer (buf, addr_size, byte_order);
+	    result_val = value_from_contents_and_address (type, buf, addr);
 	    break;
 	  }
 
@@ -700,27 +813,34 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 	case DW_OP_neg:
 	case DW_OP_not:
 	case DW_OP_plus_uconst:
-	  /* Unary operations.  */
-	  result = dwarf_expr_fetch (ctx, 0);
-	  dwarf_expr_pop (ctx);
+	  {
+	    /* Unary operations.  */
+	    result_val = dwarf_expr_fetch (ctx, 0);
+	    dwarf_expr_pop (ctx);
 
-	  switch (op)
-	    {
-	    case DW_OP_abs:
-	      if (sign_ext (result) < 0)
-		result = -result;
-	      break;
-	    case DW_OP_neg:
-	      result = -result;
-	      break;
-	    case DW_OP_not:
-	      result = ~result;
-	      break;
-	    case DW_OP_plus_uconst:
-	      op_ptr = read_uleb128 (op_ptr, op_end, &reg);
-	      result += reg;
-	      break;
-	    }
+	    switch (op)
+	      {
+	      case DW_OP_abs:
+		if (value_less (result_val,
+				value_zero (value_type (result_val), not_lval)))
+		  result_val = value_neg (result_val);
+		break;
+	      case DW_OP_neg:
+		result_val = value_neg (result_val);
+		break;
+	      case DW_OP_not:
+		dwarf_require_integral (value_type (result_val));
+		result_val = value_complement (result_val);
+		break;
+	      case DW_OP_plus_uconst:
+		dwarf_require_integral (value_type (result_val));
+		result = value_as_long (result_val);
+		op_ptr = read_uleb128 (op_ptr, op_end, &reg);
+		result += reg;
+		result_val = value_from_ulongest (address_type, result);
+		break;
+	      }
+	  }
 	  break;
 
 	case DW_OP_and:
@@ -742,7 +862,7 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 	case DW_OP_ne:
 	  {
 	    /* Binary operations.  */
-	    ULONGEST first, second;
+	    struct value *first, *second;
 
 	    second = dwarf_expr_fetch (ctx, 0);
 	    dwarf_expr_pop (ctx);
@@ -750,62 +870,106 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 	    first = dwarf_expr_fetch (ctx, 0);
 	    dwarf_expr_pop (ctx);
 
+	    if (! base_types_equal_p (value_type (first), value_type (second)))
+	      error (_("Incompatible types on DWARF stack"));
+
 	    switch (op)
 	      {
 	      case DW_OP_and:
-		result = first & second;
+		dwarf_require_integral (value_type (first));
+		dwarf_require_integral (value_type (second));
+		result_val = value_binop (first, second, BINOP_BITWISE_AND);
 		break;
 	      case DW_OP_div:
-		if (!second)
-		  error (_("Division by zero"));
-		result = sign_ext (first) / sign_ext (second);
+		result_val = value_binop (first, second, BINOP_DIV);
                 break;
 	      case DW_OP_minus:
-		result = first - second;
+		result_val = value_binop (first, second, BINOP_SUB);
 		break;
 	      case DW_OP_mod:
-		if (!second)
-		  error (_("Division by zero"));
-		result = first % second;
+		/* We have to special-case "old-style" untyped values
+		   -- these must have mod computed using unsigned
+		   math.  */
+		if (value_type (first) == address_type)
+		  {
+		    first = value_cast (uaddress_type, first);
+		    second = value_cast (uaddress_type, second);
+		  }
+		/* Note that value_binop doesn't handle float or
+		   decimal float here.  This seems unimportant.  */
+		result_val = value_binop (first, second, BINOP_MOD);
+		if (value_type (result_val) == uaddress_type)
+		  result_val = value_cast (address_type, result_val);
 		break;
 	      case DW_OP_mul:
-		result = first * second;
+		result_val = value_binop (first, second, BINOP_MUL);
 		break;
 	      case DW_OP_or:
-		result = first | second;
+		dwarf_require_integral (value_type (first));
+		dwarf_require_integral (value_type (second));
+		result_val = value_binop (first, second, BINOP_BITWISE_IOR);
 		break;
 	      case DW_OP_plus:
-		result = first + second;
+		result_val = value_binop (first, second, BINOP_ADD);
 		break;
 	      case DW_OP_shl:
-		result = first << second;
+		dwarf_require_integral (value_type (first));
+		dwarf_require_integral (value_type (second));
+		result_val = value_binop (first, second, BINOP_LSH);
 		break;
 	      case DW_OP_shr:
-		result = first >> second;
+		dwarf_require_integral (value_type (first));
+		dwarf_require_integral (value_type (second));
+		if (!TYPE_UNSIGNED (value_type (first)))
+		  {
+		    struct type *utype
+		      = get_unsigned_type (ctx->gdbarch, value_type (first));
+
+		    first = value_cast (utype, first);
+		  }
+
+		result_val = value_binop (first, second, BINOP_RSH);
+		/* Make sure we wind up with the same type we started
+		   with.  */
+		if (value_type (result_val) != value_type (second))
+		  result_val = value_cast (value_type (second), result_val);
                 break;
 	      case DW_OP_shra:
-		result = sign_ext (first) >> second;
+		dwarf_require_integral (value_type (first));
+		dwarf_require_integral (value_type (second));
+		result_val = value_binop (first, second, BINOP_RSH);
 		break;
 	      case DW_OP_xor:
-		result = first ^ second;
+		dwarf_require_integral (value_type (first));
+		dwarf_require_integral (value_type (second));
+		result_val = value_binop (first, second, BINOP_BITWISE_XOR);
 		break;
 	      case DW_OP_le:
-		result = sign_ext (first) <= sign_ext (second);
+		/* A <= B is !(B < A).  */
+		result = ! value_less (second, first);
+		result_val = value_from_ulongest (address_type, result);
 		break;
 	      case DW_OP_ge:
-		result = sign_ext (first) >= sign_ext (second);
+		/* A >= B is !(A < B).  */
+		result = ! value_less (first, second);
+		result_val = value_from_ulongest (address_type, result);
 		break;
 	      case DW_OP_eq:
-		result = sign_ext (first) == sign_ext (second);
+		result = value_equal (first, second);
+		result_val = value_from_ulongest (address_type, result);
 		break;
 	      case DW_OP_lt:
-		result = sign_ext (first) < sign_ext (second);
+		result = value_less (first, second);
+		result_val = value_from_ulongest (address_type, result);
 		break;
 	      case DW_OP_gt:
-		result = sign_ext (first) > sign_ext (second);
+		/* A > B is B < A.  */
+		result = value_less (second, first);
+		result_val = value_from_ulongest (address_type, result);
 		break;
 	      case DW_OP_ne:
-		result = sign_ext (first) != sign_ext (second);
+		result = ! value_equal (first, second);
+		result_val = value_from_ulongest (address_type, result);
 		break;
 	      default:
 		internal_error (__FILE__, __LINE__,
@@ -816,6 +980,7 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 
 	case DW_OP_call_frame_cfa:
 	  result = (ctx->get_frame_cfa) (ctx->baton);
+	  result_val = value_from_ulongest (address_type, result);
 	  in_stack_memory = 1;
 	  break;
 
@@ -828,9 +993,10 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 	  control block at which the variable is located.  Nothing
 	  should follow this operator, so the top of stack would be
 	  returned.  */
-	  result = dwarf_expr_fetch (ctx, 0);
+	  result = value_as_long (dwarf_expr_fetch (ctx, 0));
 	  dwarf_expr_pop (ctx);
 	  result = (ctx->get_tls_address) (ctx->baton, result);
+	  result_val = value_from_ulongest (address_type, result);
 	  break;
 
 	case DW_OP_skip:
@@ -840,11 +1006,17 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 	  goto no_push;
 
 	case DW_OP_bra:
-	  offset = extract_signed_integer (op_ptr, 2, byte_order);
-	  op_ptr += 2;
-	  if (dwarf_expr_fetch (ctx, 0) != 0)
-	    op_ptr += offset;
-	  dwarf_expr_pop (ctx);
+	  {
+	    struct value *val;
+
+	    offset = extract_signed_integer (op_ptr, 2, byte_order);
+	    op_ptr += 2;
+	    val = dwarf_expr_fetch (ctx, 0);
+	    dwarf_require_integral (value_type (val));
+	    if (value_as_long (val) != 0)
+	      op_ptr += offset;
+	    dwarf_expr_pop (ctx);
+	  }
 	  goto no_push;
 
 	case DW_OP_nop:
@@ -912,12 +1084,81 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 	  ctx->num_pieces = 0;
 	  goto abort_expression;
 
+	case DW_OP_GNU_const_type:
+	  {
+	    ULONGEST type_die;
+	    int n;
+	    const gdb_byte *data;
+	    struct type *type;
+
+	    op_ptr = read_uleb128 (op_ptr, op_end, &type_die);
+	    n = *op_ptr++;
+	    data = op_ptr;
+	    op_ptr += n;
+
+	    type = dwarf_get_base_type (ctx, type_die, n);
+
+	    /* Note that the address does not matter, since there is
+	       no way to fetch it.  */
+	    result_val = value_from_contents_and_address (type, data, 0);
+	  }
+	  break;
+
+	case DW_OP_GNU_regval_type:
+	  {
+	    ULONGEST type_die;
+	    struct type *type;
+
+	    op_ptr = read_uleb128 (op_ptr, op_end, &reg);
+	    op_ptr = read_uleb128 (op_ptr, op_end, &type_die);
+
+	    type = dwarf_get_base_type (ctx, type_die, 0);
+	    result = (ctx->read_reg) (ctx->baton, reg);
+	    result_val = value_from_ulongest (type, result);
+	  }
+	  break;
+
+	case DW_OP_GNU_convert:
+	case DW_OP_GNU_reinterpret:
+	  {
+	    ULONGEST type_die;
+	    struct type *type;
+
+	    op_ptr = read_uleb128 (op_ptr, op_end, &type_die);
+
+	    type = dwarf_get_base_type (ctx, type_die, 0);
+
+	    result_val = dwarf_expr_fetch (ctx, 0);
+	    dwarf_expr_pop (ctx);
+
+	    if (op == DW_OP_GNU_convert)
+	      result_val = value_cast (type, result_val);
+	    else if (type == value_type (result_val))
+	      {
+		/* Nothing.  */
+	      }
+	    else if (TYPE_LENGTH (type)
+		     != TYPE_LENGTH (value_type (result_val)))
+	      error (_("DW_OP_GNU_reinterpret has wrong size"));
+	    else
+	      {
+		struct value *val = allocate_value (type);
+		gdb_byte *contents = value_contents_raw (val);
+
+		memcpy (contents, value_contents_all (result_val),
+			TYPE_LENGTH (type));
+		result_val = val;
+	      }
+	  }
+	  break;
+
 	default:
 	  error (_("Unhandled dwarf expression opcode 0x%x"), op);
 	}
 
       /* Most things push a result value.  */
-      dwarf_expr_push (ctx, result, in_stack_memory);
+      gdb_assert (result_val != NULL);
+      dwarf_expr_push (ctx, result_val, in_stack_memory);
     no_push:
       ;
     }
@@ -931,5 +1172,11 @@ execute_stack_op (struct dwarf_expr_context *ctx,
 abort_expression:
   ctx->recursion_depth--;
   gdb_assert (ctx->recursion_depth >= 0);
-#undef sign_ext
+}
+
+void
+_initialize_dwarf2expr (void)
+{
+  dwarf_arch_cookie
+    = gdbarch_data_register_post_init (dwarf_gdbarch_types_init);
 }
diff --git a/gdb/dwarf2expr.h b/gdb/dwarf2expr.h
index 78ff53f..7460e6a 100644
--- a/gdb/dwarf2expr.h
+++ b/gdb/dwarf2expr.h
@@ -51,7 +51,7 @@ enum dwarf_value_location
 
 struct dwarf_stack_value
 {
-  ULONGEST value;
+  struct value *value;
 
   /* Non-zero if the piece is in memory and is known to be
      on the program's stack.  It is always ok to set this to zero.
@@ -111,6 +111,13 @@ struct dwarf_expr_context
      being passed to and returned from the called DWARF subroutine.  */
   void (*dwarf_call) (struct dwarf_expr_context *ctx, size_t die_offset);
 
+  /* Return the base type given by the indicated DIE.  This can throw
+     an exception if the DIE is invalid or does not represent a base
+     type.  If can also be NULL in the special case where the
+     callbacks are not performing evaluation, and thus it is
+     meaningful to substitute a stub type of the correct size.  */
+  struct type *(*get_base_type) (struct dwarf_expr_context *ctx, size_t die);
+
 #if 0
   /* Not yet implemented.  */
 
@@ -182,7 +189,7 @@ struct dwarf_expr_piece
 
     /* The piece's register number or literal value, for
        DWARF_VALUE_REGISTER or DWARF_VALUE_STACK pieces.  */
-    ULONGEST value;
+    struct value *value;
 
     struct
     {
@@ -214,12 +221,11 @@ void free_dwarf_expr_context (struct dwarf_expr_context *ctx);
 struct cleanup *
     make_cleanup_free_dwarf_expr_context (struct dwarf_expr_context *ctx);
 
-void dwarf_expr_push (struct dwarf_expr_context *ctx, ULONGEST value,
+void dwarf_expr_push (struct dwarf_expr_context *ctx, struct value *value,
 		      int in_stack_memory);
-void dwarf_expr_pop (struct dwarf_expr_context *ctx);
 void dwarf_expr_eval (struct dwarf_expr_context *ctx, const gdb_byte *addr,
 		      size_t len);
-ULONGEST dwarf_expr_fetch (struct dwarf_expr_context *ctx, int n);
+struct value *dwarf_expr_fetch (struct dwarf_expr_context *ctx, int n);
 CORE_ADDR dwarf_expr_fetch_address (struct dwarf_expr_context *ctx, int n);
 int dwarf_expr_fetch_in_stack_memory (struct dwarf_expr_context *ctx, int n);
 
@@ -234,4 +240,7 @@ const char *dwarf_stack_op_name (unsigned int);
 void dwarf_expr_require_composition (const gdb_byte *, const gdb_byte *,
 				     const char *);
 
+struct type *dwarf_expr_address_type (struct dwarf_expr_context *ctx,
+				      int signed_p);
+
 #endif /* dwarf2expr.h */
diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c
index 4c13307..7b43481 100644
--- a/gdb/dwarf2loc.c
+++ b/gdb/dwarf2loc.c
@@ -286,6 +286,16 @@ dwarf_expr_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset)
 		     ctx->get_frame_pc, ctx->baton);
 }
 
+/* Callback function for dwarf2_evaluate_loc_desc.  */
+
+static struct type *
+dwarf_expr_get_base_type (struct dwarf_expr_context *ctx, size_t die_offset)
+{
+  struct dwarf_expr_baton *debaton = ctx->baton;
+
+  return dwarf2_get_die_type (die_offset, debaton->per_cu);
+}
+
 struct piece_closure
 {
   /* Reference count.  */
@@ -313,6 +323,7 @@ allocate_piece_closure (struct dwarf2_per_cu_data *per_cu,
 			int addr_size)
 {
   struct piece_closure *c = XZALLOC (struct piece_closure);
+  int i;
 
   c->refc = 1;
   c->per_cu = per_cu;
@@ -321,6 +332,10 @@ allocate_piece_closure (struct dwarf2_per_cu_data *per_cu,
   c->pieces = XCALLOC (n_pieces, struct dwarf_expr_piece);
 
   memcpy (c->pieces, pieces, n_pieces * sizeof (struct dwarf_expr_piece));
+  for (i = 0; i < n_pieces; ++i)
+    if (c->pieces[i].location == DWARF_VALUE_REGISTER
+	|| c->pieces[i].location == DWARF_VALUE_STACK)
+      value_incref (c->pieces[i].v.value);
 
   return c;
 }
@@ -576,7 +591,9 @@ read_pieced_value (struct value *v)
 	case DWARF_VALUE_REGISTER:
 	  {
 	    struct gdbarch *arch = get_frame_arch (frame);
-	    int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, p->v.value);
+	    int gdb_regnum
+	      = gdbarch_dwarf2_reg_to_regnum (arch,
+					      value_as_long (p->v.value));
 	    int reg_offset = source_offset;
 
 	    if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
@@ -609,7 +626,7 @@ read_pieced_value (struct value *v)
 	    else
 	      {
 		error (_("Unable to access DWARF register number %s"),
-		       paddress (arch, p->v.value));
+		       paddress (arch, value_as_long (p->v.value)));
 	      }
 	  }
 	  break;
@@ -623,7 +640,6 @@ read_pieced_value (struct value *v)
 
 	case DWARF_VALUE_STACK:
 	  {
-	    struct gdbarch *gdbarch = get_type_arch (value_type (v));
 	    size_t n = this_size;
 
 	    if (n > c->addr_size - source_offset)
@@ -634,18 +650,11 @@ read_pieced_value (struct value *v)
 	      {
 		/* Nothing.  */
 	      }
-	    else if (source_offset == 0)
-	      store_unsigned_integer (buffer, n,
-				      gdbarch_byte_order (gdbarch),
-				      p->v.value);
 	    else
 	      {
-		gdb_byte bytes[sizeof (ULONGEST)];
+		const gdb_byte *val_bytes = value_contents_all (p->v.value);
 
-		store_unsigned_integer (bytes, n + source_offset,
-					gdbarch_byte_order (gdbarch),
-					p->v.value);
-		memcpy (buffer, bytes + source_offset, n);
+		intermediate_buffer = val_bytes + source_offset;
 	      }
 	  }
 	  break;
@@ -776,7 +785,8 @@ write_pieced_value (struct value *to, struct value *from)
 	case DWARF_VALUE_REGISTER:
 	  {
 	    struct gdbarch *arch = get_frame_arch (frame);
-	    int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, p->v.value);
+	    int gdb_regnum
+	      = gdbarch_dwarf2_reg_to_regnum (arch, value_as_long (p->v.value));
 	    int reg_offset = dest_offset;
 
 	    if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
@@ -816,7 +826,7 @@ write_pieced_value (struct value *to, struct value *from)
 	    else
 	      {
 		error (_("Unable to write to DWARF register number %s"),
-		       paddress (arch, p->v.value));
+		       paddress (arch, value_as_long (p->v.value)));
 	      }
 	  }
 	  break;
@@ -1033,6 +1043,13 @@ free_pieced_value_closure (struct value *v)
   --c->refc;
   if (c->refc == 0)
     {
+      int i;
+
+      for (i = 0; i < c->n_pieces; ++i)
+	if (c->pieces[i].location == DWARF_VALUE_REGISTER
+	    || c->pieces[i].location == DWARF_VALUE_STACK)
+	  value_free (c->pieces[i].v.value);
+
       xfree (c->pieces);
       xfree (c);
     }
@@ -1106,6 +1123,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame,
   ctx->get_frame_pc = dwarf_expr_frame_pc;
   ctx->get_tls_address = dwarf_expr_tls_address;
   ctx->dwarf_call = dwarf_expr_dwarf_call;
+  ctx->get_base_type = dwarf_expr_get_base_type;
 
   TRY_CATCH (ex, RETURN_MASK_ERROR)
     {
@@ -1148,7 +1166,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame,
 	case DWARF_VALUE_REGISTER:
 	  {
 	    struct gdbarch *arch = get_frame_arch (frame);
-	    ULONGEST dwarf_regnum = dwarf_expr_fetch (ctx, 0);
+	    ULONGEST dwarf_regnum = value_as_long (dwarf_expr_fetch (ctx, 0));
 	    int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, dwarf_regnum);
 
 	    if (byte_offset != 0)
@@ -1176,26 +1194,23 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame,
 
 	case DWARF_VALUE_STACK:
 	  {
-	    ULONGEST value = dwarf_expr_fetch (ctx, 0);
-	    bfd_byte *contents, *tem;
-	    size_t n = ctx->addr_size;
+	    struct value *value = dwarf_expr_fetch (ctx, 0);
+	    gdb_byte *contents;
+	    const gdb_byte *val_bytes;
+	    size_t n = TYPE_LENGTH (value_type (value));
 
 	    if (byte_offset + TYPE_LENGTH (type) > n)
 	      invalid_synthetic_pointer ();
 
-	    tem = alloca (n);
-	    store_unsigned_integer (tem, n,
-				    gdbarch_byte_order (ctx->gdbarch),
-				    value);
-
-	    tem += byte_offset;
+	    val_bytes = value_contents_all (value);
+	    val_bytes += byte_offset;
 	    n -= byte_offset;
 
 	    retval = allocate_value (type);
 	    contents = value_contents_raw (retval);
 	    if (n > TYPE_LENGTH (type))
 	      n = TYPE_LENGTH (type);
-	    memcpy (contents, tem, n);
+	    memcpy (contents, val_bytes, n);
 	  }
 	  break;
 
diff --git a/gdb/dwarf2loc.h b/gdb/dwarf2loc.h
index 96a490e..08849ed 100644
--- a/gdb/dwarf2loc.h
+++ b/gdb/dwarf2loc.h
@@ -59,6 +59,9 @@ struct dwarf2_locexpr_baton dwarf2_fetch_die_location_block
    CORE_ADDR (*get_frame_pc) (void *baton),
    void *baton);
 
+struct type *dwarf2_get_die_type (unsigned int die_offset,
+				  struct dwarf2_per_cu_data *per_cu);
+
 /* Evaluate a location description, starting at DATA and with length
    SIZE, to find the current location of variable of TYPE in the context
    of FRAME.  */
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index fdab83d..790a873 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -13017,6 +13017,18 @@ dwarf_stack_op_name (unsigned op)
       return "DW_OP_GNU_uninit";
     case DW_OP_GNU_implicit_pointer:
       return "DW_OP_GNU_implicit_pointer";
+    case DW_OP_GNU_entry_value:
+      return "DW_OP_GNU_entry_value";
+    case DW_OP_GNU_const_type:
+      return "DW_OP_GNU_const_type";
+    case DW_OP_GNU_regval_type:
+      return "DW_OP_GNU_regval_type";
+    case DW_OP_GNU_deref_type:
+      return "DW_OP_GNU_deref_type";
+    case DW_OP_GNU_convert:
+      return "DW_OP_GNU_convert";
+    case DW_OP_GNU_reinterpret:
+      return "DW_OP_GNU_reinterpret";
     default:
       return NULL;
     }
@@ -13575,6 +13587,31 @@ dwarf2_fetch_die_location_block (unsigned int offset,
   return retval;
 }
 
+/* Return the type of the DIE at DIE_OFFSET in the CU named by
+   PER_CU.  */
+
+struct type *
+dwarf2_get_die_type (unsigned int die_offset,
+		     struct dwarf2_per_cu_data *per_cu)
+{
+  struct dwarf2_cu *cu = per_cu->cu;
+  struct die_info *die;
+  struct type *result;
+
+  dw2_setup (per_cu->objfile);
+
+  die = follow_die_offset (die_offset, &cu);
+  if (!die)
+    error (_("Dwarf Error: Cannot find DIE at 0x%x referenced in module %s"),
+	   die_offset, per_cu->cu->objfile->name);
+
+  result = get_die_type (die, cu);
+  if (result == NULL)
+    result = read_type_die_1 (die, cu);
+
+  return result;
+}
+
 /* Follow the signature attribute ATTR in SRC_DIE.
    On entry *REF_CU is the CU of SRC_DIE.
    On exit *REF_CU is the CU of the result.  */
diff --git a/gdb/testsuite/gdb.dwarf2/typeddwarf.S b/gdb/testsuite/gdb.dwarf2/typeddwarf.S
new file mode 100644
index 0000000..a46da14
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/typeddwarf.S
@@ -0,0 +1,2225 @@
+/* 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 -m32 -dA -S -g -O2 typeddwarf.c -o typeddwarf.S
+
+*/
+
+
+	.file	"typeddwarf.c"
+	.text
+.Ltext0:
+	.p2align 4,,15
+	.globl	f1
+	.type	f1, @function
+f1:
+.LFB0:
+	# typeddwarf.c:10
+.LM1:
+.LVL0:
+# BLOCK 2 freq:10000 seq:0
+# PRED: ENTRY [100.0%]  (fallthru)
+	# typeddwarf.c:29
+.LM2:
+	movl	vv, %eax
+	addl	$1, %eax
+	movl	%eax, vv
+# SUCC: EXIT [100.0%] 
+	# typeddwarf.c:30
+.LM3:
+	ret
+.LFE0:
+	.size	f1, .-f1
+	.p2align 4,,15
+	.globl	f2
+	.type	f2, @function
+f2:
+.LFB1:
+	# typeddwarf.c:34
+.LM4:
+.LVL1:
+# BLOCK 2 freq:10000 seq:0
+# PRED: ENTRY [100.0%]  (fallthru)
+	subl	$12, %esp
+.LCFI0:
+	# typeddwarf.c:53
+.LM5:
+	movl	vv, %eax
+	# typeddwarf.c:54
+.LM6:
+	fnstcw	6(%esp)
+	# typeddwarf.c:34
+.LM7:
+	flds	40(%esp)
+.LVL2:
+	# typeddwarf.c:54
+.LM8:
+	fldl	16(%esp)
+	# typeddwarf.c:53
+.LM9:
+	addl	$1, %eax
+	movl	%eax, vv
+	# typeddwarf.c:54
+.LM10:
+	movzwl	6(%esp), %eax
+	movb	$12, %ah
+	movw	%ax, 4(%esp)
+	fldcw	4(%esp)
+	fistpl	(%esp)
+	fldcw	6(%esp)
+	movl	(%esp), %eax
+	# typeddwarf.c:55
+.LM11:
+	fldl	24(%esp)
+	fldcw	4(%esp)
+	fistpl	(%esp)
+	fldcw	6(%esp)
+	# typeddwarf.c:54
+.LM12:
+	movl	%eax, vv
+	# typeddwarf.c:55
+.LM13:
+	movl	(%esp), %eax
+	# typeddwarf.c:56
+.LM14:
+	fldl	32(%esp)
+	fldcw	4(%esp)
+	fistpl	(%esp)
+	fldcw	6(%esp)
+	# typeddwarf.c:55
+.LM15:
+	movl	%eax, vv
+	# typeddwarf.c:56
+.LM16:
+	movl	(%esp), %eax
+	# typeddwarf.c:57
+.LM17:
+	fldcw	4(%esp)
+	fistl	(%esp)
+	fldcw	6(%esp)
+	# typeddwarf.c:56
+.LM18:
+	movl	%eax, vv
+	# typeddwarf.c:57
+.LM19:
+	movl	(%esp), %eax
+	# typeddwarf.c:58
+.LM20:
+	flds	44(%esp)
+	# typeddwarf.c:57
+.LM21:
+	movl	%eax, vv
+	# typeddwarf.c:58
+.LM22:
+	fldcw	4(%esp)
+	fistpl	(%esp)
+	fldcw	6(%esp)
+	movl	(%esp), %eax
+	movl	%eax, vv
+	# typeddwarf.c:59
+.LM23:
+	movl	48(%esp), %eax
+	# typeddwarf.c:63
+.LM24:
+	fldcw	4(%esp)
+	fistpl	(%esp)
+	fldcw	6(%esp)
+	# typeddwarf.c:59
+.LM25:
+	movl	%eax, vv
+	# typeddwarf.c:60
+.LM26:
+	movl	52(%esp), %eax
+	movl	%eax, vv
+	# typeddwarf.c:61
+.LM27:
+	movl	56(%esp), %eax
+	movl	%eax, vv
+	# typeddwarf.c:62
+.LM28:
+	movl	64(%esp), %eax
+	movl	%eax, vv
+	# typeddwarf.c:63
+.LM29:
+	movl	(%esp), %eax
+	movl	%eax, vv
+	# typeddwarf.c:64
+.LM30:
+	addl	$12, %esp
+.LCFI1:
+# SUCC: EXIT [100.0%] 
+	ret
+.LFE1:
+	.size	f2, .-f2
+	.p2align 4,,15
+	.globl	f3
+	.type	f3, @function
+f3:
+.LFB2:
+	# typeddwarf.c:68
+.LM31:
+.LVL3:
+# BLOCK 2 freq:10000 seq:0
+# PRED: ENTRY [100.0%]  (fallthru)
+	# typeddwarf.c:73
+.LM32:
+	movl	vv, %eax
+	addl	$1, %eax
+	movl	%eax, vv
+# SUCC: EXIT [100.0%] 
+	# typeddwarf.c:74
+.LM33:
+	ret
+.LFE2:
+	.size	f3, .-f3
+	.p2align 4,,15
+	.globl	f4
+	.type	f4, @function
+f4:
+.LFB3:
+	# typeddwarf.c:78
+.LM34:
+.LVL4:
+# BLOCK 2 freq:10000 seq:0
+# PRED: ENTRY [100.0%]  (fallthru)
+	# typeddwarf.c:82
+.LM35:
+	movl	vv, %eax
+	addl	$1, %eax
+	movl	%eax, vv
+# SUCC: EXIT [100.0%] 
+	# typeddwarf.c:83
+.LM36:
+	ret
+.LFE3:
+	.size	f4, .-f4
+	.section	.text.startup,"ax",@progbits
+	.p2align 4,,15
+	.globl	main
+	.type	main, @function
+main:
+.LFB4:
+	# typeddwarf.c:87
+.LM37:
+# BLOCK 2 freq:10000 seq:0
+# PRED: ENTRY [100.0%]  (fallthru)
+	pushl	%ebp
+.LCFI2:
+	movl	%esp, %ebp
+.LCFI3:
+	pushl	%esi
+.LCFI4:
+	# typeddwarf.c:88
+.LM38:
+	movl	$0x40a00000, %esi
+	# typeddwarf.c:87
+.LM39:
+	pushl	%ebx
+.LCFI5:
+	# typeddwarf.c:88
+.LM40:
+	movl	$0x40800000, %ebx
+	# typeddwarf.c:87
+.LM41:
+	andl	$-16, %esp
+	subl	$112, %esp
+.LCFI6:
+	# typeddwarf.c:88
+.LM42:
+	flds	.LC3
+	fstl	16(%esp)
+	movl	%esi, 28(%esp)
+	flds	.LC4
+	fstl	8(%esp)
+	movl	%ebx, 24(%esp)
+	fld1
+	fstl	(%esp)
+	movl	$9, 48(%esp)
+	fstps	64(%esp)
+	fstps	80(%esp)
+	movl	$0, 52(%esp)
+	fstps	96(%esp)
+	movl	$8, 40(%esp)
+	movl	$0, 44(%esp)
+	movl	$7, 36(%esp)
+	movl	$6, 32(%esp)
+	call	f1
+.LVL5:
+	# typeddwarf.c:89
+.LM43:
+	movl	%esi, 28(%esp)
+	movl	%ebx, 24(%esp)
+	movl	$9, 48(%esp)
+	movl	$0, 52(%esp)
+	movl	$8, 40(%esp)
+	flds	96(%esp)
+	fstpl	16(%esp)
+	movl	$0, 44(%esp)
+	flds	80(%esp)
+	fstpl	8(%esp)
+	movl	$7, 36(%esp)
+	flds	64(%esp)
+	fstpl	(%esp)
+	movl	$6, 32(%esp)
+	call	f2
+.LVL6:
+	# typeddwarf.c:90
+.LM44:
+	movl	$4, 20(%esp)
+	movl	$3, 12(%esp)
+	movl	$0, 16(%esp)
+	movl	$2, 8(%esp)
+	movl	$1, (%esp)
+	movl	$0, 4(%esp)
+	call	f3
+.LVL7:
+	# typeddwarf.c:91
+.LM45:
+	movl	$640, 16(%esp)
+	movl	$0, 20(%esp)
+	movl	$0, 24(%esp)
+	movl	$809369600, 28(%esp)
+	movl	$160, 4(%esp)
+	movl	$832569344, 8(%esp)
+	movl	$838860880, (%esp)
+	call	f4
+.LVL8:
+	# typeddwarf.c:93
+.LM46:
+	leal	-8(%ebp), %esp
+	xorl	%eax, %eax
+	popl	%ebx
+.LCFI7:
+	popl	%esi
+.LCFI8:
+	popl	%ebp
+.LCFI9:
+# SUCC: EXIT [100.0%] 
+	ret
+.LFE4:
+	.size	main, .-main
+	.comm	vv,4,4
+	.section	.rodata.cst4,"aM",@progbits,4
+	.align 4
+.LC3:
+	.long	1077936128
+	.align 4
+.LC4:
+	.long	1073741824
+#APP
+	.section	.debug_frame,"",@progbits
+.Lframe0:
+	.long	.LECIE0-.LSCIE0	# Length of Common Information Entry
+.LSCIE0:
+	.long	0xffffffff	# CIE Identifier Tag
+	.byte	0x1	# CIE Version
+	.ascii "\0"	# CIE Augmentation
+	.uleb128 0x1	# CIE Code Alignment Factor
+	.sleb128 -4	# CIE Data Alignment Factor
+	.byte	0x8	# CIE RA Column
+	.byte	0xc	# DW_CFA_def_cfa
+	.uleb128 0x4
+	.uleb128 0x4
+	.byte	0x88	# DW_CFA_offset, column 0x8
+	.uleb128 0x1
+	.align 4
+.LECIE0:
+.LSFDE0:
+	.long	.LEFDE0-.LASFDE0	# FDE Length
+.LASFDE0:
+	.long	.Lframe0	# FDE CIE offset
+	.long	.LFB0	# FDE initial location
+	.long	.LFE0-.LFB0	# FDE address range
+	.align 4
+.LEFDE0:
+.LSFDE2:
+	.long	.LEFDE2-.LASFDE2	# FDE Length
+.LASFDE2:
+	.long	.Lframe0	# FDE CIE offset
+	.long	.LFB1	# FDE initial location
+	.long	.LFE1-.LFB1	# FDE address range
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI0-.LFB1
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x10
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI1-.LCFI0
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x4
+	.align 4
+.LEFDE2:
+.LSFDE4:
+	.long	.LEFDE4-.LASFDE4	# FDE Length
+.LASFDE4:
+	.long	.Lframe0	# FDE CIE offset
+	.long	.LFB2	# FDE initial location
+	.long	.LFE2-.LFB2	# FDE address range
+	.align 4
+.LEFDE4:
+.LSFDE6:
+	.long	.LEFDE6-.LASFDE6	# FDE Length
+.LASFDE6:
+	.long	.Lframe0	# FDE CIE offset
+	.long	.LFB3	# FDE initial location
+	.long	.LFE3-.LFB3	# FDE address range
+	.align 4
+.LEFDE6:
+.LSFDE8:
+	.long	.LEFDE8-.LASFDE8	# FDE Length
+.LASFDE8:
+	.long	.Lframe0	# FDE CIE offset
+	.long	.LFB4	# FDE initial location
+	.long	.LFE4-.LFB4	# FDE address range
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI2-.LFB4
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x8
+	.byte	0x85	# DW_CFA_offset, column 0x5
+	.uleb128 0x2
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI3-.LCFI2
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0x5
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI4-.LCFI3
+	.byte	0x86	# DW_CFA_offset, column 0x6
+	.uleb128 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI5-.LCFI4
+	.byte	0x83	# DW_CFA_offset, column 0x3
+	.uleb128 0x4
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI7-.LCFI5
+	.byte	0xc3	# DW_CFA_restore, column 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI8-.LCFI7
+	.byte	0xc6	# DW_CFA_restore, column 0x6
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI9-.LCFI8
+	.byte	0xc	# DW_CFA_def_cfa
+	.uleb128 0x4
+	.uleb128 0x4
+	.byte	0xc5	# DW_CFA_restore, column 0x5
+	.align 4
+.LEFDE8:
+#NO_APP
+#APP
+	.section	.eh_frame,"aw",@progbits
+.Lframe1:
+	.long	.LECIE1-.LSCIE1	# Length of Common Information Entry
+.LSCIE1:
+	.long	0	# CIE Identifier Tag
+	.byte	0x1	# CIE Version
+	.ascii "\0"	# CIE Augmentation
+	.uleb128 0x1	# CIE Code Alignment Factor
+	.sleb128 -4	# CIE Data Alignment Factor
+	.byte	0x8	# CIE RA Column
+	.byte	0xc	# DW_CFA_def_cfa
+	.uleb128 0x4
+	.uleb128 0x4
+	.byte	0x88	# DW_CFA_offset, column 0x8
+	.uleb128 0x1
+	.align 4
+.LECIE1:
+.LSFDE11:
+	.long	.LEFDE11-.LASFDE11	# FDE Length
+.LASFDE11:
+	.long	.LASFDE11-.Lframe1	# FDE CIE offset
+	.long	.LFB0	# FDE initial location
+	.long	.LFE0-.LFB0	# FDE address range
+	.align 4
+.LEFDE11:
+.LSFDE13:
+	.long	.LEFDE13-.LASFDE13	# FDE Length
+.LASFDE13:
+	.long	.LASFDE13-.Lframe1	# FDE CIE offset
+	.long	.LFB1	# FDE initial location
+	.long	.LFE1-.LFB1	# FDE address range
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI0-.LFB1
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x10
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI1-.LCFI0
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x4
+	.align 4
+.LEFDE13:
+.LSFDE15:
+	.long	.LEFDE15-.LASFDE15	# FDE Length
+.LASFDE15:
+	.long	.LASFDE15-.Lframe1	# FDE CIE offset
+	.long	.LFB2	# FDE initial location
+	.long	.LFE2-.LFB2	# FDE address range
+	.align 4
+.LEFDE15:
+.LSFDE17:
+	.long	.LEFDE17-.LASFDE17	# FDE Length
+.LASFDE17:
+	.long	.LASFDE17-.Lframe1	# FDE CIE offset
+	.long	.LFB3	# FDE initial location
+	.long	.LFE3-.LFB3	# FDE address range
+	.align 4
+.LEFDE17:
+.LSFDE19:
+	.long	.LEFDE19-.LASFDE19	# FDE Length
+.LASFDE19:
+	.long	.LASFDE19-.Lframe1	# FDE CIE offset
+	.long	.LFB4	# FDE initial location
+	.long	.LFE4-.LFB4	# FDE address range
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI2-.LFB4
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x8
+	.byte	0x85	# DW_CFA_offset, column 0x5
+	.uleb128 0x2
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI3-.LCFI2
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0x5
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI4-.LCFI3
+	.byte	0x86	# DW_CFA_offset, column 0x6
+	.uleb128 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI5-.LCFI4
+	.byte	0x83	# DW_CFA_offset, column 0x3
+	.uleb128 0x4
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI7-.LCFI5
+	.byte	0xc3	# DW_CFA_restore, column 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI8-.LCFI7
+	.byte	0xc6	# DW_CFA_restore, column 0x6
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI9-.LCFI8
+	.byte	0xc	# DW_CFA_def_cfa
+	.uleb128 0x4
+	.uleb128 0x4
+	.byte	0xc5	# DW_CFA_restore, column 0x5
+	.align 4
+.LEFDE19:
+#NO_APP
+	.text
+.Letext0:
+	.section	.debug_info,"",@progbits
+.Ldebug_info0:
+	.long	0x64e	# Length of Compilation Unit Info
+	.value	0x2	# DWARF version number
+	.long	.Ldebug_abbrev0	# Offset Into Abbrev. Section
+	.byte	0x4	# Pointer Size (in bytes)
+	.uleb128 0x1	# (DIE (0xb) DW_TAG_compile_unit)
+	.long	.LASF5	# DW_AT_producer: "GNU C 4.7.0 20110504 (experimental)"
+	.byte	0x1	# DW_AT_language
+	.long	.LASF6	# DW_AT_name: "typeddwarf.c"
+	.long	.LASF7	# DW_AT_comp_dir: "/usr/src/gcc/obj/gcc"
+	.long	.Ldebug_ranges0+0	# DW_AT_ranges
+	.long	0	# DW_AT_low_pc
+	.long	0	# DW_AT_entry_pc
+	.long	.Ldebug_line0	# DW_AT_stmt_list
+	.uleb128 0x2	# (DIE (0x29) DW_TAG_base_type)
+	.byte	0x8	# DW_AT_byte_size
+	.byte	0x4	# DW_AT_encoding
+	.long	.LASF0	# DW_AT_name: "double"
+	.uleb128 0x2	# (DIE (0x30) DW_TAG_base_type)
+	.byte	0x4	# DW_AT_byte_size
+	.byte	0x4	# DW_AT_encoding
+	.long	.LASF1	# DW_AT_name: "float"
+	.uleb128 0x2	# (DIE (0x37) DW_TAG_base_type)
+	.byte	0x8	# DW_AT_byte_size
+	.byte	0x5	# DW_AT_encoding
+	.long	.LASF2	# DW_AT_name: "long long int"
+	.uleb128 0x3	# (DIE (0x3e) DW_TAG_base_type)
+	.byte	0x4	# DW_AT_byte_size
+	.byte	0x5	# DW_AT_encoding
+	.ascii "int\0"	# DW_AT_name
+	.uleb128 0x2	# (DIE (0x45) DW_TAG_base_type)
+	.byte	0x4	# DW_AT_byte_size
+	.byte	0x7	# DW_AT_encoding
+	.long	.LASF3	# DW_AT_name: "unsigned int"
+	.uleb128 0x2	# (DIE (0x4c) DW_TAG_base_type)
+	.byte	0x8	# DW_AT_byte_size
+	.byte	0x7	# DW_AT_encoding
+	.long	.LASF4	# DW_AT_name: "long long unsigned int"
+	.uleb128 0x4	# (DIE (0x53) DW_TAG_subprogram)
+	.byte	0x1	# DW_AT_external
+	.ascii "f1\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x9	# DW_AT_decl_line
+	.byte	0x1	# DW_AT_prototyped
+	.long	.LFB0	# DW_AT_low_pc
+	.long	.LFE0	# DW_AT_high_pc
+	.byte	0x2	# DW_AT_frame_base
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.byte	0x1	# DW_AT_GNU_all_call_sites
+	.long	0x232	# DW_AT_sibling
+	.uleb128 0x5	# (DIE (0x6b) DW_TAG_formal_parameter)
+	.ascii "a\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x9	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.uleb128 0x5	# (DIE (0x77) DW_TAG_formal_parameter)
+	.ascii "b\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x9	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 8
+	.uleb128 0x5	# (DIE (0x83) DW_TAG_formal_parameter)
+	.ascii "c\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x9	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 16
+	.uleb128 0x5	# (DIE (0x8f) DW_TAG_formal_parameter)
+	.ascii "d\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x9	# DW_AT_decl_line
+	.long	0x30	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 24
+	.uleb128 0x5	# (DIE (0x9b) DW_TAG_formal_parameter)
+	.ascii "e\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x9	# DW_AT_decl_line
+	.long	0x30	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 28
+	.uleb128 0x5	# (DIE (0xa7) DW_TAG_formal_parameter)
+	.ascii "f\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x9	# DW_AT_decl_line
+	.long	0x3e	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 32
+	.uleb128 0x5	# (DIE (0xb3) DW_TAG_formal_parameter)
+	.ascii "g\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x9	# DW_AT_decl_line
+	.long	0x45	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 36
+	.uleb128 0x5	# (DIE (0xbf) DW_TAG_formal_parameter)
+	.ascii "h\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x9	# DW_AT_decl_line
+	.long	0x37	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 40
+	.uleb128 0x5	# (DIE (0xcb) DW_TAG_formal_parameter)
+	.ascii "i\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x9	# DW_AT_decl_line
+	.long	0x4c	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 48
+	.uleb128 0x6	# (DIE (0xd7) DW_TAG_variable)
+	.ascii "j\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0xb	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x8	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 24
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x4
+	.uleb128 0x30
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x29
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0xe9) DW_TAG_variable)
+	.ascii "l\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0xc	# DW_AT_decl_line
+	.long	0x37	# DW_AT_type
+	.byte	0xa	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 24
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x4
+	.uleb128 0x30
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x29
+	.byte	0xf9	# DW_OP_GNU_reinterpret
+	.uleb128 0x37
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0xfd) DW_TAG_variable)
+	.ascii "m\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0xe	# DW_AT_decl_line
+	.long	0x37	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 16
+	.uleb128 0x6	# (DIE (0x109) DW_TAG_variable)
+	.ascii "n\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x10	# DW_AT_decl_line
+	.long	0x30	# DW_AT_type
+	.byte	0xa	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 48
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x37
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x4c
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x30
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x11d) DW_TAG_variable)
+	.ascii "o\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x11	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x8	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 40
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x37
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x29
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x12f) DW_TAG_variable)
+	.ascii "p\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x12	# DW_AT_decl_line
+	.long	0x30	# DW_AT_type
+	.byte	0x8	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 36
+	.byte	0x6	# DW_OP_deref
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x45
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x30
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x141) DW_TAG_variable)
+	.ascii "q\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x13	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x8	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 32
+	.byte	0x6	# DW_OP_deref
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x3e
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x29
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x153) DW_TAG_variable)
+	.ascii "r\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x14	# DW_AT_decl_line
+	.long	0x4c	# DW_AT_type
+	.byte	0xa	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x4c
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x37
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x167) DW_TAG_variable)
+	.ascii "s\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x15	# DW_AT_decl_line
+	.long	0x37	# DW_AT_type
+	.byte	0x8	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 16
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x37
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x179) DW_TAG_variable)
+	.ascii "t\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x16	# DW_AT_decl_line
+	.long	0x45	# DW_AT_type
+	.byte	0xa	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 24
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x4
+	.uleb128 0x30
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x45
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x3e
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x18d) DW_TAG_variable)
+	.ascii "u\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x17	# DW_AT_decl_line
+	.long	0x3e	# DW_AT_type
+	.byte	0x8	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 8
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x3e
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x19f) DW_TAG_variable)
+	.ascii "v\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x18	# DW_AT_decl_line
+	.long	0x30	# DW_AT_type
+	.byte	0x8	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x30
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x1b1) DW_TAG_variable)
+	.ascii "w\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x19	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x14	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 24
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x4
+	.uleb128 0x30
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x29
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x29
+	.byte	0x8
+	.long	0	# fp or vector constant word 0
+	.long	0x3fd00000	# fp or vector constant word 1
+	.byte	0x1e	# DW_OP_mul
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x1cf) DW_TAG_variable)
+	.ascii "x\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x1a	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x18	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 8
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0x22	# DW_OP_plus
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x29
+	.byte	0x8
+	.long	0	# fp or vector constant word 0
+	.long	0x3ff00000	# fp or vector constant word 1
+	.byte	0x22	# DW_OP_plus
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x1f1) DW_TAG_variable)
+	.ascii "y\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x1b	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x18	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 8
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 16
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0x22	# DW_OP_plus
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x29
+	.byte	0x8
+	.long	0	# fp or vector constant word 0
+	.long	0x40000000	# fp or vector constant word 1
+	.byte	0x22	# DW_OP_plus
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x213) DW_TAG_variable)
+	.ascii "z\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x1c	# DW_AT_decl_line
+	.long	0x30	# DW_AT_type
+	.byte	0x14	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 24
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x4
+	.uleb128 0x30
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 28
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x4
+	.uleb128 0x30
+	.byte	0x22	# DW_OP_plus
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x30
+	.byte	0x4
+	.long	0x40400000	# fp or vector constant word 0
+	.byte	0x22	# DW_OP_plus
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0	# end of children of DIE 0x53
+	.uleb128 0x7	# (DIE (0x232) DW_TAG_subprogram)
+	.byte	0x1	# DW_AT_external
+	.ascii "f2\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x21	# DW_AT_decl_line
+	.byte	0x1	# DW_AT_prototyped
+	.long	.LFB1	# DW_AT_low_pc
+	.long	.LFE1	# DW_AT_high_pc
+	.long	.LLST0	# DW_AT_frame_base
+	.byte	0x1	# DW_AT_GNU_all_call_sites
+	.long	0x40a	# DW_AT_sibling
+	.uleb128 0x5	# (DIE (0x24b) DW_TAG_formal_parameter)
+	.ascii "a\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x21	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.uleb128 0x5	# (DIE (0x257) DW_TAG_formal_parameter)
+	.ascii "b\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x21	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 8
+	.uleb128 0x5	# (DIE (0x263) DW_TAG_formal_parameter)
+	.ascii "c\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x21	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 16
+	.uleb128 0x5	# (DIE (0x26f) DW_TAG_formal_parameter)
+	.ascii "d\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x21	# DW_AT_decl_line
+	.long	0x30	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 24
+	.uleb128 0x5	# (DIE (0x27b) DW_TAG_formal_parameter)
+	.ascii "e\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x21	# DW_AT_decl_line
+	.long	0x30	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 28
+	.uleb128 0x5	# (DIE (0x287) DW_TAG_formal_parameter)
+	.ascii "f\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x21	# DW_AT_decl_line
+	.long	0x3e	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 32
+	.uleb128 0x5	# (DIE (0x293) DW_TAG_formal_parameter)
+	.ascii "g\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x21	# DW_AT_decl_line
+	.long	0x45	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 36
+	.uleb128 0x5	# (DIE (0x29f) DW_TAG_formal_parameter)
+	.ascii "h\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x21	# DW_AT_decl_line
+	.long	0x37	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 40
+	.uleb128 0x5	# (DIE (0x2ab) DW_TAG_formal_parameter)
+	.ascii "i\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x21	# DW_AT_decl_line
+	.long	0x4c	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 48
+	.uleb128 0x6	# (DIE (0x2b7) DW_TAG_variable)
+	.ascii "j\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x23	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x8	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 24
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x4
+	.uleb128 0x30
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x29
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x2c9) DW_TAG_variable)
+	.ascii "l\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x24	# DW_AT_decl_line
+	.long	0x37	# DW_AT_type
+	.byte	0xa	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 24
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x4
+	.uleb128 0x30
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x29
+	.byte	0xf9	# DW_OP_GNU_reinterpret
+	.uleb128 0x37
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x2dd) DW_TAG_variable)
+	.ascii "m\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x26	# DW_AT_decl_line
+	.long	0x37	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 16
+	.uleb128 0x8	# (DIE (0x2e9) DW_TAG_variable)
+	.ascii "n\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x28	# DW_AT_decl_line
+	.long	0x30	# DW_AT_type
+	.uleb128 0x8	# (DIE (0x2f2) DW_TAG_variable)
+	.ascii "o\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x29	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.uleb128 0x6	# (DIE (0x2fb) DW_TAG_variable)
+	.ascii "p\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x2a	# DW_AT_decl_line
+	.long	0x30	# DW_AT_type
+	.byte	0x8	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 36
+	.byte	0x6	# DW_OP_deref
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x45
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x30
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x30d) DW_TAG_variable)
+	.ascii "q\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x2b	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x8	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 32
+	.byte	0x6	# DW_OP_deref
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x3e
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x29
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x31f) DW_TAG_variable)
+	.ascii "r\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x2c	# DW_AT_decl_line
+	.long	0x4c	# DW_AT_type
+	.byte	0xa	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x4c
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x37
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x333) DW_TAG_variable)
+	.ascii "s\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x2d	# DW_AT_decl_line
+	.long	0x37	# DW_AT_type
+	.byte	0x8	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 16
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x37
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x345) DW_TAG_variable)
+	.ascii "t\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x2e	# DW_AT_decl_line
+	.long	0x45	# DW_AT_type
+	.byte	0xa	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 24
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x4
+	.uleb128 0x30
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x45
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x3e
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x359) DW_TAG_variable)
+	.ascii "u\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x2f	# DW_AT_decl_line
+	.long	0x3e	# DW_AT_type
+	.byte	0x8	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 8
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x3e
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x36b) DW_TAG_variable)
+	.ascii "v\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x30	# DW_AT_decl_line
+	.long	0x30	# DW_AT_type
+	.byte	0x8	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x30
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x37d) DW_TAG_variable)
+	.ascii "w\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x31	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x14	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 24
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x4
+	.uleb128 0x30
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x29
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x29
+	.byte	0x8
+	.long	0	# fp or vector constant word 0
+	.long	0x3fd00000	# fp or vector constant word 1
+	.byte	0x1e	# DW_OP_mul
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x39b) DW_TAG_variable)
+	.ascii "x\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x32	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x24	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 8
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0x22	# DW_OP_plus
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x29
+	.byte	0x8
+	.long	0	# fp or vector constant word 0
+	.long	0x40080000	# fp or vector constant word 1
+	.byte	0x1c	# DW_OP_minus
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x29
+	.byte	0x8
+	.long	0x78b58c40	# fp or vector constant word 0
+	.long	0x4415af1d	# fp or vector constant word 1
+	.byte	0x22	# DW_OP_plus
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x3c9) DW_TAG_variable)
+	.ascii "y\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x33	# DW_AT_decl_line
+	.long	0x29	# DW_AT_type
+	.byte	0x18	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 16
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x29
+	.byte	0x8
+	.long	0	# fp or vector constant word 0
+	.long	0x401c0000	# fp or vector constant word 1
+	.byte	0x1e	# DW_OP_mul
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 8
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x29
+	.byte	0x22	# DW_OP_plus
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x3eb) DW_TAG_variable)
+	.ascii "z\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x34	# DW_AT_decl_line
+	.long	0x30	# DW_AT_type
+	.byte	0x14	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 24
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x4
+	.uleb128 0x30
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 28
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x4
+	.uleb128 0x30
+	.byte	0x22	# DW_OP_plus
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x30
+	.byte	0x4
+	.long	0x40400000	# fp or vector constant word 0
+	.byte	0x22	# DW_OP_plus
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0	# end of children of DIE 0x232
+	.uleb128 0x4	# (DIE (0x40a) DW_TAG_subprogram)
+	.byte	0x1	# DW_AT_external
+	.ascii "f3\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x43	# DW_AT_decl_line
+	.byte	0x1	# DW_AT_prototyped
+	.long	.LFB2	# DW_AT_low_pc
+	.long	.LFE2	# DW_AT_high_pc
+	.byte	0x2	# DW_AT_frame_base
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.byte	0x1	# DW_AT_GNU_all_call_sites
+	.long	0x4fd	# DW_AT_sibling
+	.uleb128 0x5	# (DIE (0x422) DW_TAG_formal_parameter)
+	.ascii "a\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x43	# DW_AT_decl_line
+	.long	0x37	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.uleb128 0x5	# (DIE (0x42e) DW_TAG_formal_parameter)
+	.ascii "b\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x43	# DW_AT_decl_line
+	.long	0x3e	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 8
+	.uleb128 0x5	# (DIE (0x43a) DW_TAG_formal_parameter)
+	.ascii "c\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x43	# DW_AT_decl_line
+	.long	0x37	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 12
+	.uleb128 0x5	# (DIE (0x446) DW_TAG_formal_parameter)
+	.ascii "d\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x43	# DW_AT_decl_line
+	.long	0x45	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 20
+	.uleb128 0x6	# (DIE (0x452) DW_TAG_variable)
+	.ascii "w\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x45	# DW_AT_decl_line
+	.long	0x37	# DW_AT_type
+	.byte	0x16	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 20
+	.byte	0x6	# DW_OP_deref
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x45
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x37
+	.byte	0x12	# DW_OP_dup
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x37
+	.byte	0x16	# DW_OP_swap
+	.byte	0x14	# DW_OP_over
+	.byte	0x2b	# DW_OP_gt
+	.byte	0x28	# DW_OP_bra
+	.value	0x1
+	.byte	0x16	# DW_OP_swap
+	.byte	0x13	# DW_OP_drop
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x472) DW_TAG_variable)
+	.ascii "x\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x46	# DW_AT_decl_line
+	.long	0x37	# DW_AT_type
+	.byte	0x1a	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 8
+	.byte	0x6	# DW_OP_deref
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x3e
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x37
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x37
+	.byte	0x22	# DW_OP_plus
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x37
+	.byte	0x8
+	.quad	0x7
+	.byte	0x22	# DW_OP_plus
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x496) DW_TAG_variable)
+	.ascii "y\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x47	# DW_AT_decl_line
+	.long	0x37	# DW_AT_type
+	.byte	0x1a	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 20
+	.byte	0x6	# DW_OP_deref
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x45
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x37
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 12
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x37
+	.byte	0x22	# DW_OP_plus
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x37
+	.byte	0x8
+	.quad	0x912345678
+	.byte	0x22	# DW_OP_plus
+	.byte	0x9f	# DW_OP_stack_value
+	.uleb128 0x6	# (DIE (0x4ba) DW_TAG_variable)
+	.ascii "z\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x48	# DW_AT_decl_line
+	.long	0x3e	# DW_AT_type
+	.byte	0x38	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 8
+	.byte	0x6	# DW_OP_deref
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x3e
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x37
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x37
+	.byte	0x22	# DW_OP_plus
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x37
+	.byte	0x8
+	.quad	0x7
+	.byte	0x22	# DW_OP_plus
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x3e
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 20
+	.byte	0x6	# DW_OP_deref
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x45
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x37
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 12
+	.byte	0xf6	# DW_OP_GNU_deref_type
+	.byte	0x8
+	.uleb128 0x37
+	.byte	0x22	# DW_OP_plus
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x37
+	.byte	0x8
+	.quad	0x912345678
+	.byte	0x22	# DW_OP_plus
+	.byte	0xf7	# DW_OP_GNU_convert
+	.uleb128 0x3e
+	.byte	0x22	# DW_OP_plus
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0	# end of children of DIE 0x40a
+	.uleb128 0x4	# (DIE (0x4fd) DW_TAG_subprogram)
+	.byte	0x1	# DW_AT_external
+	.ascii "f4\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x4d	# DW_AT_decl_line
+	.byte	0x1	# DW_AT_prototyped
+	.long	.LFB3	# DW_AT_low_pc
+	.long	.LFE3	# DW_AT_high_pc
+	.byte	0x2	# DW_AT_frame_base
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.byte	0x1	# DW_AT_GNU_all_call_sites
+	.long	0x555	# DW_AT_sibling
+	.uleb128 0x5	# (DIE (0x515) DW_TAG_formal_parameter)
+	.ascii "a\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x4d	# DW_AT_decl_line
+	.long	0x555	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.uleb128 0x5	# (DIE (0x521) DW_TAG_formal_parameter)
+	.ascii "b\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x4d	# DW_AT_decl_line
+	.long	0x55c	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 4
+	.uleb128 0x5	# (DIE (0x52d) DW_TAG_formal_parameter)
+	.ascii "c\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x4d	# DW_AT_decl_line
+	.long	0x563	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 16
+	.uleb128 0x8	# (DIE (0x539) DW_TAG_variable)
+	.ascii "w\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x4f	# DW_AT_decl_line
+	.long	0x555	# DW_AT_type
+	.uleb128 0x8	# (DIE (0x542) DW_TAG_variable)
+	.ascii "x\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x50	# DW_AT_decl_line
+	.long	0x55c	# DW_AT_type
+	.uleb128 0x8	# (DIE (0x54b) DW_TAG_variable)
+	.ascii "y\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x51	# DW_AT_decl_line
+	.long	0x563	# DW_AT_type
+	.byte	0	# end of children of DIE 0x4fd
+	.uleb128 0x2	# (DIE (0x555) DW_TAG_base_type)
+	.byte	0x4	# DW_AT_byte_size
+	.byte	0xf	# DW_AT_encoding
+	.long	.LASF8	# DW_AT_name: "_Decimal32"
+	.uleb128 0x2	# (DIE (0x55c) DW_TAG_base_type)
+	.byte	0x8	# DW_AT_byte_size
+	.byte	0xf	# DW_AT_encoding
+	.long	.LASF9	# DW_AT_name: "_Decimal64"
+	.uleb128 0x2	# (DIE (0x563) DW_TAG_base_type)
+	.byte	0x10	# DW_AT_byte_size
+	.byte	0xf	# DW_AT_encoding
+	.long	.LASF10	# DW_AT_name: "_Decimal128"
+	.uleb128 0x9	# (DIE (0x56a) DW_TAG_subprogram)
+	.byte	0x1	# DW_AT_external
+	.long	.LASF11	# DW_AT_name: "main"
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x56	# DW_AT_decl_line
+	.long	0x3e	# DW_AT_type
+	.long	.LFB4	# DW_AT_low_pc
+	.long	.LFE4	# DW_AT_high_pc
+	.long	.LLST1	# DW_AT_frame_base
+	.byte	0x1	# DW_AT_GNU_all_call_sites
+	.long	0x62f	# DW_AT_sibling
+	.uleb128 0xa	# (DIE (0x587) DW_TAG_GNU_call_site)
+	.long	.LVL5	# DW_AT_low_pc
+	.long	0x53	# DW_AT_abstract_origin
+	.long	0x5e1	# DW_AT_sibling
+	.uleb128 0xb	# (DIE (0x594) DW_TAG_GNU_call_site_parameter)
+	.byte	0x2	# DW_AT_location
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 0
+	.byte	0xb	# DW_AT_GNU_call_site_value
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x29
+	.byte	0x8
+	.long	0	# fp or vector constant word 0
+	.long	0x3ff00000	# fp or vector constant word 1
+	.uleb128 0xb	# (DIE (0x5a4) DW_TAG_GNU_call_site_parameter)
+	.byte	0x2	# DW_AT_location
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 8
+	.byte	0xb	# DW_AT_GNU_call_site_value
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x29
+	.byte	0x8
+	.long	0	# fp or vector constant word 0
+	.long	0x40000000	# fp or vector constant word 1
+	.uleb128 0xb	# (DIE (0x5b4) DW_TAG_GNU_call_site_parameter)
+	.byte	0x2	# DW_AT_location
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 16
+	.byte	0xb	# DW_AT_GNU_call_site_value
+	.byte	0xf4	# DW_OP_GNU_const_type
+	.uleb128 0x29
+	.byte	0x8
+	.long	0	# fp or vector constant word 0
+	.long	0x40080000	# fp or vector constant word 1
+	.uleb128 0xb	# (DIE (0x5c4) DW_TAG_GNU_call_site_parameter)
+	.byte	0x2	# DW_AT_location
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 24
+	.byte	0x3	# DW_AT_GNU_call_site_value
+	.byte	0xf5	# DW_OP_GNU_regval_type
+	.uleb128 0x3
+	.uleb128 0x30
+	.uleb128 0xb	# (DIE (0x5cc) DW_TAG_GNU_call_site_parameter)
+	.byte	0x2	# DW_AT_location
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 28
+	.byte	0x3	# DW_AT_GNU_call_site_value
+	.byte	0xf5	# DW_OP_GNU_regval_type
+	.uleb128 0x6
+	.uleb128 0x30
+	.uleb128 0xb	# (DIE (0x5d4) DW_TAG_GNU_call_site_parameter)
+	.byte	0x2	# DW_AT_location
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 32
+	.byte	0x1	# DW_AT_GNU_call_site_value
+	.byte	0x36	# DW_OP_lit6
+	.uleb128 0xb	# (DIE (0x5da) DW_TAG_GNU_call_site_parameter)
+	.byte	0x2	# DW_AT_location
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 36
+	.byte	0x1	# DW_AT_GNU_call_site_value
+	.byte	0x37	# DW_OP_lit7
+	.byte	0	# end of children of DIE 0x587
+	.uleb128 0xa	# (DIE (0x5e1) DW_TAG_GNU_call_site)
+	.long	.LVL6	# DW_AT_low_pc
+	.long	0x232	# DW_AT_abstract_origin
+	.long	0x60b	# DW_AT_sibling
+	.uleb128 0xb	# (DIE (0x5ee) DW_TAG_GNU_call_site_parameter)
+	.byte	0x2	# DW_AT_location
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 24
+	.byte	0x3	# DW_AT_GNU_call_site_value
+	.byte	0xf5	# DW_OP_GNU_regval_type
+	.uleb128 0x3
+	.uleb128 0x30
+	.uleb128 0xb	# (DIE (0x5f6) DW_TAG_GNU_call_site_parameter)
+	.byte	0x2	# DW_AT_location
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 28
+	.byte	0x3	# DW_AT_GNU_call_site_value
+	.byte	0xf5	# DW_OP_GNU_regval_type
+	.uleb128 0x6
+	.uleb128 0x30
+	.uleb128 0xb	# (DIE (0x5fe) DW_TAG_GNU_call_site_parameter)
+	.byte	0x2	# DW_AT_location
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 32
+	.byte	0x1	# DW_AT_GNU_call_site_value
+	.byte	0x36	# DW_OP_lit6
+	.uleb128 0xb	# (DIE (0x604) DW_TAG_GNU_call_site_parameter)
+	.byte	0x2	# DW_AT_location
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 36
+	.byte	0x1	# DW_AT_GNU_call_site_value
+	.byte	0x37	# DW_OP_lit7
+	.byte	0	# end of children of DIE 0x5e1
+	.uleb128 0xa	# (DIE (0x60b) DW_TAG_GNU_call_site)
+	.long	.LVL7	# DW_AT_low_pc
+	.long	0x40a	# DW_AT_abstract_origin
+	.long	0x625	# DW_AT_sibling
+	.uleb128 0xb	# (DIE (0x618) DW_TAG_GNU_call_site_parameter)
+	.byte	0x2	# DW_AT_location
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 8
+	.byte	0x1	# DW_AT_GNU_call_site_value
+	.byte	0x32	# DW_OP_lit2
+	.uleb128 0xb	# (DIE (0x61e) DW_TAG_GNU_call_site_parameter)
+	.byte	0x2	# DW_AT_location
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 20
+	.byte	0x1	# DW_AT_GNU_call_site_value
+	.byte	0x34	# DW_OP_lit4
+	.byte	0	# end of children of DIE 0x60b
+	.uleb128 0xc	# (DIE (0x625) DW_TAG_GNU_call_site)
+	.long	.LVL8	# DW_AT_low_pc
+	.long	0x4fd	# DW_AT_abstract_origin
+	.byte	0	# end of children of DIE 0x56a
+	.uleb128 0xd	# (DIE (0x62f) DW_TAG_variable)
+	.ascii "vv\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x5	# DW_AT_decl_line
+	.long	0x63b	# DW_AT_type
+	.byte	0x1	# DW_AT_external
+	.byte	0x1	# DW_AT_declaration
+	.uleb128 0xe	# (DIE (0x63b) DW_TAG_volatile_type)
+	.long	0x3e	# DW_AT_type
+	.uleb128 0xf	# (DIE (0x640) DW_TAG_variable)
+	.ascii "vv\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (typeddwarf.c)
+	.byte	0x5	# DW_AT_decl_line
+	.long	0x63b	# DW_AT_type
+	.byte	0x1	# DW_AT_external
+	.byte	0x5	# DW_AT_location
+	.byte	0x3	# DW_OP_addr
+	.long	vv
+	.byte	0	# end of children of DIE 0xb
+	.section	.debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+	.uleb128 0x1	# (abbrev code)
+	.uleb128 0x11	# (TAG: DW_TAG_compile_unit)
+	.byte	0x1	# DW_children_yes
+	.uleb128 0x25	# (DW_AT_producer)
+	.uleb128 0xe	# (DW_FORM_strp)
+	.uleb128 0x13	# (DW_AT_language)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3	# (DW_AT_name)
+	.uleb128 0xe	# (DW_FORM_strp)
+	.uleb128 0x1b	# (DW_AT_comp_dir)
+	.uleb128 0xe	# (DW_FORM_strp)
+	.uleb128 0x55	# (DW_AT_ranges)
+	.uleb128 0x6	# (DW_FORM_data4)
+	.uleb128 0x11	# (DW_AT_low_pc)
+	.uleb128 0x1	# (DW_FORM_addr)
+	.uleb128 0x52	# (DW_AT_entry_pc)
+	.uleb128 0x1	# (DW_FORM_addr)
+	.uleb128 0x10	# (DW_AT_stmt_list)
+	.uleb128 0x6	# (DW_FORM_data4)
+	.byte	0
+	.byte	0
+	.uleb128 0x2	# (abbrev code)
+	.uleb128 0x24	# (TAG: DW_TAG_base_type)
+	.byte	0	# DW_children_no
+	.uleb128 0xb	# (DW_AT_byte_size)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3e	# (DW_AT_encoding)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3	# (DW_AT_name)
+	.uleb128 0xe	# (DW_FORM_strp)
+	.byte	0
+	.byte	0
+	.uleb128 0x3	# (abbrev code)
+	.uleb128 0x24	# (TAG: DW_TAG_base_type)
+	.byte	0	# DW_children_no
+	.uleb128 0xb	# (DW_AT_byte_size)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3e	# (DW_AT_encoding)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3	# (DW_AT_name)
+	.uleb128 0x8	# (DW_FORM_string)
+	.byte	0
+	.byte	0
+	.uleb128 0x4	# (abbrev code)
+	.uleb128 0x2e	# (TAG: DW_TAG_subprogram)
+	.byte	0x1	# DW_children_yes
+	.uleb128 0x3f	# (DW_AT_external)
+	.uleb128 0xc	# (DW_FORM_flag)
+	.uleb128 0x3	# (DW_AT_name)
+	.uleb128 0x8	# (DW_FORM_string)
+	.uleb128 0x3a	# (DW_AT_decl_file)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3b	# (DW_AT_decl_line)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x27	# (DW_AT_prototyped)
+	.uleb128 0xc	# (DW_FORM_flag)
+	.uleb128 0x11	# (DW_AT_low_pc)
+	.uleb128 0x1	# (DW_FORM_addr)
+	.uleb128 0x12	# (DW_AT_high_pc)
+	.uleb128 0x1	# (DW_FORM_addr)
+	.uleb128 0x40	# (DW_AT_frame_base)
+	.uleb128 0xa	# (DW_FORM_block1)
+	.uleb128 0x2117	# (DW_AT_GNU_all_call_sites)
+	.uleb128 0xc	# (DW_FORM_flag)
+	.uleb128 0x1	# (DW_AT_sibling)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.byte	0
+	.byte	0
+	.uleb128 0x5	# (abbrev code)
+	.uleb128 0x5	# (TAG: DW_TAG_formal_parameter)
+	.byte	0	# DW_children_no
+	.uleb128 0x3	# (DW_AT_name)
+	.uleb128 0x8	# (DW_FORM_string)
+	.uleb128 0x3a	# (DW_AT_decl_file)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3b	# (DW_AT_decl_line)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x49	# (DW_AT_type)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.uleb128 0x2	# (DW_AT_location)
+	.uleb128 0xa	# (DW_FORM_block1)
+	.byte	0
+	.byte	0
+	.uleb128 0x6	# (abbrev code)
+	.uleb128 0x34	# (TAG: DW_TAG_variable)
+	.byte	0	# DW_children_no
+	.uleb128 0x3	# (DW_AT_name)
+	.uleb128 0x8	# (DW_FORM_string)
+	.uleb128 0x3a	# (DW_AT_decl_file)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3b	# (DW_AT_decl_line)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x49	# (DW_AT_type)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.uleb128 0x2	# (DW_AT_location)
+	.uleb128 0xa	# (DW_FORM_block1)
+	.byte	0
+	.byte	0
+	.uleb128 0x7	# (abbrev code)
+	.uleb128 0x2e	# (TAG: DW_TAG_subprogram)
+	.byte	0x1	# DW_children_yes
+	.uleb128 0x3f	# (DW_AT_external)
+	.uleb128 0xc	# (DW_FORM_flag)
+	.uleb128 0x3	# (DW_AT_name)
+	.uleb128 0x8	# (DW_FORM_string)
+	.uleb128 0x3a	# (DW_AT_decl_file)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3b	# (DW_AT_decl_line)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x27	# (DW_AT_prototyped)
+	.uleb128 0xc	# (DW_FORM_flag)
+	.uleb128 0x11	# (DW_AT_low_pc)
+	.uleb128 0x1	# (DW_FORM_addr)
+	.uleb128 0x12	# (DW_AT_high_pc)
+	.uleb128 0x1	# (DW_FORM_addr)
+	.uleb128 0x40	# (DW_AT_frame_base)
+	.uleb128 0x6	# (DW_FORM_data4)
+	.uleb128 0x2117	# (DW_AT_GNU_all_call_sites)
+	.uleb128 0xc	# (DW_FORM_flag)
+	.uleb128 0x1	# (DW_AT_sibling)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.byte	0
+	.byte	0
+	.uleb128 0x8	# (abbrev code)
+	.uleb128 0x34	# (TAG: DW_TAG_variable)
+	.byte	0	# DW_children_no
+	.uleb128 0x3	# (DW_AT_name)
+	.uleb128 0x8	# (DW_FORM_string)
+	.uleb128 0x3a	# (DW_AT_decl_file)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3b	# (DW_AT_decl_line)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x49	# (DW_AT_type)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.byte	0
+	.byte	0
+	.uleb128 0x9	# (abbrev code)
+	.uleb128 0x2e	# (TAG: DW_TAG_subprogram)
+	.byte	0x1	# DW_children_yes
+	.uleb128 0x3f	# (DW_AT_external)
+	.uleb128 0xc	# (DW_FORM_flag)
+	.uleb128 0x3	# (DW_AT_name)
+	.uleb128 0xe	# (DW_FORM_strp)
+	.uleb128 0x3a	# (DW_AT_decl_file)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3b	# (DW_AT_decl_line)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x49	# (DW_AT_type)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.uleb128 0x11	# (DW_AT_low_pc)
+	.uleb128 0x1	# (DW_FORM_addr)
+	.uleb128 0x12	# (DW_AT_high_pc)
+	.uleb128 0x1	# (DW_FORM_addr)
+	.uleb128 0x40	# (DW_AT_frame_base)
+	.uleb128 0x6	# (DW_FORM_data4)
+	.uleb128 0x2117	# (DW_AT_GNU_all_call_sites)
+	.uleb128 0xc	# (DW_FORM_flag)
+	.uleb128 0x1	# (DW_AT_sibling)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.byte	0
+	.byte	0
+	.uleb128 0xa	# (abbrev code)
+	.uleb128 0x4109	# (TAG: DW_TAG_GNU_call_site)
+	.byte	0x1	# DW_children_yes
+	.uleb128 0x11	# (DW_AT_low_pc)
+	.uleb128 0x1	# (DW_FORM_addr)
+	.uleb128 0x31	# (DW_AT_abstract_origin)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.uleb128 0x1	# (DW_AT_sibling)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.byte	0
+	.byte	0
+	.uleb128 0xb	# (abbrev code)
+	.uleb128 0x410a	# (TAG: DW_TAG_GNU_call_site_parameter)
+	.byte	0	# DW_children_no
+	.uleb128 0x2	# (DW_AT_location)
+	.uleb128 0xa	# (DW_FORM_block1)
+	.uleb128 0x2111	# (DW_AT_GNU_call_site_value)
+	.uleb128 0xa	# (DW_FORM_block1)
+	.byte	0
+	.byte	0
+	.uleb128 0xc	# (abbrev code)
+	.uleb128 0x4109	# (TAG: DW_TAG_GNU_call_site)
+	.byte	0	# DW_children_no
+	.uleb128 0x11	# (DW_AT_low_pc)
+	.uleb128 0x1	# (DW_FORM_addr)
+	.uleb128 0x31	# (DW_AT_abstract_origin)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.byte	0
+	.byte	0
+	.uleb128 0xd	# (abbrev code)
+	.uleb128 0x34	# (TAG: DW_TAG_variable)
+	.byte	0	# DW_children_no
+	.uleb128 0x3	# (DW_AT_name)
+	.uleb128 0x8	# (DW_FORM_string)
+	.uleb128 0x3a	# (DW_AT_decl_file)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3b	# (DW_AT_decl_line)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x49	# (DW_AT_type)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.uleb128 0x3f	# (DW_AT_external)
+	.uleb128 0xc	# (DW_FORM_flag)
+	.uleb128 0x3c	# (DW_AT_declaration)
+	.uleb128 0xc	# (DW_FORM_flag)
+	.byte	0
+	.byte	0
+	.uleb128 0xe	# (abbrev code)
+	.uleb128 0x35	# (TAG: DW_TAG_volatile_type)
+	.byte	0	# DW_children_no
+	.uleb128 0x49	# (DW_AT_type)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.byte	0
+	.byte	0
+	.uleb128 0xf	# (abbrev code)
+	.uleb128 0x34	# (TAG: DW_TAG_variable)
+	.byte	0	# DW_children_no
+	.uleb128 0x3	# (DW_AT_name)
+	.uleb128 0x8	# (DW_FORM_string)
+	.uleb128 0x3a	# (DW_AT_decl_file)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3b	# (DW_AT_decl_line)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x49	# (DW_AT_type)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.uleb128 0x3f	# (DW_AT_external)
+	.uleb128 0xc	# (DW_FORM_flag)
+	.uleb128 0x2	# (DW_AT_location)
+	.uleb128 0xa	# (DW_FORM_block1)
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_loc,"",@progbits
+.Ldebug_loc0:
+.LLST0:
+	.long	.LFB1	# Location list begin address (*.LLST0)
+	.long	.LCFI0	# Location list end address (*.LLST0)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	.LCFI0	# Location list begin address (*.LLST0)
+	.long	.LCFI1	# Location list end address (*.LLST0)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 16
+	.long	.LCFI1	# Location list begin address (*.LLST0)
+	.long	.LFE1	# Location list end address (*.LLST0)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	0	# Location list terminator begin (*.LLST0)
+	.long	0	# Location list terminator end (*.LLST0)
+.LLST1:
+	.long	.LFB4	# Location list begin address (*.LLST1)
+	.long	.LCFI2	# Location list end address (*.LLST1)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	.LCFI2	# Location list begin address (*.LLST1)
+	.long	.LCFI3	# Location list end address (*.LLST1)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 8
+	.long	.LCFI3	# Location list begin address (*.LLST1)
+	.long	.LCFI9	# Location list end address (*.LLST1)
+	.value	0x2	# Location expression size
+	.byte	0x75	# DW_OP_breg5
+	.sleb128 8
+	.long	.LCFI9	# Location list begin address (*.LLST1)
+	.long	.LFE4	# Location list end address (*.LLST1)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	0	# Location list terminator begin (*.LLST1)
+	.long	0	# Location list terminator end (*.LLST1)
+	.section	.debug_aranges,"",@progbits
+	.long	0x24	# Length of Address Ranges Info
+	.value	0x2	# DWARF Version
+	.long	.Ldebug_info0	# Offset of Compilation Unit Info
+	.byte	0x4	# Size of Address
+	.byte	0	# Size of Segment Descriptor
+	.value	0	# Pad to 8 byte boundary
+	.value	0
+	.long	.Ltext0	# Address
+	.long	.Letext0-.Ltext0	# Length
+	.long	.LFB4	# Address
+	.long	.LFE4-.LFB4	# Length
+	.long	0
+	.long	0
+	.section	.debug_ranges,"",@progbits
+.Ldebug_ranges0:
+	.long	.Ltext0	# Offset 0
+	.long	.Letext0
+	.long	.LFB4	# Offset 0x8
+	.long	.LFE4
+	.long	0
+	.long	0
+	.section	.debug_line,"",@progbits
+.Ldebug_line0:
+	.long	.LELT0-.LSLT0	# Length of Source Line Info
+.LSLT0:
+	.value	0x2	# DWARF Version
+	.long	.LELTP0-.LASLTP0	# Prolog Length
+.LASLTP0:
+	.byte	0x1	# Minimum Instruction Length
+	.byte	0x1	# Default is_stmt_start flag
+	.byte	0xf6	# Line Base Value (Special Opcodes)
+	.byte	0xf2	# Line Range Value (Special Opcodes)
+	.byte	0xd	# Special Opcode Base
+	.byte	0	# opcode: 0x1 has 0 args
+	.byte	0x1	# opcode: 0x2 has 1 args
+	.byte	0x1	# opcode: 0x3 has 1 args
+	.byte	0x1	# opcode: 0x4 has 1 args
+	.byte	0x1	# opcode: 0x5 has 1 args
+	.byte	0	# opcode: 0x6 has 0 args
+	.byte	0	# opcode: 0x7 has 0 args
+	.byte	0	# opcode: 0x8 has 0 args
+	.byte	0x1	# opcode: 0x9 has 1 args
+	.byte	0	# opcode: 0xa has 0 args
+	.byte	0	# opcode: 0xb has 0 args
+	.byte	0x1	# opcode: 0xc has 1 args
+	.byte	0	# End directory table
+	.ascii "typeddwarf.c\0"	# File Entry: 0x1
+	.uleb128 0
+	.uleb128 0
+	.uleb128 0
+	.byte	0	# End file name table
+.LELTP0:
+	.byte	0	# set address *.LM37
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM37
+	.byte	0x6d	# line 87
+	.byte	0	# set address *.LM38
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM38
+	.byte	0x18	# line 88
+	.byte	0	# set address *.LM39
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM39
+	.byte	0x16	# line 87
+	.byte	0	# set address *.LM40
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM40
+	.byte	0x18	# line 88
+	.byte	0	# set address *.LM41
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM41
+	.byte	0x16	# line 87
+	.byte	0	# set address *.LM42
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM42
+	.byte	0x18	# line 88
+	.byte	0	# set address *.LM43
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM43
+	.byte	0x18	# line 89
+	.byte	0	# set address *.LM44
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM44
+	.byte	0x18	# line 90
+	.byte	0	# set address *.LM45
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM45
+	.byte	0x18	# line 91
+	.byte	0	# set address *.LM46
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM46
+	.byte	0x19	# line 93
+	.byte	0	# set address *.LFE4
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LFE4
+	.byte	0	# end sequence
+	.uleb128 0x1
+	.byte	0x1
+	.byte	0	# set address *.LM1
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM1
+	.byte	0x20	# line 10
+	.byte	0	# set address *.LM2
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM2
+	.byte	0x2a	# line 29
+	.byte	0	# set address *.LM3
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM3
+	.byte	0x18	# line 30
+	.byte	0	# set address *.LM4
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM4
+	.byte	0x1b	# line 34
+	.byte	0	# set address *.LM5
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM5
+	.byte	0x2a	# line 53
+	.byte	0	# set address *.LM6
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM6
+	.byte	0x18	# line 54
+	.byte	0	# set address *.LM7
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM7
+	.byte	0x3	# advance to line 34
+	.sleb128 -20
+	.byte	0x1
+	.byte	0	# set address *.LM8
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM8
+	.byte	0x2b	# line 54
+	.byte	0	# set address *.LM9
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM9
+	.byte	0x16	# line 53
+	.byte	0	# set address *.LM10
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM10
+	.byte	0x18	# line 54
+	.byte	0	# set address *.LM11
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM11
+	.byte	0x18	# line 55
+	.byte	0	# set address *.LM12
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM12
+	.byte	0x16	# line 54
+	.byte	0	# set address *.LM13
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM13
+	.byte	0x18	# line 55
+	.byte	0	# set address *.LM14
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM14
+	.byte	0x18	# line 56
+	.byte	0	# set address *.LM15
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM15
+	.byte	0x16	# line 55
+	.byte	0	# set address *.LM16
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM16
+	.byte	0x18	# line 56
+	.byte	0	# set address *.LM17
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM17
+	.byte	0x18	# line 57
+	.byte	0	# set address *.LM18
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM18
+	.byte	0x16	# line 56
+	.byte	0	# set address *.LM19
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM19
+	.byte	0x18	# line 57
+	.byte	0	# set address *.LM20
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM20
+	.byte	0x18	# line 58
+	.byte	0	# set address *.LM21
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM21
+	.byte	0x16	# line 57
+	.byte	0	# set address *.LM22
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM22
+	.byte	0x18	# line 58
+	.byte	0	# set address *.LM23
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM23
+	.byte	0x18	# line 59
+	.byte	0	# set address *.LM24
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM24
+	.byte	0x1b	# line 63
+	.byte	0	# set address *.LM25
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM25
+	.byte	0x13	# line 59
+	.byte	0	# set address *.LM26
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM26
+	.byte	0x18	# line 60
+	.byte	0	# set address *.LM27
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM27
+	.byte	0x18	# line 61
+	.byte	0	# set address *.LM28
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM28
+	.byte	0x18	# line 62
+	.byte	0	# set address *.LM29
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM29
+	.byte	0x18	# line 63
+	.byte	0	# set address *.LM30
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM30
+	.byte	0x18	# line 64
+	.byte	0	# set address *.LM31
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM31
+	.byte	0x1b	# line 68
+	.byte	0	# set address *.LM32
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM32
+	.byte	0x1c	# line 73
+	.byte	0	# set address *.LM33
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM33
+	.byte	0x18	# line 74
+	.byte	0	# set address *.LM34
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM34
+	.byte	0x1b	# line 78
+	.byte	0	# set address *.LM35
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM35
+	.byte	0x1b	# line 82
+	.byte	0	# set address *.LM36
+	.uleb128 0x5
+	.byte	0x2
+	.long	.LM36
+	.byte	0x18	# line 83
+	.byte	0	# set address *.Letext0
+	.uleb128 0x5
+	.byte	0x2
+	.long	.Letext0
+	.byte	0	# end sequence
+	.uleb128 0x1
+	.byte	0x1
+.LELT0:
+	.section	.debug_str,"MS",@progbits,1
+.LASF2:
+	.string	"long long int"
+.LASF3:
+	.string	"unsigned int"
+.LASF8:
+	.string	"_Decimal32"
+.LASF4:
+	.string	"long long unsigned int"
+.LASF11:
+	.string	"main"
+.LASF9:
+	.string	"_Decimal64"
+.LASF0:
+	.string	"double"
+.LASF10:
+	.string	"_Decimal128"
+.LASF7:
+	.string	"/usr/src/gcc/obj/gcc"
+.LASF1:
+	.string	"float"
+.LASF6:
+	.string	"typeddwarf.c"
+.LASF5:
+	.string	"GNU C 4.7.0 20110504 (experimental)"
+	.ident	"GCC: (GNU) 4.7.0 20110504 (experimental)"
+	.section	.note.GNU-stack,"",@progbits
diff --git a/gdb/testsuite/gdb.dwarf2/typeddwarf.c b/gdb/testsuite/gdb.dwarf2/typeddwarf.c
new file mode 100644
index 0000000..e5f7d67
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/typeddwarf.c
@@ -0,0 +1,93 @@
+/* { dg-do run { target { i?86-*-* x86_64-*-* } } } */
+/* { dg-options "-g" } */
+
+typedef __SIZE_TYPE__ size_t;
+volatile int vv;
+extern void *memcpy (void *, const void *, size_t);
+
+__attribute__((noinline, noclone)) void
+f1 (double a, double b, double c, float d, float e, int f, unsigned int g, long long h, unsigned long long i)
+{
+  double j = d;			/* { dg-final { gdb-test 29 "j" "4" } } */
+  long long l;			/* { dg-final { gdb-test 29 "l" "4616189618054758400" } } */
+  memcpy (&l, &j, sizeof (l));
+  long long m;			/* { dg-final { gdb-test 29 "m" "4613937818241073152" } } */
+  memcpy (&m, &c, sizeof (l));
+  float n = i;			/* { dg-final { gdb-test 29 "n" "9" } } */
+  double o = h;			/* { dg-final { gdb-test 29 "o" "8" } } */
+  float p = g;			/* { dg-final { gdb-test 29 "p" "7" } } */
+  double q = f;			/* { dg-final { gdb-test 29 "q" "6" } } */
+  unsigned long long r = a;	/* { dg-final { gdb-test 29 "r" "1" } } */
+  long long s = c;		/* { dg-final { gdb-test 29 "s" "3" } } */
+  unsigned t = d;		/* { dg-final { gdb-test 29 "t" "4" } } */
+  int u = b;			/* { dg-final { gdb-test 29 "u" "2" } } */
+  float v = a;			/* { dg-final { gdb-test 29 "v" "1" } } */
+  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" } } */
+  vv++;
+}
+
+__attribute__((noinline, noclone)) void
+f2 (double a, double b, double c, float d, float e, int f, unsigned int g, long long h, unsigned long long i)
+{
+  double j = d;			/* { dg-final { gdb-test 53 "j" "4" } } */
+  long long l;			/* { dg-final { gdb-test 53 "l" "4616189618054758400" } } */
+  memcpy (&l, &j, sizeof (l));
+  long long m;			/* { dg-final { gdb-test 53 "m" "4613937818241073152" } } */
+  memcpy (&m, &c, sizeof (l));
+  float n = i;			/* { dg-final { xfail-gdb-test 53 "n" "9" } } */
+  double o = h;			/* { dg-final { xfail-gdb-test 53 "o" "8" } } */
+  float p = g;			/* { dg-final { gdb-test 53 "p" "7" } } */
+  double q = f;			/* { dg-final { gdb-test 53 "q" "6" } } */
+  unsigned long long r = a;	/* { dg-final { gdb-test 53 "r" "1" } } */
+  long long s = c;		/* { dg-final { gdb-test 53 "s" "3" } } */
+  unsigned t = d;		/* { dg-final { gdb-test 53 "t" "4" } } */
+  int u = b;			/* { dg-final { gdb-test 53 "u" "2" } } */
+  float v = a;			/* { dg-final { gdb-test 53 "v" "1" } } */
+  double w = d / 4.0;		/* { dg-final { gdb-test 53 "w" "1" } } */
+  double x = a + b - 3 + 1.0e20;/* { dg-final { gdb-test 53 "x" "1e\\+20" } } */
+  double y = b + c * 7.0;	/* { dg-final { gdb-test 53 "y" "23" } } */
+  float z = d + e + 3.0f;	/* { dg-final { gdb-test 53 "z" "12" } } */
+  vv++;
+  vv = a;
+  vv = b;
+  vv = c;
+  vv = d;
+  vv = e;
+  vv = f;
+  vv = g;
+  vv = h;
+  vv = i;
+  vv = j;
+}
+
+__attribute__((noinline, noclone)) void
+f3 (long long a, int b, long long c, unsigned d)
+{
+  long long w = (a > d) ? a : d;/* { dg-final { gdb-test 73 "w" "4" } } */
+  long long x = a + b + 7;	/* { dg-final { gdb-test 73 "x" "10" } } */
+  long long y = c + d + 0x912345678LL;/* { dg-final { gdb-test 73 "y" "38960125567" } } */
+  int z = (x + y);		/* { dg-final { gdb-test 73 "z" "305419913" } } */
+  vv++;
+}
+
+__attribute__((noinline, noclone)) void
+f4 (_Decimal32 a, _Decimal64 b, _Decimal128 c)
+{
+  _Decimal32 w = a * 8.0DF + 6.0DF;/* { dg-final { xfail-gdb-test 82 "(int)w" "70" } } */
+  _Decimal64 x = b / 8.0DD - 6.0DD;/* { dg-final { xfail-gdb-test 82 "(int)x" "-4" } } */
+  _Decimal128 y = -c / 8.0DL;	/* { dg-final { xfail-gdb-test 82 "(int)y" "-8" } } */
+  vv++;
+}
+
+int
+main ()
+{
+  f1 (1.0, 2.0, 3.0, 4.0f, 5.0f, 6, 7, 8, 9);
+  f2 (1.0, 2.0, 3.0, 4.0f, 5.0f, 6, 7, 8, 9);
+  f3 (1, 2, 3, 4);
+  f4 (8.0DF, 16.0DD, 64.0DL);
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.dwarf2/typeddwarf.exp b/gdb/testsuite/gdb.dwarf2/typeddwarf.exp
new file mode 100644
index 0000000..bddcc18
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/typeddwarf.exp
@@ -0,0 +1,91 @@
+# 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/>.
+
+load_lib dwarf.exp
+
+set test "typeddwarf"
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if ![dwarf2_support] {
+    return 0  
+}
+
+# This test can only be run on x86 targets.
+if { ![istarget i?86-*] } {
+    return 0
+}
+
+if { [prepare_for_testing "${test}.exp" "${test}" ${test}.S {nodebug}] } {
+    return -1
+}
+
+if ![runto_main] {
+    return -1
+}
+
+global tests
+set tests(_) -
+unset tests(_)
+
+proc gdb-test {line var value} {
+    global tests
+
+    lappend tests($line) [list $var $value 0]
+}
+
+proc xfail-gdb-test {line var value} {
+    global tests
+
+    lappend tests($line) [list $var $value 1]
+}
+
+proc scan_gdb_tests {} {
+    global srcdir subdir test
+
+    set file "$srcdir/$subdir/$test.c"
+
+    set fd [open "$file"]
+    while {![eof $fd]} {
+	set line [gets $fd]
+	if {! [regexp "\{ (gdb-test .+) \} \}" $line ignore test_cmd]} {
+	    continue
+	}
+
+	eval $test_cmd
+    }
+    close $fd
+}
+
+scan_gdb_tests
+
+foreach line [lsort [array names tests]] {
+    gdb_test "break typeddwarf.c:$line" "Breakpoint .*" \
+	"set breakpoint at typeddwarf.c:$line"
+    gdb_continue_to_breakpoint "continue to typeddwarf.c:$line"
+
+    foreach test $tests($line) {
+	set var [lindex $test 0]
+	set value [lindex $test 1]
+	set should_xfail [lindex $test 2]
+
+	if {$should_xfail} {
+	    setup_xfail *-*-*
+	}
+
+	gdb_test "print $var" \
+	    " = $value" \
+	    "check value of $var at typeddwarf.c:$line"
+    }
+}


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