OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 1 Sep 2019 04:50:28 +0000 (13:50 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 1 Sep 2019 04:50:28 +0000 (13:50 +0900)
  * WorkBackup

libgoblin/drd64_libgoblin_api.c
libgoblin/drd64_libgoblin_dwarf_expression.c
libgoblin/drd64_libgoblin_dwarf_expression.h
libgoblin/drd64_libgoblin_dwarf_info.c
libgoblin/drd64_libgoblin_type_dwarf.h
libgoblin/test_libgoblin_dwarf_expression.c

index 5cca00f..60bbb6d 100644 (file)
@@ -102,7 +102,7 @@ int
        //Debug_Index_DWARFInfo_DumpObjectInfo( p_binfo, 0xff );
 
        // XXX: for DEBUG!
-       Debug_ObjectInfo_Print_AllGroupLink( p_pginfo, 0xff );
+       //Debug_ObjectInfo_Print_AllGroupLink( p_pginfo, 0xff );
 
        return  i_result;
 }
index ab608fc..ca3539e 100644 (file)
@@ -39,192 +39,444 @@ Comment:
 
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_EXPRESSION_EXTERN
+void
+       DWARF_Expression_ClearValue(
+                       LibGoblin_DWARF_Expression      *p_exp )
+{
+       assert( NULL != p_exp );
+
+       memset( p_exp, 0x00, sizeof( LibGoblin_DWARF_Expression ) );
+       return;
+}
+
 
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
 LIBGOBLIN_DWARF_EXPRESSION_EXTERN
 int
-       DWARF_Expression_Evaluate(
-                       Byte    *pb_data,
-                       DWord   dw_size )
+       DWARF_Expression_SetDefaultValue(
+                       LibGoblin_DWARF_Expression      *p_exp,
+                       LibGoblin_BinaryInfo            *p_binfo )
 {
+       if( NULL == p_exp )     {
+               return -0x01;
+       }
+
+       if( NULL == p_binfo )   {
+               return -0x02;
+       }
+
+       p_exp->dw_setdata       = LIBGOBLIN_DWARF_DATA_NONE;
+
+       if( LIBGOBLIN_BINFO_TYPE_ELF32 == p_binfo->b_type )
+               { p_exp->dw_addrsize    = 4; }
+       else    // LIBGOBLIN_BINFO_TYPE_ELF64 
+               { p_exp->dw_addrsize    = 8; }
+       p_exp->dw_setdata       |= LIBGOBLIN_DWARF_DATA_ADDRSIZE;
+
        return 0x00;
 }
 
