@@ -56,7 +56,7 @@ impl DebugContext {
56
56
// ty::FnDef(..) | ty::FnPtr(..)
57
57
// ty::Closure(..)
58
58
// ty::Adt(def, ..)
59
- // ty::Tuple(_)
59
+ ty:: Tuple ( components ) => self . tuple_type ( tcx , type_dbg , ty , * components ) ,
60
60
// ty::Param(_)
61
61
// FIXME implement remaining types and add unreachable!() to the fallback branch
62
62
_ => self . placeholder_for_type ( tcx, type_dbg, ty) ,
@@ -144,6 +144,51 @@ impl DebugContext {
144
144
}
145
145
}
146
146
147
+ fn tuple_type < ' tcx > (
148
+ & mut self ,
149
+ tcx : TyCtxt < ' tcx > ,
150
+ type_dbg : & mut TypeDebugContext < ' tcx > ,
151
+ tuple_type : Ty < ' tcx > ,
152
+ components : & ' tcx [ Ty < ' tcx > ] ,
153
+ ) -> UnitEntryId {
154
+ let components = components
155
+ . into_iter ( )
156
+ . map ( |& ty| ( ty, self . debug_type ( tcx, type_dbg, ty) ) )
157
+ . collect :: < Vec < _ > > ( ) ;
158
+
159
+ return_if_type_created_in_meantime ! ( type_dbg, tuple_type) ;
160
+
161
+ let name = type_names:: compute_debuginfo_type_name ( tcx, tuple_type, false ) ;
162
+ let layout = RevealAllLayoutCx ( tcx) . layout_of ( tuple_type) ;
163
+
164
+ let tuple_type_id =
165
+ self . dwarf . unit . add ( self . dwarf . unit . root ( ) , gimli:: DW_TAG_structure_type ) ;
166
+ let tuple_entry = self . dwarf . unit . get_mut ( tuple_type_id) ;
167
+ tuple_entry. set ( gimli:: DW_AT_name , AttributeValue :: StringRef ( self . dwarf . strings . add ( name) ) ) ;
168
+ tuple_entry. set ( gimli:: DW_AT_byte_size , AttributeValue :: Udata ( layout. size . bytes ( ) ) ) ;
169
+ tuple_entry. set ( gimli:: DW_AT_alignment , AttributeValue :: Udata ( layout. align . pref . bytes ( ) ) ) ;
170
+
171
+ for ( i, ( ty, dw_ty) ) in components. into_iter ( ) . enumerate ( ) {
172
+ let member_id = self . dwarf . unit . add ( tuple_type_id, gimli:: DW_TAG_member ) ;
173
+ let member_entry = self . dwarf . unit . get_mut ( member_id) ;
174
+ member_entry. set (
175
+ gimli:: DW_AT_name ,
176
+ AttributeValue :: StringRef ( self . dwarf . strings . add ( format ! ( "__{i}" ) ) ) ,
177
+ ) ;
178
+ member_entry. set ( gimli:: DW_AT_type , AttributeValue :: UnitRef ( dw_ty) ) ;
179
+ member_entry. set (
180
+ gimli:: DW_AT_alignment ,
181
+ AttributeValue :: Udata ( RevealAllLayoutCx ( tcx) . layout_of ( ty) . align . pref . bytes ( ) ) ,
182
+ ) ;
183
+ member_entry. set (
184
+ gimli:: DW_AT_data_member_location ,
185
+ AttributeValue :: Udata ( layout. fields . offset ( i) . bytes ( ) ) ,
186
+ ) ;
187
+ }
188
+
189
+ tuple_type_id
190
+ }
191
+
147
192
fn placeholder_for_type < ' tcx > (
148
193
& mut self ,
149
194
tcx : TyCtxt < ' tcx > ,
0 commit comments