static void dump_ref( const uint_8 *input, uint length ) /******************************************************/ { const uint_8 *p; uint_8 op_code; uint_32 tmp; int_32 itmp; uint_32 unit_length; const uint_8 *unit_base; ref_info registers = { { 0, 0, NULL }, 0L, 1L, 1L, 1 }; p = input; while( p - input < length ) { unit_length = get_u32( (uint_32 *)p ); p += sizeof( uint_32 ); unit_base = p; Wdputs( "total_length: " ); Puthex( get_u32( (uint_32 *)p ), 8 ); Wdputslc( "\n" ); while( p - unit_base < unit_length ) { op_code = *p++; if( op_code < REF_CODE_BASE ) { get_reference_op( op_code ); switch( op_code ) { case REF_BEGIN_SCOPE: Puthex( get_u32( (uint_32 *)p ), 8 ); ScopePush( ®isters.scope, get_u32( (uint_32 *)p ) ); p += sizeof( uint_32 ); break; case REF_END_SCOPE: ScopePop( ®isters.scope ); break; case REF_COPY: Wdputs( " " ); PutRefRegisters( ®isters ); break; case REF_SET_FILE: p = DecodeULEB128( p, &tmp ); Putdec( tmp ); registers.file = tmp; break; case REF_SET_LINE: p = DecodeULEB128( p, &tmp ); Putdec( tmp ); registers.line = tmp; registers.column = 0; break; case REF_SET_COLUMN: p = DecodeULEB128( p, &tmp ); Putdec( tmp ); registers.column = tmp; break; case REF_ADD_LINE: p = DecodeSLEB128( p, &itmp ); Putdecs( itmp ); registers.line += itmp; break; case REF_ADD_COLUMN: p = DecodeULEB128( p, &tmp ); Putdec( tmp ); registers.column += tmp; break; } } else { op_code -= REF_CODE_BASE; Wdputs( "REF line += " ); Putdec( op_code / REF_COLUMN_RANGE ); registers.line += op_code / REF_COLUMN_RANGE; Wdputs( ", column += " ); Putdec( op_code % REF_COLUMN_RANGE ); registers.column += op_code % REF_COLUMN_RANGE; Wdputs( ", " ); Puthex( get_u32( (uint_32 *)p ), 8 ); registers.dependent = get_u32( (uint_32 *)p ); Wdputs( " " ); PutRefRegisters( ®isters ); p += sizeof( uint_32 ); } Wdputslc( "\n" ); } } }
static void References( ReferWhich which, dr_handle entry, void *data1, hook_func do_callback, void *data2, DRSYMREF callback ) /*********************************************************************/ { dr_handle loc; dr_handle end; dr_handle owning_node; dr_handle infoOffset; unsigned_8 opcode; dr_ref_info registers = { { 0, 0, NULL }, 0L, NULL, 1L, 1 }; bool quit = FALSE; bool inScope = FALSE; loc = DWRCurrNode->sections[ DR_DEBUG_REF ].base; end = loc + DWRCurrNode->sections[ DR_DEBUG_REF ].size; infoOffset = DWRCurrNode->sections[ DR_DEBUG_INFO ].base; loc += sizeof( unsigned_32 ); /* skip size */ while( loc < end && !quit ) { opcode = DWRVMReadByte( loc ); loc += sizeof( unsigned_8 ); switch( opcode ) { case REF_BEGIN_SCOPE: owning_node = DWRVMReadDWord( loc ) + infoOffset; loc += sizeof( unsigned_32 ); ScopePush( ®isters.scope, owning_node ); if( (which & REFERSTO) != 0 && owning_node == entry ) { inScope = TRUE; } break; case REF_END_SCOPE: ScopePop( ®isters.scope ); inScope = FALSE; break; case REF_SET_FILE: registers.file = DWRFindFileName( DWRVMReadULEB128( &loc ), infoOffset ); break; case REF_SET_LINE: registers.line = DWRVMReadULEB128( &loc ); break; case REF_SET_COLUMN: registers.column = (unsigned_8)DWRVMReadULEB128( &loc ); break; case REF_ADD_LINE: registers.line += DWRVMReadSLEB128( &loc ); registers.column = 0; break; case REF_ADD_COLUMN: registers.column += (signed_8)DWRVMReadSLEB128( &loc ); break; case REF_COPY: default: if( opcode >= REF_CODE_BASE ) { unsigned_32 ld; opcode -= REF_CODE_BASE; ld = opcode / REF_COLUMN_RANGE; if( ld != 0 ) { registers.column = 0; registers.line += ld; } registers.column += opcode % REF_COLUMN_RANGE; registers.dependent = DWRVMReadDWord( loc ) + infoOffset; loc += sizeof( unsigned_32 ); } quit = FALSE; /* don't terminate */ if( do_callback( ®isters, data1 ) || inScope ) { char *name = NULL; owning_node = ScopeLastNameable( ®isters.scope, &name ); /* make sure that there is something nameable on the stack */ if( owning_node != DR_HANDLE_NUL ) { quit = !callback( owning_node, ®isters, name, data2 ); } } break; } } DWRFREE( registers.scope.stack ); }