+
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_EXPRESSION_EXTERN
+DWord
+       DWARF_Expression_Evaluate(
+                       LibGoblin_DWARF_Expression      *p_exp,
+                       Byte    *pb_data,
+                       DWord   dw_size )
+{
+       Byte    b_opcode;
+       Byte    *pb_now;
+       DWord   dw_remain;
+       DWord   dw_depth;
+       QWord   qw_stack[32];
+
+#define        PUSH_DWARF(n)   {qw_stack[dw_depth++] = (n);} 
+
+       // ------------------------
+       if( NULL == p_exp )     {
+               return  (LIBGOBLIN_DWARF_STATUS_ERROR | 0x01);
+       }
+
+       if( NULL == pb_data )   {
+               return  (LIBGOBLIN_DWARF_STATUS_ERROR | 0x01);
+       }
+
+       // ------------------------
+       pb_now                          = pb_data;
+       dw_depth                        = 0;
+       dw_remain                       = (( 0 == dw_size ) ? 512 : dw_size );
+       p_exp->qw_result        = 0x00000000;
 
+       do      {
+               b_opcode        = *pb_now++;
+               dw_remain--;
+
+               switch( b_opcode )      {
+                       case DW_OP_addr:                                // 0x03
+                               if( p_exp->dw_setdata | LIBGOBLIN_DWARF_DATA_ADDRSIZE )
+                                       { PUSH_DWARF( p_exp->dw_addrsize ); }
+                               else    {
+                                       p_exp->dw_requested |= LIBGOBLIN_DWARF_DATA_ADDRSIZE;
+                                       PUSH_DWARF( 8 );        // 8 is temp. value
+                               }
+                               break;
+                       case DW_OP_deref:                               // 0x06
+                               break;
+                       case DW_OP_const1u:                             // 0x08
+                               break;
+                       case DW_OP_const1s:                             // 0x09
+                               break;
+                       case DW_OP_const2u:                             // 0x0a
+                               break;
+                       case DW_OP_const2s:                             // 0x0b
+                               break;
+                       case DW_OP_const4u:                             // 0x0c
+                               break;
+                       case DW_OP_const4s:                             // 0x0d
+                               break;
+                       case DW_OP_const8u:                             // 0x0e
+                               break;
+                       case DW_OP_const8s:                             // 0x0f
+                               break;
+                       case DW_OP_constu:                              // 0x10
+                               break;
+                       case DW_OP_consts:                              // 0x11
+                               break;
+                       case DW_OP_dup:                                 // 0x12
+                               break;
+                       case DW_OP_drop:                                // 0x13
+                               break;
+                       case DW_OP_over:                                // 0x14
+                               break;
+                       case DW_OP_pick:                                // 0x15
+                               break;
+                       case DW_OP_swap:                                // 0x16
+                               break;
+                       case DW_OP_rot:                                 // 0x17
+                               break;
+                       case DW_OP_xderef:                              // 0x18
+                               break;
+                       case DW_OP_abs:                                 // 0x19
+                               break;
+                       case DW_OP_and:                                 // 0x1a
+                               break;
+                       case DW_OP_div:                                 // 0x1b
+                               break;
+                       case DW_OP_minus:                               // 0x1c
+                               break;
+                       case DW_OP_mod:                                 // 0x1d
+                               break;
+                       case DW_OP_mul:                                 // 0x1e
+                               break;
+                       case DW_OP_neg:                                 // 0x1f
+                               break;
+                       case DW_OP_not:                                 // 0x20
+                               break;
+                       case DW_OP_or:                                  // 0x21
+                               break;
+                       case DW_OP_plus:                                // 0x22
+                               break;
+                       case DW_OP_plus_uconst:                 // 0x23
+                               break;
+                       case DW_OP_shl:                                 // 0x24
+                               break;
+                       case DW_OP_shr:                                 // 0x25
+                               break;
+                       case DW_OP_shra:                                // 0x26
+                               break;
+                       case DW_OP_xor:                                 // 0x27
+                               break;
+                       case DW_OP_bra:                                 // 0x28
+                               break;
+                       case DW_OP_eq:                                  // 0x29
+                               break;
+                       case DW_OP_ge:                                  // 0x2a
+                               break;
+                       case DW_OP_gt:                                  // 0x2b
+                               break;
+                       case DW_OP_le:                                  // 0x2c
+                               break;
+                       case DW_OP_lt:                                  // 0x2d
+                               break;
+                       case DW_OP_ne:                                  // 0x2e
+                               break;
+                       case DW_OP_skip:                                // 0x2f
+                               break;
+
+                       case DW_OP_lit0:                                // 0x30
+                               PUSH_DWARF(  0 );       break;
+                       case DW_OP_lit1:                                // 0x31
+                               PUSH_DWARF(  1 );       break;
+                       case DW_OP_lit2:                                // 0x32
+                               PUSH_DWARF(  2 );       break;
+                       case DW_OP_lit3:                                // 0x33
+                               PUSH_DWARF(  3 );       break;
+                       case DW_OP_lit4:                                // 0x34
+                               PUSH_DWARF(  4 );       break;
+                       case DW_OP_lit5:                                // 0x35
+                               PUSH_DWARF(  5 );       break;
+                       case DW_OP_lit6:                                // 0x36
+                               PUSH_DWARF(  6 );       break;
+                       case DW_OP_lit7:                                // 0x37
+                               PUSH_DWARF(  7 );       break;
+                       case DW_OP_lit8:                                // 0x38
+                               PUSH_DWARF(  8 );       break;
+                       case DW_OP_lit9:                                // 0x39
+                               PUSH_DWARF(  9 );       break;
+                       case DW_OP_lit10:                               // 0x3a
+                               PUSH_DWARF( 10 );       break;
+                       case DW_OP_lit11:                               // 0x3b
+                               PUSH_DWARF( 11 );       break;
+                       case DW_OP_lit12:                               // 0x3c
+                               PUSH_DWARF( 12 );       break;
+                       case DW_OP_lit13:                               // 0x3d
+                               PUSH_DWARF( 13 );       break;
+                       case DW_OP_lit14:                               // 0x3e
+                               PUSH_DWARF( 14 );       break;
+                       case DW_OP_lit15:                               // 0x3f
+                               PUSH_DWARF( 15 );       break;
+                       case DW_OP_lit16:                               // 0x40
+                               PUSH_DWARF( 16 );       break;
+                       case DW_OP_lit17:                               // 0x41
+                               PUSH_DWARF( 17 );       break;
+                       case DW_OP_lit18:                               // 0x42
+                               PUSH_DWARF( 18 );       break;
+                       case DW_OP_lit19:                               // 0x43
+                               PUSH_DWARF( 19 );       break;
+                       case DW_OP_lit20:                               // 0x44
+                               PUSH_DWARF( 20 );       break;
+                       case DW_OP_lit21:                               // 0x45
+                               PUSH_DWARF( 21 );       break;
+                       case DW_OP_lit22:                               // 0x46
+                               PUSH_DWARF( 22 );       break;
+                       case DW_OP_lit23:                               // 0x47
+                               PUSH_DWARF( 23 );       break;
+                       case DW_OP_lit24:                               // 0x48
+                               PUSH_DWARF( 24 );       break;
+                       case DW_OP_lit25:                               // 0x49
+                               PUSH_DWARF( 25 );       break;
+                       case DW_OP_lit26:                               // 0x4a
+                               PUSH_DWARF( 26 );       break;
+                       case DW_OP_lit27:                               // 0x4b
+                               PUSH_DWARF( 27 );       break;
+                       case DW_OP_lit28:                               // 0x4c
+                               PUSH_DWARF( 28 );       break;
+                       case DW_OP_lit29:                               // 0x4d
+                               PUSH_DWARF( 29 );       break;
+                       case DW_OP_lit30:                               // 0x4e
+                               PUSH_DWARF( 30 );       break;
+                       case DW_OP_lit31:                               // 0x4f
+                               PUSH_DWARF( 31 );       break;
+
+                       case DW_OP_reg0:                                // 0x50
+                               break;
+                       case DW_OP_reg1:                                // 0x51
+                               break;
+                       case DW_OP_reg2:                                // 0x52
+                               break;
+                       case DW_OP_reg3:                                // 0x53
+                               break;
+                       case DW_OP_reg4:                                // 0x54
+                               break;
+                       case DW_OP_reg5:                                // 0x55
+                               break;
+                       case DW_OP_reg6:                                // 0x56
+                               break;
+                       case DW_OP_reg7:                                // 0x57
+                               break;
+                       case DW_OP_reg8:                                // 0x58
+                               break;
+                       case DW_OP_reg9:                                // 0x59
+                               break;
+                       case DW_OP_reg10:                               // 0x5a
+                               break;
+                       case DW_OP_reg11:                               // 0x5b
+                               break;
+                       case DW_OP_reg12:                               // 0x5c
+                               break;
+                       case DW_OP_reg13:                               // 0x5d
+                               break;
+                       case DW_OP_reg14:                               // 0x5e
+                               break;
+                       case DW_OP_reg15:                               // 0x5f
+                               break;
+                       case DW_OP_reg16:                               // 0x60
+                               break;
+                       case DW_OP_reg17:                               // 0x61
+                               break;
+                       case DW_OP_reg18:                               // 0x62
+                               break;
+                       case DW_OP_reg19:                               // 0x63
+                               break;
+                       case DW_OP_reg20:                               // 0x64
+                               break;
+                       case DW_OP_reg21:                               // 0x65
+                               break;
+                       case DW_OP_reg22:                               // 0x66
+                               break;
+                       case DW_OP_reg23:                               // 0x67
+                               break;
+                       case DW_OP_reg24:                               // 0x68
+                               break;
+                       case DW_OP_reg25:                               // 0x69
+                               break;
+                       case DW_OP_reg26:                               // 0x6a
+                               break;
+                       case DW_OP_reg27:                               // 0x6b
+                               break;
+                       case DW_OP_reg28:                               // 0x6c
+                               break;
+                       case DW_OP_reg29:                               // 0x6d
+                               break;
+                       case DW_OP_reg30:                               // 0x6e
+                               break;
+                       case DW_OP_reg31:                               // 0x6f
+                               break;
+                       case DW_OP_breg0:                               // 0x70
+                               break;
+                       case DW_OP_breg1:                               // 0x71
+                               break;
+                       case DW_OP_breg2:                               // 0x72
+                               break;
+                       case DW_OP_breg3:                               // 0x73
+                               break;
+                       case DW_OP_breg4:                               // 0x74
+                               break;
+                       case DW_OP_breg5:                               // 0x75
+                               break;
+                       case DW_OP_breg6:                               // 0x76
+                               break;
+                       case DW_OP_breg7:                               // 0x77
+                               break;
+                       case DW_OP_breg8:                               // 0x78
+                               break;
+                       case DW_OP_breg9:                               // 0x79
+                               break;
+                       case DW_OP_breg10:                              // 0x7a
+                               break;
+                       case DW_OP_breg11:                              // 0x7b
+                               break;
+                       case DW_OP_breg12:                              // 0x7c
+                               break;
+                       case DW_OP_breg13:                              // 0x7d
+                               break;
+                       case DW_OP_breg14:                              // 0x7e
+                               break;
+                       case DW_OP_breg15:                              // 0x7f
+                               break;
+                       case DW_OP_breg16:                              // 0x80
+                               break;
+                       case DW_OP_breg17:                              // 0x81
+                               break;
+                       case DW_OP_breg18:                              // 0x82
+                               break;
+                       case DW_OP_breg19:                              // 0x83
+                               break;
+                       case DW_OP_breg20:                              // 0x84
+                               break;
+                       case DW_OP_breg21:                              // 0x85
+                               break;
+                       case DW_OP_breg22:                              // 0x86
+                               break;
+                       case DW_OP_breg23:                              // 0x87
+                               break;
+                       case DW_OP_breg24:                              // 0x88
+                               break;
+                       case DW_OP_breg25:                              // 0x89
+                               break;
+                       case DW_OP_breg26:                              // 0x8a
+                               break;
+                       case DW_OP_breg27:                              // 0x8b
+                               break;
+                       case DW_OP_breg28:                              // 0x8c
+                               break;
+                       case DW_OP_breg29:                              // 0x8d
+                               break;
+                       case DW_OP_breg30:                              // 0x8e
+                               break;
+                       case DW_OP_breg31:                              // 0x8f
+                               break;
+                       case DW_OP_regx:                                // 0x90
+                               break;
+                       case DW_OP_fbreg:                               // 0x91
+                               break;
+                       case DW_OP_bregx:                               // 0x92
+                               break;
+                       case DW_OP_piece:                               // 0x93
+                               break;
+                       case DW_OP_deref_size:                  // 0x94
+                               break;
+                       case DW_OP_xderef_size:                 // 0x95
+                               break;
+                       case DW_OP_nop:                                 // 0x96
+                               break;
+                       case DW_OP_push_object_address: // 0x97
+                               break;
+                       case DW_OP_call2:                               // 0x98
+                               break;
+                       case DW_OP_call4:                               // 0x99
+                               break;
+                       case DW_OP_call_ref:                    // 0x9a
+                               break;
+                       case DW_OP_form_tls_address:    // 0x9b
+                               break;
+                       case DW_OP_call_frame_cfa:              // 0x9c
+                               break;
+                       case DW_OP_bit_piece:                   // 0x9d
+                               break;
+                       case DW_OP_implicit_value:              // 0x9e
+                               break;
+                       case DW_OP_stack_value:                 // 0x9f
+                               break;
+               //      case DW_OP_lo_user:                             // 0xe0
+               //              break;
+               //      case DW_OP_hi_user:                             // 0xff
+               //              break;
+                       case DW_OP_GNU_push_tls_address:        // 0xe0
+                               break;
+                       case DW_OP_GNU_uninit:                  // 0xf0
+                               break;
+                       case DW_OP_GNU_encoded_addr:    // 0xf1
+                               break;
+                       case DW_OP_GNU_implicit_pointer:        // 0xf2
+                               break;
+                       case DW_OP_GNU_entry_value:             // 0xf3
+                               break;
+                       case DW_OP_GNU_const_type:              // 0xf4
+                               break;
+                       case DW_OP_GNU_regval_type:             // 0xf5
+                               break;
+                       case DW_OP_GNU_deref_type:              // 0xf6
+                               break;
+                       case DW_OP_GNU_convert:                 // 0xf7
+                               break;
+                       case DW_OP_GNU_reinterpret:             // 0xf9
+                               break;
+                       case DW_OP_GNU_parameter_ref:   // 0xfa
+                               break;
+                       case DW_OP_GNU_addr_index:              // 0xfb
+                               break;
+                       case DW_OP_GNU_const_index:             // 0xfc
+                               break;
+                       default:
+                               break;
+               }
+
+       }while( 0 < dw_remain );
+
+       if( LIBGOBLIN_DWARF_DATA_NONE != p_exp->dw_requested )
+               { p_exp->dw_status      = LIBGOBLIN_DWARF_STATUS_REQUESTED; }
+       else if( 1 == dw_depth )        {
+               p_exp->dw_status        = LIBGOBLIN_DWARF_STATUS_EVALUATED;
+               p_exp->qw_result        = qw_stack[ 0 ];
+       }
+
+       return p_exp->dw_status;
+}
 
 
 /* EOF of drd64_.c ----------------------------------- */
