diff options
author | Andrey Ponomarenko <aponomarenko@rosalab.ru> | 2013-08-08 19:13:50 +0400 |
---|---|---|
committer | Andrey Ponomarenko <aponomarenko@rosalab.ru> | 2013-08-08 19:13:50 +0400 |
commit | 46b2ff47f52188954b8bd969942438db3103b3b9 (patch) | |
tree | 1da38d1b5d48edc714ce87633e1baf110ac28a27 /abi-dumper.pl | |
parent | abc6fd831676484d49677dd7857625a4b4e8a49a (diff) | |
download | abi-dumper-46b2ff47f52188954b8bd969942438db3103b3b9.tar.gz |
Improved support for Fedora
Diffstat (limited to 'abi-dumper.pl')
-rwxr-xr-x | abi-dumper.pl | 94 |
1 files changed, 56 insertions, 38 deletions
diff --git a/abi-dumper.pl b/abi-dumper.pl index 8998348..6b6734b 100755 --- a/abi-dumper.pl +++ b/abi-dumper.pl @@ -1,6 +1,6 @@ #!/usr/bin/perl ########################################################################### -# ABI Dumper 0.99.4 +# ABI Dumper 0.99.5 # Dump ABI of an ELF object containing DWARF debug info # # Copyright (C) 2013 ROSA Laboratory @@ -43,7 +43,7 @@ use Cwd qw(abs_path cwd realpath); use Storable qw(dclone); use Data::Dumper; -my $TOOL_VERSION = "0.99.4"; +my $TOOL_VERSION = "0.99.5"; my $ABI_DUMP_VERSION = "3.2"; my $ORIG_DIR = cwd(); my $TMP_DIR = tempdir(CLEANUP=>1); @@ -647,7 +647,7 @@ sub read_Alt_Info($) while(<SRC>) { - if( /(\d+)\s+\d+\s+\d+\s+\d+\s+([^ ]+)/) + if(/(\d+)\s+\d+\s+\d+\s+\d+\s+([^ ]+)/) { my ($Num, $File) = ($1, $2); chomp($File); @@ -680,8 +680,14 @@ sub read_Alt_Info($) while(<INFO>) { - - if(/\A \[\s*(\w+?)\](\s+)(\w+)/) + if(index($_, " ")==0) + { + if(defined $ID) { + $ImportedUnit{$ID}{$Num++} = $_; + } + } + elsif(index($_, " [")==0 + and /\A \[\s*(\w+?)\](\s+)(\w+)/) { if($3 eq "partial_unit") { @@ -690,7 +696,7 @@ sub read_Alt_Info($) $ImportedUnit{$ID}{0} = $_; } elsif(length($2)==2) - { + { # not a partial_unit $ID = undef; } elsif(defined $ID) @@ -699,12 +705,6 @@ sub read_Alt_Info($) $ImportedUnit{$ID}{$Num++} = $_; } } - elsif(defined $ID) - { - if(not /\A \w/) { - $ImportedUnit{$ID}{$Num++} = $_; - } - } } } @@ -991,7 +991,12 @@ sub read_DWARF_Dump($$) { if($Val=~/\)\s*\Z/) { # value on the next line - $Val .= <$FH>; + if($Import) { + $Val .= $ImportedUnit{$Import}{$Import_Num} + } + else { + $Val .= <$FH>; + } } if($Val=~/\A\(\w+\)\s*(-?)(\w+)\Z/) @@ -1090,7 +1095,7 @@ sub read_DWARF_Dump($$) } } } - elsif($Line=~/\A\s{0,4}\[\s*(\w+)\](\s*)(\w+)/) + elsif($Line=~/\A \[\s*(\w+)\](\s*)(\w+)/) { $ID = hex($1); $NS = $2; @@ -2199,38 +2204,47 @@ sub getTypeInfo($) $DWARF_Info{$ID}{"name"} = $DWARF_Info{$Spec}{"name"}; } - if(my $Name = $DWARF_Info{$ID}{"name"}) + my $NS = $NameSpace{$ID}; + if(not $NS) { - $TInfo{"Name"} = $Name; - - my $NS = $NameSpace{$ID}; - if(not $NS) - { - if(my $Sp = $DWARF_Info{$ID}{"specification"}) { - $NS = $NameSpace{$Sp}; - } + if(my $Sp = $DWARF_Info{$ID}{"specification"}) { + $NS = $NameSpace{$Sp}; } - - if($NS) + } + + if($NS) + { + if($DWARF_Info{$NS}{"Kind"} eq "namespace") { - if($DWARF_Info{$NS}{"Kind"} eq "namespace") + if(my $NS_F = completeNS($ID)) { - if(my $NS_F = completeNS($ID)) - { - $TInfo{"NameSpace"} = $NS_F; - $TInfo{"Name"} = $TInfo{"NameSpace"}."::".$TInfo{"Name"}; - } + $TInfo{"NameSpace"} = $NS_F; } - elsif($DWARF_Info{$NS}{"Kind"} eq "class_type" - or $DWARF_Info{$NS}{"Kind"} eq "structure_type") - { # class - getTypeInfo($NS); - + } + elsif($DWARF_Info{$NS}{"Kind"} eq "class_type" + or $DWARF_Info{$NS}{"Kind"} eq "structure_type") + { # class + getTypeInfo($NS); + + if(my $Sp = $SpecElem{$NS}) { + getTypeInfo($Sp); + } + + if($TypeInfo{$NS}{"Name"}) + { $TInfo{"NameSpace"} = $TypeInfo{$NS}{"Name"}; $TInfo{"NameSpace"}=~s/\Astruct //; - $TInfo{"Name"} = $TInfo{"NameSpace"}."::".$TInfo{"Name"}; } } + } + + if(my $Name = $DWARF_Info{$ID}{"name"}) + { + $TInfo{"Name"} = $Name; + + if($TInfo{"NameSpace"}) { + $TInfo{"Name"} = $TInfo{"NameSpace"}."::".$TInfo{"Name"}; + } if($TInfo{"Type"}=~/\A(Struct|Class)\Z/) { @@ -2470,6 +2484,10 @@ sub getTypeInfo($) elsif($TInfo{"Source"}) { $TInfo{"Name"} = "anon-".lc($TInfo{"Type"})."-".$TInfo{"Source"}."-".$TInfo{"SourceLine"}; } + + if($TInfo{"Name"} and $TInfo{"NameSpace"}) { + $TInfo{"Name"} = $TInfo{"NameSpace"}."::".$TInfo{"Name"}; + } } } @@ -3950,7 +3968,7 @@ sub scenario() my $AltObj = $AltObj_R; - while($AltObj=~s/\/[^\/]+\/..\//\//g){}; + while($AltObj=~s/\/[^\/]+\/\.\.\//\//){}; if(-e $AltObj) { |