aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Ponomarenko <aponomarenko@rosalab.ru>2015-10-13 00:08:59 +0300
committerAndrey Ponomarenko <aponomarenko@rosalab.ru>2015-10-13 00:08:59 +0300
commit1fbbce64f39fad73a23b246b94e958108cb0ae36 (patch)
tree7351cd8c0d95ff6f14434722233eaf500a681d5a
parent15bfdc281d18ec26a6a056ed45d641a885716165 (diff)
downloadabi-compliance-checker-1fbbce64f39fad73a23b246b94e958108cb0ae36.tar.gz
Added -skip-internal-types option. Fixed Makefile. Fixed Type_Became_Opaque, Parameter_Changed_Register, Parameter_From_Register and Parameter_To_Register rules. Added more metadata to the report. Fixed -headers-list option. Option -skip-internal renamed to -skip-internal-symbols. Fixed false positives if vtable-dumper generates incomplete data.
-rw-r--r--INSTALL4
-rw-r--r--Makefile1
-rw-r--r--[-rwxr-xr-x]abi-compliance-checker.pl135
-rw-r--r--modules/Internals/CallConv.pm13
4 files changed, 109 insertions, 44 deletions
diff --git a/INSTALL b/INSTALL
index 7253cf5..3460b6b 100644
--- a/INSTALL
+++ b/INSTALL
@@ -9,8 +9,8 @@ All rights reserved.
RELEASE INFORMATION
Project: ABI Compliance Checker (ACC)
-Version: 1.99.12
-Date: 2015-09-20
+Version: 1.99.13
+Date: 2015-10-12
This file explains how to install and setup environment
diff --git a/Makefile b/Makefile
index 0464293..55c2793 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,6 @@
prefix ?= /usr
+.PHONY: install
install:
perl Makefile.pl -install -prefix "$(prefix)"
diff --git a/abi-compliance-checker.pl b/abi-compliance-checker.pl
index 779b9af..2c96b85 100755..100644
--- a/abi-compliance-checker.pl
+++ b/abi-compliance-checker.pl
@@ -1,6 +1,6 @@
#!/usr/bin/perl
###########################################################################
-# ABI Compliance Checker (ABICC) 1.99.12
+# ABI Compliance Checker (ABICC) 1.99.13
# A tool for checking backward compatibility of a C/C++ library API
#
# Copyright (C) 2009-2011 Institute for System Programming, RAS
@@ -64,7 +64,7 @@ use Storable qw(dclone);
use Data::Dumper;
use Config;
-my $TOOL_VERSION = "1.99.12";
+my $TOOL_VERSION = "1.99.13";
my $ABI_DUMP_VERSION = "3.2";
my $XML_REPORT_VERSION = "1.2";
my $XML_ABI_DUMP_VERSION = "1.2";
@@ -93,8 +93,9 @@ $SkipHeadersPath, $CppCompat, $LogMode, $StdOut, $ListAffected, $ReportFormat,
$UserLang, $TargetHeadersPath, $BinaryOnly, $SourceOnly, $BinaryReportPath,
$SourceReportPath, $UseXML, $SortDump, $DumpFormat,
$ExtraInfo, $ExtraDump, $Force, $Tolerance, $Tolerant, $SkipSymbolsListPath,
-$CheckInfo, $Quick, $AffectLimit, $AllAffected, $CppIncompat, $SkipInternal,
-$TargetArch, $GccOptions, $TypesListPath);
+$CheckInfo, $Quick, $AffectLimit, $AllAffected, $CppIncompat,
+$SkipInternalSymbols, $SkipInternalTypes, $TargetArch, $GccOptions,
+$TypesListPath);
my $CmdName = get_filename($0);
my %OS_LibExt = (
@@ -252,7 +253,8 @@ GetOptions("h|help!" => \$Help,
"check!" => \$CheckInfo,
"quick!" => \$Quick,
"all-affected!" => \$AllAffected,
- "skip-internal=s" => \$SkipInternal
+ "skip-internal-symbols|skip-internal=s" => \$SkipInternalSymbols,
+ "skip-internal-types=s" => \$SkipInternalTypes,
) or ERR_MESSAGE();
sub ERR_MESSAGE()
@@ -746,8 +748,11 @@ OTHER OPTIONS:
-quick
Quick analysis. Disable check of some template instances.
- -skip-internal PATTERN
- Do not check internal interfaces matched by the pattern.
+ -skip-internal-symbols PATTERN
+ Do not check symbols matched by the pattern.
+
+ -skip-internal-types PATTERN
+ Do not check types matched by the pattern.
REPORT:
Compatibility report will be generated to:
@@ -9775,6 +9780,14 @@ sub isTargetType($$)
}
}
+ if($SkipInternalTypes)
+ {
+ if($TypeInfo{$LibVersion}{$Tid}{"Name"}=~/($SkipInternalTypes)/)
+ {
+ return 0;
+ }
+ }
+
return 1;
}
@@ -10439,6 +10452,12 @@ sub cmpVTables_Real($$)
$Entry1 = simpleVEntry($Entry1);
$Entry2 = simpleVEntry($Entry2);
+
+ if($Entry1=~/ 0x/ and $Entry2=~/ 0x/)
+ { # NOTE: problem with vtable-dumper
+ next;
+ }
+
if($Entry1 ne $Entry2)
{ # register as changed
if($Entry1=~/::([^:]+)\Z/)
@@ -11398,9 +11417,13 @@ sub mergeTypes($$$)
{
if(isOpaque(\%Type2_Pure) and not isOpaque(\%Type1_Pure))
{
- %{$SubProblems{"Type_Became_Opaque"}{$Type1_Pure{"Name"}}}=(
- "Target"=>$Type1_Pure{"Name"},
- "Type_Name"=>$Type1_Pure{"Name"} );
+ if(not defined $UsedDump{1}{"DWARF"}
+ and not defined $UsedDump{2}{"DWARF"})
+ {
+ %{$SubProblems{"Type_Became_Opaque"}{$Type1_Pure{"Name"}}}=(
+ "Target"=>$Type1_Pure{"Name"},
+ "Type_Name"=>$Type1_Pure{"Name"} );
+ }
return ($Cache{"mergeTypes"}{$Level}{$Type1_Id}{$Type2_Id} = \%SubProblems);
}
@@ -11424,11 +11447,8 @@ sub mergeTypes($$$)
return {} if($SkipTypes{1}{$Type1_Pure{"Name"}});
return {} if($SkipTypes{1}{$Type1{"Name"}});
- if(defined $TargetHeadersPath)
- {
- if(not isTargetType($Type1_Pure{"Tid"}, 1)) {
- return {};
- }
+ if(not isTargetType($Type1_Pure{"Tid"}, 1)) {
+ return {};
}
if($Type1_Pure{"Type"}=~/Class|Struct/ and $Type2_Pure{"Type"}=~/Class|Struct/)
@@ -12404,9 +12424,9 @@ sub symbolFilter($$$$)
return 0;
}
- if(defined $SkipInternal)
+ if(defined $SkipInternalSymbols)
{
- return 0 if($Symbol=~/($SkipInternal)/);
+ return 0 if($Symbol=~/($SkipInternalSymbols)/);
}
if($Symbol=~/\A_Z/)
@@ -12454,6 +12474,13 @@ sub symbolFilter($$$$)
my $ClassId = $CompleteSignature{$LibVersion}{$Symbol}{"Class"};
+ if($ClassId)
+ {
+ if(not isTargetType($ClassId, $LibVersion)) {
+ return 0;
+ }
+ }
+
my $NameSpace = $CompleteSignature{$LibVersion}{$Symbol}{"NameSpace"};
if(not $NameSpace and $ClassId)
{ # class methods have no "NameSpace" attribute
@@ -13977,6 +14004,12 @@ sub getRegs($$$)
return join(", ", sort keys(%Regs));
}
+ elsif(defined $CompleteSignature{$LibVersion}{$Symbol}{"Param"}
+ and defined $CompleteSignature{$LibVersion}{$Symbol}{"Param"}{0}
+ and not defined $CompleteSignature{$LibVersion}{$Symbol}{"Param"}{0}{"offset"})
+ {
+ return "unknown";
+ }
return undef;
}
@@ -14040,31 +14073,37 @@ sub mergeParameters($$$$$$)
{
my $Old_Regs = getRegs(1, $Symbol, $ParamPos1);
my $New_Regs = getRegs(2, $PSymbol, $ParamPos2);
- if($Old_Regs and $New_Regs)
+
+ if($Old_Regs ne "unknown"
+ and $New_Regs ne "unknown")
{
- if($Old_Regs ne $New_Regs)
+ if($Old_Regs and $New_Regs)
+ {
+ if($Old_Regs ne $New_Regs)
+ {
+ %{$CompatProblems{$Level}{$Symbol}{"Parameter_Changed_Register"}{$Parameter_Location}}=(
+ "Target"=>$PName1,
+ "Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1),
+ "Old_Value"=>$Old_Regs,
+ "New_Value"=>$New_Regs );
+ }
+ }
+ elsif($Old_Regs and not $New_Regs)
{
- %{$CompatProblems{$Level}{$Symbol}{"Parameter_Changed_Register"}{$Parameter_Location}}=(
+ %{$CompatProblems{$Level}{$Symbol}{"Parameter_From_Register"}{$Parameter_Location}}=(
+ "Target"=>$PName1,
+ "Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1),
+ "Old_Value"=>$Old_Regs );
+ }
+ elsif(not $Old_Regs and $New_Regs)
+ {
+ %{$CompatProblems{$Level}{$Symbol}{"Parameter_To_Register"}{$Parameter_Location}}=(
"Target"=>$PName1,
"Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1),
- "Old_Value"=>$Old_Regs,
"New_Value"=>$New_Regs );
}
}
- elsif($Old_Regs and not $New_Regs)
- {
- %{$CompatProblems{$Level}{$Symbol}{"Parameter_From_Register"}{$Parameter_Location}}=(
- "Target"=>$PName1,
- "Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1),
- "Old_Value"=>$Old_Regs );
- }
- elsif(not $Old_Regs and $New_Regs)
- {
- %{$CompatProblems{$Level}{$Symbol}{"Parameter_To_Register"}{$Parameter_Location}}=(
- "Target"=>$PName1,
- "Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1),
- "New_Value"=>$New_Regs );
- }
+
if((my $Old_Offset = $CompleteSignature{1}{$Symbol}{"Param"}{$ParamPos1}{"offset"}) ne ""
and (my $New_Offset = $CompleteSignature{2}{$PSymbol}{"Param"}{$ParamPos2}{"offset"}) ne "")
{
@@ -14292,7 +14331,8 @@ sub mergeParameters($$$$$$)
}
}
}
- else
+ elsif($Conv1{"Method"} ne "unknown"
+ and $Conv2{"Method"} ne "unknown")
{
if($Conv1{"Method"} eq "stack") {
$NewProblemType = "Parameter_Type_From_Stack_To_Register";
@@ -15283,7 +15323,7 @@ sub getArch($)
return $TargetArch;
}
elsif($CPU_ARCH{$LibVersion})
- { # dump version
+ { # dump
return $CPU_ARCH{$LibVersion};
}
elsif($UsedDump{$LibVersion}{"V"})
@@ -15366,6 +15406,7 @@ sub get_CheckedHeaders($)
foreach my $Path (keys(%{$Registered_Headers{$LibVersion}}))
{
my $File = get_filename($Path);
+
if(not is_target_header($File, $LibVersion)) {
next;
}
@@ -15951,18 +15992,21 @@ sub get_Summary($)
{
my $TS_Link = "<a href='#".get_Anchor("Type", $Level, "Safe")."' style='color:Blue;'>$T_Other</a>";
$Problem_Summary .= "<tr><th>Other Changes<br/>in Data Types</th><td>-</td><td".getStyle("T", "S", $T_Other).">$TS_Link</td></tr>\n";
+ $META_DATA .= "type_changes_other:$T_Other;";
}
if($I_Other)
{
my $IS_Link = "<a href='#".get_Anchor("Symbol", $Level, "Safe")."' style='color:Blue;'>$I_Other</a>";
$Problem_Summary .= "<tr><th>Other Changes<br/>in Symbols</th><td>-</td><td".getStyle("I", "S", $I_Other).">$IS_Link</td></tr>\n";
+ $META_DATA .= "interface_changes_other:$I_Other;";
}
if($C_Other)
{
my $CS_Link = "<a href='#".get_Anchor("Constant", $Level, "Safe")."' style='color:Blue;'>$C_Other</a>";
$Problem_Summary .= "<tr><th>Other Changes<br/>in Constants</th><td>-</td><td".getStyle("C", "S", $C_Other).">$CS_Link</td></tr>\n";
+ $META_DATA .= "constant_changes_other:$C_Other;";
}
$META_DATA .= "tool_version:$TOOL_VERSION";
@@ -22291,6 +22335,15 @@ sub scenario()
$COMMON_LOG_PATH = $LoggingPath;
}
}
+
+ if($SkipInternalSymbols) {
+ $SkipInternalSymbols=~s/\*/.*/g;
+ }
+
+ if($SkipInternalTypes) {
+ $SkipInternalTypes=~s/\*/.*/g;
+ }
+
if($Quick) {
$ADD_TMPL_INSTANCES = 0;
}
@@ -22437,14 +22490,14 @@ sub scenario()
}
foreach my $Header (split(/\s*\n\s*/, readFile($TargetHeadersPath)))
{
- $TargetHeaders{1}{$Header} = 1;
- $TargetHeaders{2}{$Header} = 1;
+ $TargetHeaders{1}{get_filename($Header)} = 1;
+ $TargetHeaders{2}{get_filename($Header)} = 1;
}
}
if($TargetHeader)
{ # --header
- $TargetHeaders{1}{$TargetHeader} = 1;
- $TargetHeaders{2}{$TargetHeader} = 1;
+ $TargetHeaders{1}{get_filename($TargetHeader)} = 1;
+ $TargetHeaders{2}{get_filename($TargetHeader)} = 1;
}
if($TestTool
or $TestDump)
diff --git a/modules/Internals/CallConv.pm b/modules/Internals/CallConv.pm
index ebab672..98b86dc 100644
--- a/modules/Internals/CallConv.pm
+++ b/modules/Internals/CallConv.pm
@@ -1307,9 +1307,20 @@ sub callingConvention_P_Real($$)
$Conv{"Method"} = "reg";
$Conv{"Registers"} = join(", ", @R);
}
- else {
+ else
+ {
$Conv{"Method"} = "stack";
+
+ if(defined $SInfo->{"Param"}
+ and defined $SInfo->{"Param"}{0})
+ {
+ if(not defined $SInfo->{"Param"}{0}{"offset"})
+ {
+ $Conv{"Method"} = "unknown";
+ }
+ }
}
+
return %Conv;
}