@@ -106,8 +106,23 @@ pub(crate) fn handle_enum<R: ReaderType>(
106106
107107 let mut enumeration_builder = EnumerationBuilder :: new ( ) ;
108108
109- let mut tree = unit. entries_tree ( Some ( entry. offset ( ) ) ) . unwrap ( ) ;
110- let mut children = tree. root ( ) . unwrap ( ) . children ( ) ;
109+ let mut tree = match unit. entries_tree ( Some ( entry. offset ( ) ) ) {
110+ Ok ( x) => x,
111+ Err ( e) => {
112+ log:: error!( "Failed to get enum entry tree: {}" , e) ;
113+ return None ;
114+ }
115+ } ;
116+
117+ let tree_root = match tree. root ( ) {
118+ Ok ( x) => x,
119+ Err ( e) => {
120+ log:: error!( "Failed to get enum entry tree root: {}" , e) ;
121+ return None ;
122+ }
123+ } ;
124+
125+ let mut children = tree_root. children ( ) ;
111126 while let Ok ( Some ( child) ) = children. next ( ) {
112127 if child. entry ( ) . tag ( ) == constants:: DW_TAG_enumerator {
113128 let name = debug_info_builder_context. get_name ( dwarf, unit, child. entry ( ) ) ?;
@@ -183,49 +198,32 @@ pub(crate) fn handle_pointer<R: ReaderType>(
183198 // ?DW_AT_data_location
184199 // * = Optional
185200
186- if let Some ( pointer_size) = get_size_as_usize ( entry) {
187- if let Some ( entry_type_offset) = entry_type {
188- let parent_type = debug_info_builder
189- . get_type ( entry_type_offset)
190- . unwrap ( )
191- . get_type ( ) ;
192- Some ( Type :: pointer_of_width (
193- parent_type. as_ref ( ) ,
194- pointer_size,
195- false ,
196- false ,
197- Some ( reference_type) ,
198- ) )
199- } else {
200- Some ( Type :: pointer_of_width (
201- Type :: void ( ) . as_ref ( ) ,
202- pointer_size,
203- false ,
204- false ,
205- Some ( reference_type) ,
206- ) )
207- }
208- } else if let Some ( entry_type_offset) = entry_type {
209- let parent_type = debug_info_builder
201+ let pointer_size = match get_size_as_usize ( entry) {
202+ Some ( x) => x,
203+ None => debug_info_builder_context. default_address_size ( ) ,
204+ } ;
205+
206+ let target_type = match entry_type {
207+ Some ( entry_type_offset) => debug_info_builder
210208 . get_type ( entry_type_offset)
211- . unwrap ( )
212- . get_type ( ) ;
213- Some ( Type :: pointer_of_width (
214- parent_type . as_ref ( ) ,
215- debug_info_builder_context . default_address_size ( ) ,
216- false ,
217- false ,
218- Some ( reference_type ) ,
219- ) )
220- } else {
221- Some ( Type :: pointer_of_width (
222- Type :: void ( ) . as_ref ( ) ,
223- debug_info_builder_context . default_address_size ( ) ,
224- false ,
225- false ,
226- Some ( reference_type ) ,
227- ) )
228- }
209+ . or_else ( || {
210+ log :: error! (
211+ "Failed to get pointer target type at entry offset {}" ,
212+ entry_type_offset
213+ ) ;
214+ None
215+ } ) ?
216+ . get_type ( ) ,
217+ None => Type :: void ( ) ,
218+ } ;
219+
220+ Some ( Type :: pointer_of_width (
221+ target_type . as_ref ( ) ,
222+ pointer_size ,
223+ false ,
224+ false ,
225+ Some ( reference_type ) ,
226+ ) )
229227}
230228
231229pub ( crate ) fn handle_array < R : ReaderType > (
@@ -246,35 +244,51 @@ pub(crate) fn handle_array<R: ReaderType>(
246244 // * = Optional
247245 // For multidimensional arrays, DW_TAG_subrange_type or DW_TAG_enumeration_type
248246
249- if let Some ( entry_type_offset) = entry_type {
250- let parent_type = debug_info_builder
251- . get_type ( entry_type_offset)
252- . unwrap ( )
253- . get_type ( ) ;
254-
255- let mut tree = unit. entries_tree ( Some ( entry. offset ( ) ) ) . unwrap ( ) ;
256- let mut children = tree. root ( ) . unwrap ( ) . children ( ) ;
257-
258- // TODO : This is currently applying the size in reverse order
259- let mut result_type: Option < Ref < Type > > = None ;
260- while let Ok ( Some ( child) ) = children. next ( ) {
261- if let Some ( inner_type) = result_type {
262- result_type = Some ( Type :: array (
263- inner_type. as_ref ( ) ,
264- get_subrange_size ( child. entry ( ) ) ,
265- ) ) ;
266- } else {
267- result_type = Some ( Type :: array (
268- parent_type. as_ref ( ) ,
269- get_subrange_size ( child. entry ( ) ) ,
270- ) ) ;
271- }
247+ let entry_type_offset = entry_type?;
248+ let parent_type = debug_info_builder
249+ . get_type ( entry_type_offset)
250+ . or_else ( || {
251+ log:: error!(
252+ "Failed to get array member type at entry offset {}" ,
253+ entry_type_offset
254+ ) ;
255+ None
256+ } ) ?
257+ . get_type ( ) ;
258+
259+ let mut tree = match unit. entries_tree ( Some ( entry. offset ( ) ) ) {
260+ Ok ( x) => x,
261+ Err ( e) => {
262+ log:: error!( "Failed to get array entry tree: {}" , e) ;
263+ return None ;
272264 }
265+ } ;
266+ let tree_root = match tree. root ( ) {
267+ Ok ( x) => x,
268+ Err ( e) => {
269+ log:: error!( "Failed to get array entry tree root: {}" , e) ;
270+ return None ;
271+ }
272+ } ;
273+ let mut children = tree_root. children ( ) ;
273274
274- result_type. map_or ( Some ( Type :: array ( parent_type. as_ref ( ) , 0 ) ) , Some )
275- } else {
276- None
275+ // TODO : This is currently applying the size in reverse order
276+ let mut result_type: Option < Ref < Type > > = None ;
277+ while let Ok ( Some ( child) ) = children. next ( ) {
278+ if let Some ( inner_type) = result_type {
279+ result_type = Some ( Type :: array (
280+ inner_type. as_ref ( ) ,
281+ get_subrange_size ( child. entry ( ) ) ,
282+ ) ) ;
283+ } else {
284+ result_type = Some ( Type :: array (
285+ parent_type. as_ref ( ) ,
286+ get_subrange_size ( child. entry ( ) ) ,
287+ ) ) ;
288+ }
277289 }
290+
291+ result_type. map_or ( Some ( Type :: array ( parent_type. as_ref ( ) , 0 ) ) , Some )
278292}
279293
280294pub ( crate ) fn handle_function < R : ReaderType > (
@@ -327,8 +341,23 @@ pub(crate) fn handle_function<R: ReaderType>(
327341 let mut variable_arguments = false ;
328342
329343 // Get all the children and populate
330- let mut tree = unit. entries_tree ( Some ( entry. offset ( ) ) ) . unwrap ( ) ;
331- let mut children = tree. root ( ) . unwrap ( ) . children ( ) ;
344+ let mut tree = match unit. entries_tree ( Some ( entry. offset ( ) ) ) {
345+ Ok ( x) => x,
346+ Err ( e) => {
347+ log:: error!( "Failed to get function entry tree: {}" , e) ;
348+ return None ;
349+ }
350+ } ;
351+
352+ let tree_root = match tree. root ( ) {
353+ Ok ( x) => x,
354+ Err ( e) => {
355+ log:: error!( "Failed to get function entry tree root: {}" , e) ;
356+ return None ;
357+ }
358+ } ;
359+
360+ let mut children = tree_root. children ( ) ;
332361 while let Ok ( Some ( child) ) = children. next ( ) {
333362 if child. entry ( ) . tag ( ) == constants:: DW_TAG_formal_parameter {
334363 if let ( Some ( child_uid) , Some ( name) ) = {
@@ -343,7 +372,16 @@ pub(crate) fn handle_function<R: ReaderType>(
343372 debug_info_builder_context. get_name ( dwarf, unit, child. entry ( ) ) ,
344373 )
345374 } {
346- let child_type = debug_info_builder. get_type ( child_uid) . unwrap ( ) . get_type ( ) ;
375+ let child_type = debug_info_builder
376+ . get_type ( child_uid)
377+ . or_else ( || {
378+ log:: error!(
379+ "Failed to get function parameter type with uid {}" ,
380+ child_uid
381+ ) ;
382+ None
383+ } ) ?
384+ . get_type ( ) ;
347385 parameters. push ( FunctionParameter :: new ( child_type, name, None ) ) ;
348386 }
349387 } else if child. entry ( ) . tag ( ) == constants:: DW_TAG_unspecified_parameters {
@@ -373,15 +411,22 @@ pub(crate) fn handle_const(
373411 // ?DW_AT_sibling
374412 // ?DW_AT_type
375413
376- if let Some ( entry_type_offset ) = entry_type {
377- let parent_type = debug_info_builder
414+ let target_type_builder = match entry_type {
415+ Some ( entry_type_offset ) => debug_info_builder
378416 . get_type ( entry_type_offset)
379- . unwrap ( )
380- . get_type ( ) ;
381- Some ( ( * parent_type) . to_builder ( ) . set_const ( true ) . finalize ( ) )
382- } else {
383- Some ( TypeBuilder :: void ( ) . set_const ( true ) . finalize ( ) )
384- }
417+ . or_else ( || {
418+ log:: error!(
419+ "Failed to get const type with entry offset {}" ,
420+ entry_type_offset
421+ ) ;
422+ None
423+ } ) ?
424+ . get_type ( )
425+ . to_builder ( ) ,
426+ None => TypeBuilder :: void ( ) ,
427+ } ;
428+
429+ Some ( target_type_builder. set_const ( true ) . finalize ( ) )
385430}
386431
387432pub ( crate ) fn handle_volatile (
@@ -396,13 +441,20 @@ pub(crate) fn handle_volatile(
396441 // ?DW_AT_sibling
397442 // ?DW_AT_type
398443
399- if let Some ( entry_type_offset ) = entry_type {
400- let parent_type = debug_info_builder
444+ let target_type_builder = match entry_type {
445+ Some ( entry_type_offset ) => debug_info_builder
401446 . get_type ( entry_type_offset)
402- . unwrap ( )
403- . get_type ( ) ;
404- Some ( ( * parent_type) . to_builder ( ) . set_volatile ( true ) . finalize ( ) )
405- } else {
406- Some ( TypeBuilder :: void ( ) . set_volatile ( true ) . finalize ( ) )
407- }
447+ . or_else ( || {
448+ log:: error!(
449+ "Failed to get volatile type with entry offset {}" ,
450+ entry_type_offset
451+ ) ;
452+ None
453+ } ) ?
454+ . get_type ( )
455+ . to_builder ( ) ,
456+ None => TypeBuilder :: void ( ) ,
457+ } ;
458+
459+ Some ( target_type_builder. set_volatile ( true ) . finalize ( ) )
408460}
0 commit comments