Update the handle many of the packets that our current LLDB debugserver

handles. Also fixed a case where the packet wouldn't be dumped if it returned
the unimplemented packet.

llvm-svn: 132498
This commit is contained in:
Greg Clayton 2011-06-02 22:21:38 +00:00
parent 0ddfbe230f
commit 8672996e4d
1 changed files with 92 additions and 44 deletions

View File

@ -5,7 +5,7 @@ use strict;
#----------------------------------------------------------------------
# Globals
#----------------------------------------------------------------------
our $unsupported_str = "UNSUPPORTED";
our $unimplemented_str = "UNIMPLEMENTED";
our $success_str = "OK";
our $swap = 1;
our $addr_size = 4;
@ -429,7 +429,14 @@ our $registers_aref = undef;
if (length($opt_r))
{
$registers_aref = $reg_map{$opt_r};
if (exists $reg_map{$opt_r})
{
$registers_aref = $reg_map{$opt_r};
}
else
{
die "Can't get registers group for '$opt_r'\n";
}
}
sub extract_key_value_pairs
@ -656,6 +663,7 @@ sub dump_set_thread_rsp
# 'q' command
#----------------------------------------------------------------------
our $gen_query_cmd;
our $qRegisterInfo_reg_num = -1;
sub dump_general_query_cmd
{
$gen_query_cmd = join('',@_);
@ -711,10 +719,9 @@ sub dump_general_query_cmd
elsif (index($gen_query_cmd, 'qRegisterInfo') == 0)
{
@_ = splice(@_, length('qRegisterInfo'));
my $reg = get_hex(\@_);
$reg == 0 and $registers_aref = [];
printf "get_dynamic_register_info ($reg)";
$qRegisterInfo_reg_num = get_hex(\@_);
printf "get_dynamic_register_info ($qRegisterInfo_reg_num)";
}
else
{
@ -729,40 +736,49 @@ sub dump_general_query_cmd
sub dump_general_query_rsp
{
my $gen_query_rsp = join('',@_);
my $gen_query_rsp_len = length ($gen_query_rsp);
if ($gen_query_cmd eq 'qC' and index($gen_query_rsp, 'QC') == 0)
{
shift @_; shift @_;
my $pid = get_hex(\@_);
printf("get_current_pid () => $pid_format\n", $pid);
printf("pid = $pid_format\n", $pid);
return;
}
elsif (index($gen_query_cmd, 'qRegisterInfo') == 0)
{
if (index($gen_query_rsp, 'name') == 0)
if ($gen_query_rsp_len == 0)
{
my @name_and_values = split (/;/, $gen_query_rsp);
my $reg_name = undef;
my $byte_size = 0;
foreach (@name_and_values)
{
my ($name, $value) = split /:/;
if ($name eq "name") { $reg_name = $value; }
elsif ($name eq "bitsize") { $byte_size = $value / 8; last; }
}
if (defined $reg_name and $byte_size > 0)
{
if ($byte_size == 4) {push @$registers_aref, { name => $reg_name, info => $reg32_href };}
elsif ($byte_size == 8) {push @$registers_aref, { name => $reg_name, info => $reg64_href };}
elsif ($byte_size == 10) {push @$registers_aref, { name => $reg_name, info => $reg80_href };}
elsif ($byte_size == 12) {push @$registers_aref, { name => $reg_name, info => $float96_href };}
elsif ($byte_size == 16) {push @$registers_aref, { name => $reg_name, info => $reg128_href };}
}
print "$unimplemented_str\n";
}
else
{
calculate_max_register_name_length();
if (index($gen_query_rsp, 'name') == 0)
{
$qRegisterInfo_reg_num == 0 and $registers_aref = [];
my @name_and_values = split (/;/, $gen_query_rsp);
my $reg_name = undef;
my $byte_size = 0;
foreach (@name_and_values)
{
my ($name, $value) = split /:/;
if ($name eq "name") { $reg_name = $value; }
elsif ($name eq "bitsize") { $byte_size = $value / 8; last; }
}
if (defined $reg_name and $byte_size > 0)
{
if ($byte_size == 4) {push @$registers_aref, { name => $reg_name, info => $reg32_href };}
elsif ($byte_size == 8) {push @$registers_aref, { name => $reg_name, info => $reg64_href };}
elsif ($byte_size == 10) {push @$registers_aref, { name => $reg_name, info => $reg80_href };}
elsif ($byte_size == 12) {push @$registers_aref, { name => $reg_name, info => $float96_href };}
elsif ($byte_size == 16) {push @$registers_aref, { name => $reg_name, info => $reg128_href };}
}
}
elsif ($gen_query_rsp_len == 3 and index($gen_query_rsp, 'E') == 0)
{
calculate_max_register_name_length();
}
}
}
elsif ($gen_query_cmd =~ 'qThreadStopInfo')
@ -803,6 +819,21 @@ sub dump_general_set_cmd
# packet payload size supported by gdb
printf("SetMaxPayloadSize ( 0x%x (%u))", $max_payload_size, $max_payload_size);
}
elsif (index ($gen_query_cmd, 'QSetSTDIN:') == 0)
{
@_ = splice(@_, length('QSetSTDIN:'));
printf ("SetSTDIN (path ='%s')\n", get_hex_string (\@_));
}
elsif (index ($gen_query_cmd, 'QSetSTDOUT:') == 0)
{
@_ = splice(@_, length('QSetSTDOUT:'));
printf ("SetSTDOUT (path ='%s')\n", get_hex_string (\@_));
}
elsif (index ($gen_query_cmd, 'QSetSTDERR:') == 0)
{
@_ = splice(@_, length('QSetSTDERR:'));
printf ("SetSTDERR (path ='%s')\n", get_hex_string (\@_));
}
else
{
print $gen_query_cmd;
@ -909,7 +940,6 @@ sub dump_allocate_memory_rsp
}
}
#----------------------------------------------------------------------
# '_m' - deallocate memory command (LLDB extension)
#
@ -934,15 +964,17 @@ sub dump_deallocate_memory_cmd
sub dump_read_single_register_cmd
{
my $cmd = shift;
$reg_cmd_reg = get_hex(\@_);
my $reg_num = get_hex(\@_);
my $thread = get_thread_from_thread_suffix (\@_);
my $reg_href = $$registers_aref[$reg_num];
if (defined $thread)
{
print "read_register ( reg = \"$$registers_aref[$reg_cmd_reg]->{name}\", thread = $thread )\n";
print "read_register ( reg = \"$reg_href->{name}\", thread = $thread )\n";
}
else
{
print "read_register ( reg = \"$$registers_aref[$reg_cmd_reg]->{name}\" )\n";
print "read_register ( reg = \"$reg_href->{name}\" )\n";
}
}
@ -1207,9 +1239,6 @@ sub dump_extended_rsp
#----------------------------------------------------------------------
sub dump_attach_wait_command
{
# print "dump_extended_continue_cmd ( ";
# dump_chars(@_);
# print " )\n";
print "attach_wait ( ";
while (@_)
{
@ -1224,9 +1253,6 @@ sub dump_attach_wait_command
#----------------------------------------------------------------------
sub dump_extended_continue_cmd
{
# print "dump_extended_continue_cmd ( ";
# dump_chars(@_);
# print " )\n";
print "extended_continue ( ";
my $cmd = shift;
if ($cmd eq '?')
@ -1293,7 +1319,14 @@ sub dump_extended_continue_cmd
#----------------------------------------------------------------------
sub dump_extended_continue_rsp
{
print "extended_continue ( " . join('',@_) . " )\n";
if (scalar(@_) == 0)
{
print "$unimplemented_str\n";
}
else
{
print "extended_continue supports " . join('',@_) . "\n";
}
}
#----------------------------------------------------------------------
@ -1618,6 +1651,20 @@ sub get_addr
get_hex(shift);
}
sub get_hex_string
{
my $arrayref = shift;
my $str = '';
while ($$arrayref[0] =~ /[0-9a-fA-F]/ and $$arrayref[1] =~ /[0-9a-fA-F]/)
{
my $hi_nibble = hex(shift(@$arrayref));
my $lo_nibble = hex(shift(@$arrayref));
my $byte = ($hi_nibble << 4) | $lo_nibble;
$str .= chr($byte);
}
return $str;
}
sub dump_stop_reply_data
{
while ($#_ >= 0)
@ -1731,9 +1778,10 @@ sub dump_standard_response
{
my $cmd_aref = shift;
if (@$cmd_aref == 0)
my $cmd_len = scalar(@$cmd_aref);
if ($cmd_len == 0)
{
print "$unsupported_str\n";
print "$unimplemented_str\n";
return 1;
}
@ -1744,7 +1792,7 @@ sub dump_standard_response
return 1;
}
if (index($response, 'E') == 0)
if ($cmd_len == 3 and index($response, 'E') == 0)
{
print "ERROR: " . substr($response, 1) . "\n";
return 1;
@ -1800,7 +1848,7 @@ sub dump_command
{
if (rsp_is_unsupported(@cmd_chars))
{
print "$unsupported_str\n";
print "$unimplemented_str\n";
return;
}
elsif (rsp_is_OK(@cmd_chars))
@ -1928,7 +1976,7 @@ sub process_log_line
}
elsif ($line =~ /read packet: (.*)/)
{
if ($1 =~ /\$([^#]+)#[0-9a-fA-F]{2}/)
if ($1 =~ /\$([^#]*)#[0-9a-fA-F]{2}/)
{
$opt_g and print "response: $1\n";
my @raw_rsp_bytes = split(/ */, $1);