-/*
-       DW_OP_addr:                             // 0x03
-       DW_OP_deref:                    // 0x06
-       DW_OP_const1u:                  // 0x08
-       DW_OP_const1s:                  // 0x09
-       DW_OP_const2u:                  // 0x0a
-       DW_OP_const2s:                  // 0x0b
-       DW_OP_const4u:                  // 0x0c
-       DW_OP_const4s:                  // 0x0d
-       DW_OP_const8u:                  // 0x0e
-       DW_OP_const8s:                  // 0x0f
-       DW_OP_constu:                   // 0x10
-       DW_OP_consts:                   // 0x11
-       DW_OP_dup:                              // 0x12
-       DW_OP_drop:                             // 0x13
-       DW_OP_over:                             // 0x14
-       DW_OP_pick:                             // 0x15
-       DW_OP_swap:                             // 0x16
-       DW_OP_rot:                              // 0x17
-       DW_OP_xderef:                   // 0x18
-       DW_OP_abs:                              // 0x19
-       DW_OP_and:                              // 0x1a
-       DW_OP_div:                              // 0x1b
-       DW_OP_minus:                    // 0x1c
-       DW_OP_mod:                              // 0x1d
-       DW_OP_mul:                              // 0x1e
-       DW_OP_neg:                              // 0x1f
-       DW_OP_not:                              // 0x20
-       DW_OP_or:                               // 0x21
-       DW_OP_plus:                             // 0x22
-       DW_OP_plus_uconst:              // 0x23
-       DW_OP_shl:                              // 0x24
-       DW_OP_shr:                              // 0x25
-       DW_OP_shra:                             // 0x26
-       DW_OP_xor:                              // 0x27
-       DW_OP_bra:                              // 0x28
-       DW_OP_eq:                               // 0x29
-       DW_OP_ge:                               // 0x2a
-       DW_OP_gt:                               // 0x2b
-       DW_OP_le:                               // 0x2c
-       DW_OP_lt:                               // 0x2d
-       DW_OP_ne:                               // 0x2e
-       DW_OP_skip:                             // 0x2f
-       DW_OP_lit0:                             // 0x30
-       DW_OP_lit1:                             // 0x31
-       DW_OP_lit2:                             // 0x32
-       DW_OP_lit3:                             // 0x33
-       DW_OP_lit4:                             // 0x34
-       DW_OP_lit5:                             // 0x35
-       DW_OP_lit6:                             // 0x36
-       DW_OP_lit7:                             // 0x37
-       DW_OP_lit8:                             // 0x38
-       DW_OP_lit9:                             // 0x39
-       DW_OP_lit10:                    // 0x3a
-       DW_OP_lit11:                    // 0x3b
-       DW_OP_lit12:                    // 0x3c
-       DW_OP_lit13:                    // 0x3d
-       DW_OP_lit14:                    // 0x3e
-       DW_OP_lit15:                    // 0x3f
-       DW_OP_lit16:                    // 0x40
-       DW_OP_lit17:                    // 0x41
-       DW_OP_lit18:                    // 0x42
-       DW_OP_lit19:                    // 0x43
-       DW_OP_lit20:                    // 0x44
-       DW_OP_lit21:                    // 0x45
-       DW_OP_lit22:                    // 0x46
-       DW_OP_lit23:                    // 0x47
-       DW_OP_lit24:                    // 0x48
-       DW_OP_lit25:                    // 0x49
-       DW_OP_lit26:                    // 0x4a
-       DW_OP_lit27:                    // 0x4b
-       DW_OP_lit28:                    // 0x4c
-       DW_OP_lit29:                    // 0x4d
-       DW_OP_lit30:                    // 0x4e
-       DW_OP_lit31:                    // 0x4f
-       DW_OP_reg0:                             // 0x50
-       DW_OP_reg1:                             // 0x51
-       DW_OP_reg2:                             // 0x52
-       DW_OP_reg3:                             // 0x53
-       DW_OP_reg4:                             // 0x54
-       DW_OP_reg5:                             // 0x55
-       DW_OP_reg6:                             // 0x56
-       DW_OP_reg7:                             // 0x57
-       DW_OP_reg8:                             // 0x58
-       DW_OP_reg9:                             // 0x59
-       DW_OP_reg10:                    // 0x5a
-       DW_OP_reg11:                    // 0x5b
-       DW_OP_reg12:                    // 0x5c
-       DW_OP_reg13:                    // 0x5d
-       DW_OP_reg14:                    // 0x5e
-       DW_OP_reg15:                    // 0x5f
-       DW_OP_reg16:                    // 0x60
-       DW_OP_reg17:                    // 0x61
-       DW_OP_reg18:                    // 0x62
-       DW_OP_reg19:                    // 0x63
-       DW_OP_reg20:                    // 0x64
-       DW_OP_reg21:                    // 0x65
-       DW_OP_reg22:                    // 0x66
-       DW_OP_reg23:                    // 0x67
-       DW_OP_reg24:                    // 0x68
-       DW_OP_reg25:                    // 0x69
-       DW_OP_reg26:                    // 0x6a
-       DW_OP_reg27:                    // 0x6b
-       DW_OP_reg28:                    // 0x6c
-       DW_OP_reg29:                    // 0x6d
-       DW_OP_reg30:                    // 0x6e
-       DW_OP_reg31:                    // 0x6f
-       DW_OP_breg0:                    // 0x70
-       DW_OP_breg1:                    // 0x71
-       DW_OP_breg2:                    // 0x72
-       DW_OP_breg3:                    // 0x73
-       DW_OP_breg4:                    // 0x74
-       DW_OP_breg5:                    // 0x75
-       DW_OP_breg6:                    // 0x76
-       DW_OP_breg7:                    // 0x77
-       DW_OP_breg8:                    // 0x78
-       DW_OP_breg9:                    // 0x79
-       DW_OP_breg10:                   // 0x7a
-       DW_OP_breg11:                   // 0x7b
-       DW_OP_breg12:                   // 0x7c
-       DW_OP_breg13:                   // 0x7d
-       DW_OP_breg14:                   // 0x7e
-       DW_OP_breg15:                   // 0x7f
-       DW_OP_breg16:                   // 0x80
-       DW_OP_breg17:                   // 0x81
-       DW_OP_breg18:                   // 0x82
-       DW_OP_breg19:                   // 0x83
-       DW_OP_breg20:                   // 0x84
-       DW_OP_breg21:                   // 0x85
-       DW_OP_breg22:                   // 0x86
-       DW_OP_breg23:                   // 0x87
-       DW_OP_breg24:                   // 0x88
-       DW_OP_breg25:                   // 0x89
-       DW_OP_breg26:                   // 0x8a
-       DW_OP_breg27:                   // 0x8b
-       DW_OP_breg28:                   // 0x8c
-       DW_OP_breg29:                   // 0x8d
-       DW_OP_breg30:                   // 0x8e
-       DW_OP_breg31:                   // 0x8f
-       DW_OP_regx:                             // 0x90
-       DW_OP_fbreg:                    // 0x91
-       DW_OP_bregx:                    // 0x92
-       DW_OP_piece:                    // 0x93
-       DW_OP_deref_size:               // 0x94
-       DW_OP_xderef_size:              // 0x95
-       DW_OP_nop:                              // 0x96
-       DW_OP_push_object_address:      // 0x97
-       DW_OP_call2:                    // 0x98
-       DW_OP_call4:                    // 0x99
-       DW_OP_call_ref:                 // 0x9a
-       DW_OP_form_tls_address: // 0x9b
-       DW_OP_call_frame_cfa:   // 0x9c
-       DW_OP_bit_piece:                // 0x9d
-       DW_OP_implicit_value:   // 0x9e
-       DW_OP_stack_value:              // 0x9f
-       DW_OP_lo_user:                  // 0xe0
-       DW_OP_hi_user:                  // 0xff
-       DW_OP_GNU_push_tls_address:     // 0xe0
-       DW_OP_GNU_uninit:               // 0xf0
-       DW_OP_GNU_encoded_addr: // 0xf1
-       DW_OP_GNU_implicit_pointer:     // 0xf2
-       DW_OP_GNU_entry_value:  // 0xf3
-       DW_OP_GNU_const_type:   // 0xf4
-       DW_OP_GNU_regval_type:  // 0xf5
-       DW_OP_GNU_deref_type:   // 0xf6
-       DW_OP_GNU_convert:              // 0xf7
-       DW_OP_GNU_reinterpret:  // 0xf9
-       DW_OP_GNU_parameter_ref:        // 0xfa
-       DW_OP_GNU_addr_index:   // 0xfb
-       DW_OP_GNU_const_index:  // 0xfc
-*/
index 35d1ef6..bddf131 100644 (file)
@@ -45,6 +45,15 @@ Comment:
        #define LIBGOBLIN_DWARF_EXPRESSION_EXTERN       extern
 #endif
 
