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))
+#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);
result = extract_unsigned_integer (op_ptr,
ctx->addr_size, byte_order);
op_ptr += ctx->addr_size;
+ /* Some versions of GCC emit DW_OP_addr before
+ DW_OP_GNU_push_tls_address. In this case the value is an
+ index, not an address. We don't support things like
+ branching between the address and the TLS op. */
+ if (op_ptr >= op_end || *op_ptr != DW_OP_GNU_push_tls_address)
+ result += ctx->offset;
break;
case DW_OP_const1u:
ctx->recursion_depth--;
gdb_assert (ctx->recursion_depth >= 0);
- #undef sign_ext
+#undef sign_ext
}