This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: RFC: implement typed DWARF stack
>>>>> "Tom" == Tom Tromey <tromey@redhat.com> writes:
Tom> Yet another idea would be to lazily instantiate these special-to-DWARF
Tom> types and make struct dwarf_gdbarch_types a little bigger. I think I
Tom> like this idea the best. I think in practice we only need to support 3
Tom> such types (and if we run into more in the wild we can easily add them).
This is what I did.
Ulrich> [ In fact, maybe we don't need the whole value_cast business and
Ulrich> we could just operate on ULONGEST without involving value_binop,
Ulrich> since both cases only support integers anyway ... ]
Tom> I agree, for DW_OP_shr. I will do that. Unfortunately I think
Tom> DW_OP_mod still needs special magic.
Actually in the end I thought it was perhaps better to keep DW_OP_shr
more or less as it was. My reasoning is that by uniformly using the
value API, we make it simpler to handle new cases in the future. E.g.,
consider if we want to support 128-bit integer types -- we could do this
via value changes, but this would leave an odd hole in DWARF that the
patch writer would have to discover.
Ulrich> Maybe now it would be cleaner to split this into two union members,
Ulrich> a plain "int regnum" for DWARF_VALUE_REGISTER, and the struct value
Ulrich> for DWARF_VALUE_STACK ...
I did this for pieced results, but not for the stack itself, as that
would entail much more code.
Tom> Thanks very much for the review. I'll post a new patch when I've made
Tom> the needed changes.
Appended.
Tom
2011-05-05 Tom Tromey <tromey@redhat.com>
PR gdb/12617:
* value.h (value_from_contents): Declare.
* value.c (value_from_contents): New function.
* 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) <v.value>: Change type.
<v.regno>: New field.
(dwarf_expr_piece, dwarf_expr_fetch): Update.
(dwarf_expr_pop, dwarf_expr_push): Remove.
(dwarf_expr_push_address): 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. Now
static.
(dwarf_expr_push_address): New function.
(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.
(add_piece): Update.
* dwarf2-frame.c (no_base_type): New function.
(execute_stack_op): Set get_base_type field. Update.
2011-05-05 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..4e4e6d9 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,15 @@ 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_address (ctx, 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..3f6f277 100644
--- a/gdb/dwarf2expr.c
+++ b/gdb/dwarf2expr.c
@@ -34,6 +34,61 @@
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 gdbarch-specific types used by the DWARF expression
+ evaluator. */
+
+struct dwarf_gdbarch_types
+{
+ struct type *dw_types[3];
+};
+
+/* 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);
+
+ /* The types themselves are lazily initialized. */
+
+ return types;
+}
+
+/* Return the type used for DWARF operations where the type is
+ unspecified in the DWARF spec. Only certain sizes are
+ supported. */
+
+static struct type *
+dwarf_expr_address_type (struct dwarf_expr_context *ctx)
+{
+ struct dwarf_gdbarch_types *types = gdbarch_data (ctx->gdbarch,
+ dwarf_arch_cookie);
+ int ndx;
+
+ if (ctx->addr_size == 2)
+ ndx = 0;
+ else if (ctx->addr_size == 4)
+ ndx = 1;
+ else if (ctx->addr_size == 8)
+ ndx = 2;
+ else
+ error (_("Unsupported address size in DWARF expressions: %d bits"),
+ 8 * ctx->addr_size);
+
+ if (types->dw_types[ndx] == NULL)
+ types->dw_types[ndx]
+ = arch_integer_type (ctx->gdbarch,
+ 8 * ctx->addr_size,
+ 0, "<signed DWARF address type>");
+
+ return types->dw_types[ndx];
+}
+
/* Create a new context for the expression evaluator. */
struct dwarf_expr_context *
@@ -96,26 +151,32 @@ 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,
+static void
+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;
v->in_stack_memory = in_stack_memory;
}
-/* Pop the top item off of CTX's stack. */
+/* Push VALUE onto CTX's stack. */
void
+dwarf_expr_push_address (struct dwarf_expr_context *ctx, CORE_ADDR value,
+ int in_stack_memory)
+{
+ dwarf_expr_push (ctx,
+ value_from_ulongest (dwarf_expr_address_type (ctx), value),
+ in_stack_memory);
+}
+
+/* Pop the top item off of CTX's stack. */
+
+static void
dwarf_expr_pop (struct dwarf_expr_context *ctx)
{
if (ctx->stack_len <= 0)
@@ -125,7 +186,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 +194,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 +212,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 +228,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,8 +277,10 @@ 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 if (p->location == DWARF_VALUE_REGISTER)
+ p->v.regno = value_as_long (dwarf_expr_fetch (ctx, 0));
else
{
p->v.value = dwarf_expr_fetch (ctx, 0);
@@ -335,6 +376,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 +442,8 @@ 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);
ctx->location = DWARF_VALUE_MEMORY;
ctx->initialized = 1; /* Default is initialized. */
@@ -368,6 +466,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 +503,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 +516,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 +613,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 +622,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 +660,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 +704,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 +713,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 +736,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 +751,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 +761,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 +781,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 +804,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 +832,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, ®);
- 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, ®);
+ result += reg;
+ result_val = value_from_ulongest (address_type, result);
+ break;
+ }
+ }
break;
case DW_OP_and:
@@ -742,7 +881,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 +889,115 @@ 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;
+ {
+ int cast_back = 0;
+ struct type *orig_type = value_type (first);
+
+ /* We have to special-case "old-style" untyped values
+ -- these must have mod computed using unsigned
+ math. */
+ if (orig_type == address_type)
+ {
+ struct type *utype
+ = get_unsigned_type (ctx->gdbarch, orig_type);
+
+ cast_back = 1;
+ first = value_cast (utype, first);
+ second = value_cast (utype, 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 (cast_back)
+ result_val = value_cast (orig_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 +1008,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 +1021,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 +1034,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 +1112,73 @@ 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);
+ result_val = value_from_contents (type, data);
+ }
+ break;
+
+ case DW_OP_GNU_regval_type:
+ {
+ ULONGEST type_die;
+ struct type *type;
+
+ op_ptr = read_uleb128 (op_ptr, op_end, ®);
+ 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
+ result_val
+ = value_from_contents (type,
+ value_contents_all (result_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 +1192,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..676b54b 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. */
@@ -180,9 +187,11 @@ struct dwarf_expr_piece
int in_stack_memory;
} mem;
- /* The piece's register number or literal value, for
- DWARF_VALUE_REGISTER or DWARF_VALUE_STACK pieces. */
- ULONGEST value;
+ /* The piece's register number, for DWARF_VALUE_REGISTER pieces. */
+ int regno;
+
+ /* The piece's literal value, for DWARF_VALUE_STACK pieces. */
+ struct value *value;
struct
{
@@ -214,12 +223,12 @@ 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,
- int in_stack_memory);
-void dwarf_expr_pop (struct dwarf_expr_context *ctx);
+void dwarf_expr_push_address (struct dwarf_expr_context *ctx,
+ CORE_ADDR value,
+ int in_stack_memory);
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);
diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c
index 4c13307..01532d9 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,9 @@ 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_STACK)
+ value_incref (c->pieces[i].v.value);
return c;
}
@@ -576,7 +590,7 @@ 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, p->v.regno);
int reg_offset = source_offset;
if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
@@ -609,7 +623,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 +637,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 +647,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 +782,7 @@ 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, p->v.regno);
int reg_offset = dest_offset;
if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
@@ -816,7 +822,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 +1039,12 @@ 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_STACK)
+ value_free (c->pieces[i].v.value);
+
xfree (c->pieces);
xfree (c);
}
@@ -1106,6 +1118,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 +1161,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 +1189,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"
+ }
+}
diff --git a/gdb/value.c b/gdb/value.c
index 2acb1df..cb7cae5 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -2965,6 +2965,19 @@ value_from_contents_and_address (struct type *type,
return v;
}
+/* Create a value of type TYPE holding the contents CONTENTS.
+ The new value is `not_lval'. */
+
+struct value *
+value_from_contents (struct type *type, const gdb_byte *contents)
+{
+ struct value *result;
+
+ result = allocate_value (type);
+ memcpy (value_contents_raw (result), contents, TYPE_LENGTH (type));
+ return result;
+}
+
struct value *
value_from_double (struct type *type, DOUBLEST num)
{
diff --git a/gdb/value.h b/gdb/value.h
index 0889cef..1e8b670 100644
--- a/gdb/value.h
+++ b/gdb/value.h
@@ -479,6 +479,7 @@ extern struct value *value_at_lazy (struct type *type, CORE_ADDR addr);
extern struct value *value_from_contents_and_address (struct type *,
const gdb_byte *,
CORE_ADDR);
+extern struct value *value_from_contents (struct type *, const gdb_byte *);
extern struct value *default_value_from_register (struct type *type,
int regnum,