dwarf_getlocation.c: Grok DW_OP_form_tls_address, DW_OP_GNU_push_tls_address, and DW_OP_bit_piece.
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 52e78e9..6c45b9d 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,8 @@
+2009-07-15  Roland McGrath  <roland@redhat.com>
+
+	* dwarf_getlocation.c: Grok DW_OP_form_tls_address,
+	DW_OP_GNU_push_tls_address, and DW_OP_bit_piece.
+
 2009-07-13  Roland McGrath  <roland@redhat.com>
 
 	* dwarf_getlocation.c: Grok DW_OP_call_frame_cfa.
diff --git a/libdw/dwarf_getlocation.c b/libdw/dwarf_getlocation.c
index 7f07e16..c7f7a89 100644
--- a/libdw/dwarf_getlocation.c
+++ b/libdw/dwarf_getlocation.c
@@ -244,6 +244,8 @@
 	case DW_OP_push_object_address:
 	case DW_OP_call_ref:
 	case DW_OP_call_frame_cfa:
+	case DW_OP_form_tls_address:
+	case DW_OP_GNU_push_tls_address:
 	  /* No operand.  */
 	  break;
 
@@ -336,6 +338,12 @@
 	  get_sleb128 (newloc->number2, data);
 	  break;
 
+	case DW_OP_bit_piece:
+	  /* XXX Check size.  */
+	  get_uleb128 (newloc->number, data);
+	  get_uleb128 (newloc->number2, data);
+	  break;
+
 	default:
 	  goto invalid;
 	}