Byte b_bytes,
Byte *pb_custart )
{
- Byte *pb_link;
Byte b_size;
Word w_size;
DWord dw_size;
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
Byte *
+ DWARF_Info_ReadFormat_Offset(
+ LibGoblin_DWARF_DIEValue *p_val,
+ Byte *pb_src,
+ QWord *pqw_remain,
+ LibGoblin_BinaryInfo *p_binfo,
+ Byte b_bits )
+{
+ assert( NULL != pb_src );
+ assert( NULL != p_val );
+
+ if( 8 == b_bits ) {
+ pb_src = DWARF_Common_Read_QWord( &(p_val->value.qw_value), pb_src, pqw_remain );
+ p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_QWORD;
+ p_val->qw_size = 8;
+ }
+ else if( 4 == b_bits ) {
+ pb_src = DWARF_Common_Read_DWord( &(p_val->value.dw_value), pb_src, pqw_remain );
+ p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_DWORD;
+ p_val->qw_size = 4;
+ }
+
+ return pb_src;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+Byte *
DWARF_Info_ReadFormat_InDirect(
LibGoblin_DWARF_DIEValue *p_val,
Byte *pb_info,
LibGoblin_BinaryInfo *p_binfo,
LibGoblin_DWARF_Info_CUHeader *p_cuheader )
{
- QWord qw_cnt;
-
switch( dw_format ) {
case DW_FORM_addr: // 0x01: address
pb_info = DWARF_Info_ReadFormat_Address(
case DW_FORM_data8: // 0x07: const. line/loc/mac/rng-ptr
pb_info = DWARF_Common_Read_QWord( &(p_val->value.qw_value), pb_info, pqw_remains );
p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_QWORD;
- p_val->qw_size = 4;
+ p_val->qw_size = 8;
break;
case DW_FORM_string: // 0x08: string
pb_info = DWARF_Info_ReadFormat_String( p_val, pb_info, pqw_remains );
// offset from the beginning of the .debug_line section
// to the first byte of the data making up the line number list for the compilation unit.
// 1: const. value (size: offsetsize)
+ pb_info = DWARF_Info_ReadFormat_Offset(
+ p_val, pb_info, pqw_remains, p_binfo, p_cuheader->b_offsetsize );
break;
case DW_FORM_exprloc: // 0x18:
// 1: uLEB128 = length
// 2: info. bytes specified by the length(1:) (DWARF expression)
+ pb_info = DWARF_Info_ReadFormat_Block( p_val, pb_info, pqw_remains, -1);
break;
case DW_FORM_flag_present: // 0x19:
// have NONE value because implicitly flag is TRUE.
+ // => NONE Proc.
break;
case DW_FORM_ref_sig8: // 0x20:
+ // 1: pointer (8byte)
+ pb_info = DWARF_Common_Read_QWord( &(p_val->value.qw_value), pb_info, pqw_remains );
+ p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_QWORD;
+ p_val->qw_size = 8;
break;
case DW_FORM_GNU_ref_alt: // 0x1f20:
+ pb_info = DWARF_Info_ReadFormat_Offset(
+ p_val, pb_info, pqw_remains, p_binfo, p_cuheader->b_offsetsize );
break;
case DW_FORM_GNU_strp_alt: // 0x1f21:
+ pb_info = DWARF_Info_ReadFormat_Offset(
+ p_val, pb_info, pqw_remains, p_binfo, p_cuheader->b_offsetsize );
break;
default:
break;
i_readbytes += 1;
p_cuhead->qw_unitsize -= i_readbytes;
+
+ // for DWARF4 ---
+ if( 4 == p_cuhead->w_version ) {
+ // Read type-signature (8Byte) ---
+ pb_info = DWARF_Common_Read_QWord( &qw_qword, pb_info, pqw_size_info );
+ if( NULL == pb_info ) { return NULL; }
+ i_readbytes += 8;
+
+ p_cuhead->qw_type_signature = qw_qword;
+
+ // Read type_offset (4Byte(32bit), 8Byte(64bit)) ---
+ if( 64 == i_bitflag ) {
+ pb_info = DWARF_Common_Read_QWord( &qw_qword, pb_info, pqw_size_info );
+ if( NULL == pb_info ) { return NULL; }
+ i_readbytes += 8;
+
+ p_cuhead->qw_type_offset = qw_qword;
+ }
+ else {
+ pb_info = DWARF_Common_Read_DWord( &dw_dword, pb_info, pqw_size_info );
+ if( NULL == pb_info ) { return NULL; }
+ i_readbytes += 4;
+
+ p_cuhead->qw_type_offset = (QWord)dw_dword;
+ }
+
+ }
return pb_info;
}