+LIBGOBLIN_DWARF_EXPRESSION_EXTERN
+       void DWARF_Expression_ClearValue( LibGoblin_DWARF_Expression *p_exp );
+LIBGOBLIN_DWARF_EXPRESSION_EXTERN
+       int DWARF_Expression_SetDefaultValue(
+                               LibGoblin_DWARF_Expression *p_exp, LibGoblin_BinaryInfo *p_binfo );
+LIBGOBLIN_DWARF_EXPRESSION_EXTERN
+       DWord DWARF_Expression_Evaluate(
+                               LibGoblin_DWARF_Expression *p_exp, Byte *pb_data, DWord dw_size );
+
 
 #endif /* DRD64_HEADER_LIBGOBLIN_BINFO */
 
index 222a275..250970f 100644 (file)
@@ -262,7 +262,7 @@ int
                        t_ancestry[i_childlv].i_objid   = i_objid;
        
 
-                       Debug_DWARF_PrintDIE( p_binfo, p_abbrev, dw_arvid, i_childlv );
+                       //Debug_DWARF_PrintDIE( p_binfo, p_abbrev, dw_arvid, i_childlv );
 
                        if( 0x00 != p_arvnow->b_children )      {
                                i_childlv++;
index 1f59f1b..fe1cd5a 100644 (file)
@@ -37,6 +37,27 @@ Comment:
 #ifndef DRD64_HEADER_LIBGOBLIN_TYPE_DWARF
 #define DRD64_HEADER_LIBGOBLIN_TYPE_DWARF
 
+/*=====================================================================*/
+#define        LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH  32
+
+#define        LIBGOBLIN_DWARF_STATUS_EVALUATED        0x00
+#define        LIBGOBLIN_DWARF_STATUS_REQUESTED        0x01
+#define        LIBGOBLIN_DWARF_STATUS_ERROR            0x10
+
+#define        LIBGOBLIN_DWARF_DATA_NONE                       0x00
+#define        LIBGOBLIN_DWARF_DATA_ADDRSIZE           0x01
+
+typedef        struct  {
+       DWord   dw_status;
+       DWord   dw_requested;
+       DWord   dw_setdata;
+       QWord   qw_result;
+
+       DWord   dw_addrsize;    // for DW_OP_addr
+
+       //DWord dw_depth;
+       //QWord qw_stack[LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH];
+} LibGoblin_DWARF_Expression;
 
 /*=====================================================================*/
 /*
index 88e3bc6..8b55ce6 100644 (file)
@@ -38,19 +38,100 @@ Comment:
 #include"drd64_libgoblin.h"
 #include"test_libgoblin.h"
 
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+void Test_LibGoblin_DWARF_Expression_CheckStruct(
+                                       LibGoblin_DWARF_Expression *p_exp,
+                                       DWord dw_status, DWord dw_requested, DWord dw_setdata )
+{
+       CU_ASSERT( dw_status == p_exp->dw_status );
+       CU_ASSERT( dw_requested == p_exp->dw_requested );
+       CU_ASSERT( dw_setdata == p_exp->dw_setdata );
+
+       if(( dw_status != p_exp->dw_status )
+                       || ( dw_requested != p_exp->dw_requested )
+                       || ( dw_setdata != p_exp->dw_setdata ))         {
+
+               printf( "  [DEBUG] DWARF Expression: status= %2xh, requested= %2xh,"
+                               " setdata=%2xh, result= %8xh\n",
+                                       p_exp->dw_status, p_exp->dw_requested,
+                                       p_exp->dw_setdata, p_exp->qw_result );
+       }
+
+       return;
+}
+
 
 /* (API) LibGoblin_Init() & Term() ************************************/
 /*--------------------------------------------------------------------*/
-void Test_LibGoblin_DWARF_Expression_test00_001( void )
+void Test_LibGoblin_DWARF_Expression_CheckLitX(
+                                       Byte b_opcode, QWord qw_value )
+{
+       Byte    b_data[2];
+       DWord   dw_result;
+       LibGoblin_DWARF_Expression      t_exp;
+
+       b_data[0]       = b_opcode;
+
+       DWARF_Expression_ClearValue( &t_exp );
+       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 1 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+                               LIBGOBLIN_DWARF_STATUS_EVALUATED,
+                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+       CU_ASSERT( t_exp.qw_result == qw_value );
+
+       return;
+}
+
+/*--------------------------------------------------------------------*/
+void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
 {
        int             i_result;
+       Byte    b_data[64];
+       DWord   dw_size;
+       DWord   dw_result;
+       LibGoblin_DWARF_Expression      t_exp;
 
-/*
-       i_result        = LibGoblin_Init();
-       CU_ASSERT( 0x00 == i_result );
 
-       i_result        = LibGoblin_Term();
-       CU_ASSERT( 0x00 == i_result );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit0,  0 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit1,  1 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit2,  2 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit3,  3 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit4,  4 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit5,  5 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit6,  6 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit7,  7 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit8,  8 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit9,  9 );
+
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit10,10 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit11,11 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit12,12 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit13,13 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit14,14 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit15,15 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit16,16 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit17,17 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit18,18 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit19,19 );
+
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit20,20 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit21,21 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit22,22 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit23,23 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit24,24 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit25,25 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit26,26 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit27,27 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit28,28 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit29,29 );
+
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit30,30 );
+       Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit31,31 );
+
+/*
+       printf( "  [DEBUG] DWARF Expression: status= %2xh, requested= %2xh, setdata=%2xh, result= %8xh\n",
+                       t_exp.dw_status, t_exp.dw_requested, t_exp.dw_setdata, t_exp.qw_result );
 */
 
        return;
@@ -68,8 +149,8 @@ int
 
        pt_goblin       = CU_add_suite( "LibGoblin_DWARF_Expression", NULL, NULL );
 
-       CU_add_test( pt_goblin, "LibGoblin_DWARF_Expression_test00_001",
-                                                                Test_LibGoblin_DWARF_Expression_test00_001 );
+       CU_add_test( pt_goblin, "LibGoblin_DWARF_Expression_Constant_test00_001",
+                                                                Test_LibGoblin_DWARF_Expression_Constant_test00_001 );
 
 
        return 0x00;
@@ -77,3 +158,142 @@ int
 
 
 /* EOF of drd64_.c ----------------------------------- */
+/*
+       DW_OP_addr:                             // 0x03
+       DW_OP_deref:                    // 0x06
+       DW_OP_const1u:                  // 0x08
+       DW_OP_const1s:                  // 0x09
+       DW_OP_const2u:                  // 0x0a
+       DW_OP_const2s:                  // 0x0b
+       DW_OP_const4u:                  // 0x0c
+       DW_OP_const4s:                  // 0x0d
+       DW_OP_const8u:                  // 0x0e
+       DW_OP_const8s:                  // 0x0f
+       DW_OP_constu:                   // 0x10
+       DW_OP_consts:                   // 0x11
+       DW_OP_dup:                              // 0x12
+       DW_OP_drop:                             // 0x13
+       DW_OP_over:                             // 0x14
+       DW_OP_pick:                             // 0x15
+       DW_OP_swap:                             // 0x16
+       DW_OP_rot:                              // 0x17
+       DW_OP_xderef:                   // 0x18
+       DW_OP_abs:                              // 0x19
+       DW_OP_and:                              // 0x1a
+       DW_OP_div:                              // 0x1b
+       DW_OP_minus:                    // 0x1c
+       DW_OP_mod:                              // 0x1d
+       DW_OP_mul:                              // 0x1e
+       DW_OP_neg:                              // 0x1f
+       DW_OP_not:                              // 0x20
+       DW_OP_or:                               // 0x21
+       DW_OP_plus:                             // 0x22
+       DW_OP_plus_uconst:              // 0x23
+       DW_OP_shl:                              // 0x24
+       DW_OP_shr:                              // 0x25
+       DW_OP_shra:                             // 0x26
+       DW_OP_xor:                              // 0x27
+       DW_OP_bra:                              // 0x28
+       DW_OP_eq:                               // 0x29
+       DW_OP_ge:                               // 0x2a
+       DW_OP_gt:                               // 0x2b
+       DW_OP_le:                               // 0x2c
+       DW_OP_lt:                               // 0x2d
+       DW_OP_ne:                               // 0x2e
+       DW_OP_skip:                             // 0x2f
+       DW_OP_reg0:                             // 0x50
+       DW_OP_reg1:                             // 0x51
+       DW_OP_reg2:                             // 0x52
+       DW_OP_reg3:                             // 0x53
+       DW_OP_reg4:                             // 0x54
+       DW_OP_reg5:                             // 0x55
+       DW_OP_reg6:                             // 0x56
+       DW_OP_reg7:                             // 0x57
+       DW_OP_reg8:                             // 0x58
+       DW_OP_reg9:                             // 0x59
+       DW_OP_reg10:                    // 0x5a
+       DW_OP_reg11:                    // 0x5b
+       DW_OP_reg12:                    // 0x5c
+       DW_OP_reg13:                    // 0x5d
+       DW_OP_reg14:                    // 0x5e
+       DW_OP_reg15:                    // 0x5f
+       DW_OP_reg16:                    // 0x60
+       DW_OP_reg17:                    // 0x61
+       DW_OP_reg18:                    // 0x62
+       DW_OP_reg19:                    // 0x63
+       DW_OP_reg20:                    // 0x64
+       DW_OP_reg21:                    // 0x65
+       DW_OP_reg22:                    // 0x66
+       DW_OP_reg23:                    // 0x67
+       DW_OP_reg24:                    // 0x68
+       DW_OP_reg25:                    // 0x69
+       DW_OP_reg26:                    // 0x6a
+       DW_OP_reg27:                    // 0x6b
+       DW_OP_reg28:                    // 0x6c
+       DW_OP_reg29:                    // 0x6d
+       DW_OP_reg30:                    // 0x6e
+       DW_OP_reg31:                    // 0x6f
+       DW_OP_breg0:                    // 0x70
+       DW_OP_breg1:                    // 0x71
+       DW_OP_breg2:                    // 0x72
+       DW_OP_breg3:                    // 0x73
+       DW_OP_breg4:                    // 0x74
+       DW_OP_breg5:                    // 0x75
+       DW_OP_breg6:                    // 0x76
+       DW_OP_breg7:                    // 0x77
+       DW_OP_breg8:                    // 0x78
+       DW_OP_breg9:                    // 0x79
+       DW_OP_breg10:                   // 0x7a
+       DW_OP_breg11:                   // 0x7b
+       DW_OP_breg12:                   // 0x7c
+       DW_OP_breg13:                   // 0x7d
+       DW_OP_breg14:                   // 0x7e
+       DW_OP_breg15:                   // 0x7f
+       DW_OP_breg16:                   // 0x80
+       DW_OP_breg17:                   // 0x81
+       DW_OP_breg18:                   // 0x82
+       DW_OP_breg19:                   // 0x83
+       DW_OP_breg20:                   // 0x84
+       DW_OP_breg21:                   // 0x85
+       DW_OP_breg22:                   // 0x86
+       DW_OP_breg23:                   // 0x87
+       DW_OP_breg24:                   // 0x88
+       DW_OP_breg25:                   // 0x89
+       DW_OP_breg26:                   // 0x8a
+       DW_OP_breg27:                   // 0x8b
+       DW_OP_breg28:                   // 0x8c
+       DW_OP_breg29:                   // 0x8d
+       DW_OP_breg30:                   // 0x8e
+       DW_OP_breg31:                   // 0x8f
+       DW_OP_regx:                             // 0x90
+       DW_OP_fbreg:                    // 0x91
+       DW_OP_bregx:                    // 0x92
+       DW_OP_piece:                    // 0x93
+       DW_OP_deref_size:               // 0x94
+       DW_OP_xderef_size:              // 0x95
+       DW_OP_nop:                              // 0x96
+       DW_OP_push_object_address:      // 0x97
+       DW_OP_call2:                    // 0x98
+       DW_OP_call4:                    // 0x99
+       DW_OP_call_ref:                 // 0x9a
+       DW_OP_form_tls_address: // 0x9b
+       DW_OP_call_frame_cfa:   // 0x9c
+       DW_OP_bit_piece:                // 0x9d
+       DW_OP_implicit_value:   // 0x9e
+       DW_OP_stack_value:              // 0x9f
+       DW_OP_lo_user:                  // 0xe0
+       DW_OP_hi_user:                  // 0xff
+       DW_OP_GNU_push_tls_address:     // 0xe0
+       DW_OP_GNU_uninit:               // 0xf0
+       DW_OP_GNU_encoded_addr: // 0xf1
+       DW_OP_GNU_implicit_pointer:     // 0xf2
+       DW_OP_GNU_entry_value:  // 0xf3
+       DW_OP_GNU_const_type:   // 0xf4
+       DW_OP_GNU_regval_type:  // 0xf5
+       DW_OP_GNU_deref_type:   // 0xf6
+       DW_OP_GNU_convert:              // 0xf7
+       DW_OP_GNU_reinterpret:  // 0xf9
+       DW_OP_GNU_parameter_ref:        // 0xfa
+       DW_OP_GNU_addr_index:   // 0xfb
+       DW_OP_GNU_const_index:  // 0xfc
+*/