@ -119,6 +119,7 @@ abbrev_entry_offset(u8 *file, u64 abbrev_offset, u32 requested_code)
				@@ -119,6 +119,7 @@ abbrev_entry_offset(u8 *file, u64 abbrev_offset, u32 requested_code)
					 
			
		
	
		
			
				
					         
			
		
	
		
			
				
					        u32  has_children  =  file [ abbrev_offset  +  offset + + ] ;  
			
		
	
		
			
				
					        ( void )  has_children ;  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					        if  ( code  = =  requested_code )  {  
			
		
	
		
			
				
					            return ( abbrev_offset ) ;  
			
		
	
		
			
				
					        }  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -654,7 +655,7 @@ TODO: The DW_OP_form_tls_address operation pops a value from the stack, translat
				@@ -654,7 +655,7 @@ TODO: The DW_OP_form_tls_address operation pops a value from the stack, translat
					 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					static  u32  
			
		
	
		
			
				
					read_actual_debug_data ( u8  * file ,  u64  string_offset ,  u32  address_size ,  u64  base_data_offset ,  u 32  form ,  u64  data_offset ,  u64  * value )  
			
		
	
		
			
				
					read_actual_debug_data ( u8  * file ,  u64  string_offset ,  u32  address_size ,  u32  form ,  u64  data_offset ,  u64  * value )  
			
		
	
		
			
				
					{  
			
		
	
		
			
				
					    u32  increment  =  0 ;  
			
		
	
		
			
				
					     
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -691,7 +692,8 @@ read_actual_debug_data(u8 *file, u64 string_offset, u32 address_size, u64 base_d
				@@ -691,7 +692,8 @@ read_actual_debug_data(u8 *file, u64 string_offset, u32 address_size, u64 base_d
					 
			
		
	
		
			
				
					            u32  offset ;  
			
		
	
		
			
				
					            memcpy ( & offset ,  file  +  data_offset ,  4 ) ;  
			
		
	
		
			
				
					            increment  =  4 ;  
			
		
	
		
			
				
					            * value  =  file [ base_data_offset  +  offset ] ;  
			
		
	
		
			
				
					            //*value = file[base_data_offset + offset];
  
			
		
	
		
			
				
					            * value  =  offset ;  
			
		
	
		
			
				
					            break ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -765,15 +767,21 @@ read_debug_info_for_compilation_unit(u8 *file, struct mi_debuginfo *dest,
				@@ -765,15 +767,21 @@ read_debug_info_for_compilation_unit(u8 *file, struct mi_debuginfo *dest,
					 
			
		
	
		
			
				
					    u32  code ,  tag ;  
			
		
	
		
			
				
					    u64  schema_offset ;  
			
		
	
		
			
				
					    u32  depth  =  0 ;  
			
		
	
		
			
				
					    u64  base_data_offset  =  data_offset  -  header_size ;  
			
		
	
		
			
				
					    //u64 base_data_offset = data_offset - header_size;
  
			
		
	
		
			
				
					     
			
		
	
		
			
				
					    int  vars_from  =  dest - > var_count ;  
			
		
	
		
			
				
					    int  types_from  =  dest - > type_count ;  
			
		
	
		
			
				
					     
			
		
	
		
			
				
					    struct  mi_compunit  * comp_unit  =  dest - > compilation_units  +  dest - > cu_count ;  
			
		
	
		
			
				
					    struct  mi_function  * func  =  dest - > functions  +  dest - > func_count ;  
			
		
	
		
			
				
					    struct  mi_variable  * variable  =  dest - > variables  +  dest - > var_count ;  
			
		
	
		
			
				
					    struct  mi_type      * type  =  dest - > types  +  dest - > type_count ;  
			
		
	
		
			
				
					     
			
		
	
		
			
				
					    comp_unit - > functions_from  =  dest - > func_count ;  
			
		
	
		
			
				
					     
			
		
	
		
			
				
					    for  ( ; ; )  {  
			
		
	
		
			
				
					        s64  record_offset  =  data_offset  -  debug_info_offset ;  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					        data_offset  + =  decode_leb128 ( file  +  data_offset ,  & code ) ;  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					        if  ( code  = =  0 )  {  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -804,7 +812,7 @@ read_debug_info_for_compilation_unit(u8 *file, struct mi_debuginfo *dest,
				@@ -804,7 +812,7 @@ read_debug_info_for_compilation_unit(u8 *file, struct mi_debuginfo *dest,
					 
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            u64  value ;  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            data_offset  + =  read_actual_debug_data ( file ,  debug_str_offset ,  di_header . address_size ,  base_data_offset ,  form ,  data_offset ,  & value ) ;  
			
		
	
		
			
				
					            data_offset  + =  read_actual_debug_data ( file ,  debug_str_offset ,  di_header . address_size ,  form ,  data_offset ,  & value ) ;  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            if  ( tag  = =  DW_TAG_compile_unit )  {  
			
		
	
		
			
				
					                if  ( attribute  = =  DW_AT_low_pc )  {  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -827,6 +835,49 @@ read_debug_info_for_compilation_unit(u8 *file, struct mi_debuginfo *dest,
				@@ -827,6 +835,49 @@ read_debug_info_for_compilation_unit(u8 *file, struct mi_debuginfo *dest,
					 
			
		
	
		
			
				
					                    variable - > name  =  ( char  * )  value ;  
			
		
	
		
			
				
					                }  else  if  ( attribute  = =  DW_AT_location )  {  
			
		
	
		
			
				
					                    variable - > location  =  value ;  
			
		
	
		
			
				
					                }  else  if  ( attribute  = =  DW_AT_type )  {  
			
		
	
		
			
				
					                    variable - > type  =  value ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  else  if  ( tag  = =  DW_TAG_base_type )  {  
			
		
	
		
			
				
					                type - > _offset  =  record_offset ;  
			
		
	
		
			
				
					                if  ( attribute  = =  DW_AT_name )  {  
			
		
	
		
			
				
					                    type - > name  =  ( char  * )  value ;  
			
		
	
		
			
				
					                }  else  if  ( attribute  = =  DW_AT_byte_size )  {  
			
		
	
		
			
				
					                    type - > size  =  value ;  
			
		
	
		
			
				
					                }  else  if  ( attribute  = =  DW_AT_encoding )  {  
			
		
	
		
			
				
					                    enum  dwarf_type_encoding  encoding  =  value ;  
			
		
	
		
			
				
					                    switch  ( encoding )  {  
			
		
	
		
			
				
					                        case  DW_ATE_address :  {  
			
		
	
		
			
				
					                            type - > encoding  =  MI_ADDRESS ;  
			
		
	
		
			
				
					                            break ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                         
			
		
	
		
			
				
					                        case  DW_ATE_boolean :  {  
			
		
	
		
			
				
					                            type - > encoding  =  MI_BOOLEAN ;  
			
		
	
		
			
				
					                            break ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                         
			
		
	
		
			
				
					                        case  DW_ATE_float :  {  
			
		
	
		
			
				
					                            type - > encoding  =  MI_FLOAT ;  
			
		
	
		
			
				
					                            break ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                         
			
		
	
		
			
				
					                        case  DW_ATE_signed_char :  
			
		
	
		
			
				
					                        case  DW_ATE_signed :  {  
			
		
	
		
			
				
					                            type - > encoding  =  MI_SIGNED ;  
			
		
	
		
			
				
					                            break ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                         
			
		
	
		
			
				
					                        case  DW_ATE_unsigned_char :  
			
		
	
		
			
				
					                        case  DW_ATE_unsigned :  {  
			
		
	
		
			
				
					                            type - > encoding  =  MI_UNSIGNED ;  
			
		
	
		
			
				
					                            break ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                         
			
		
	
		
			
				
					                        default :  {  
			
		
	
		
			
				
					                            DIE ( " unexpected type encoding! \n " ) ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					        }  while  ( attribute  ! =  0  | |  form  ! =  0 ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -843,6 +894,23 @@ read_debug_info_for_compilation_unit(u8 *file, struct mi_debuginfo *dest,
				@@ -843,6 +894,23 @@ read_debug_info_for_compilation_unit(u8 *file, struct mi_debuginfo *dest,
					 
			
		
	
		
			
				
					            + + parent - > variables_count ;  
			
		
	
		
			
				
					            + + dest - > var_count ;  
			
		
	
		
			
				
					            + + variable ;  
			
		
	
		
			
				
					        }  else  if  ( tag  = =  DW_TAG_base_type )  {  
			
		
	
		
			
				
					            + + dest - > type_count ;  
			
		
	
		
			
				
					            + + type ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					    }  
			
		
	
		
			
				
					     
			
		
	
		
			
				
					    // Resolve types
  
			
		
	
		
			
				
					    for  ( int  v  =  vars_from ;  v  <  dest - > var_count ;  + + v )  {  
			
		
	
		
			
				
					        struct  mi_variable  * variable  =  dest - > variables  +  v ;  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					        for  ( int  t  =  types_from ;  t  <  dest - > type_count ;  + + t )  {  
			
		
	
		
			
				
					            struct  mi_type  * type  =  dest - > types  +  t ;  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            if  ( type - > _offset  = =  variable - > type )  {  
			
		
	
		
			
				
					                variable - > type  =  t ;  
			
		
	
		
			
				
					                break ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					    }