ABI Compliance Checker 1.97.7
diff --git a/abi-compliance-checker.pl b/abi-compliance-checker.pl
old mode 100644
new mode 100755
index ec636db..bfcb916
--- a/abi-compliance-checker.pl
+++ b/abi-compliance-checker.pl
@@ -1,6 +1,6 @@
#!/usr/bin/perl
###########################################################################
-# ABI Compliance Checker (ACC) 1.97.6
+# ABI Compliance Checker (ACC) 1.97.7
# A tool for checking backward compatibility of a C/C++ library API
#
# Copyright (C) 2009-2010 The Linux Foundation
@@ -55,8 +55,8 @@
use Data::Dumper;
use Config;
-my $TOOL_VERSION = "1.97.6";
-my $ABI_DUMP_VERSION = "2.15";
+my $TOOL_VERSION = "1.97.7";
+my $ABI_DUMP_VERSION = "2.16";
my $OLDEST_SUPPORTED_VERSION = "1.18";
my $XML_REPORT_VERSION = "1.0";
my $OSgroup = get_OSgroup();
@@ -2029,9 +2029,9 @@
$Typedef_Eq{$Version}{$Base} = $Translations[0];
}
}
- foreach my $Tid (keys(%{$TypeInfo{$Version}}))
+ foreach my $TypeId (keys(%{$TypeInfo{$Version}}))
{
- my $TypeName = $TypeInfo{$Version}{$Tid}{"Name"};
+ my $TypeName = $TypeInfo{$Version}{$TypeId}{"Name"};
if(not $TypeName) {
next;
}
@@ -2049,19 +2049,19 @@
my $Typedef = $Typedef_Eq{$Version}{$Base};
$TypeName=~s/(\<|\,)\Q$Base\E(\W|\Z)/$1$Typedef$2/g;
$TypeName=~s/(\<|\,)\Q$Base\E(\w|\Z)/$1$Typedef $2/g;
- if(defined $TypeInfo{$Version}{$Tid}{"TParam"})
+ if(defined $TypeInfo{$Version}{$TypeId}{"TParam"})
{
- foreach my $TPos (keys(%{$TypeInfo{$Version}{$Tid}{"TParam"}}))
+ foreach my $TPos (keys(%{$TypeInfo{$Version}{$TypeId}{"TParam"}}))
{
- my $TPName = $TypeInfo{$Version}{$Tid}{"TParam"}{$TPos}{"name"};
+ my $TPName = $TypeInfo{$Version}{$TypeId}{"TParam"}{$TPos}{"name"};
$TPName=~s/\A\Q$Base\E(\W|\Z)/$Typedef$1/g;
- $TypeInfo{$Version}{$Tid}{"TParam"}{$TPos}{"name"} = formatName($TPName);
+ $TypeInfo{$Version}{$TypeId}{"TParam"}{$TPos}{"name"} = formatName($TPName);
}
}
}
$TypeName = formatName($TypeName);
- $TypeInfo{$Version}{$Tid}{"Name"} = $TypeName;
- $TName_Tid{$Version}{$TypeName} = $Tid;
+ $TypeInfo{$Version}{$TypeId}{"Name"} = $TypeName;
+ $TName_Tid{$Version}{$TypeName} = $TypeId;
}
}
@@ -2213,6 +2213,7 @@
}
}
}
+ my %AddTypes = ();
foreach my $Tid (keys(%{$MissedTypes{$Version}}))
{ # add missed typedefs
my @Missed = keys(%{$MissedTypes{$Version}{$Tid}});
@@ -2221,6 +2222,10 @@
}
my $MissedTDid = $Missed[0];
my ($TypedefName, $TypedefNS) = getTrivialName($MissedTDid, $Tid);
+ if(not $TypedefName) {
+ next;
+ }
+ $MAX_ID++;
my %MissedInfo = ( # typedef info
"Name" => $TypedefName,
"NameSpace" => $TypedefNS,
@@ -2228,18 +2233,15 @@
"Tid" => $Tid
},
"Type" => "Typedef",
- "Tid" => ++$MAX_ID );
+ "Tid" => "$MAX_ID" );
my ($H, $L) = getLocation($MissedTDid);
$MissedInfo{"Header"} = $H;
$MissedInfo{"Line"} = $L;
- # $MissedInfo{"Size"} = getSize($Tid)/$BYTE_SIZE;
- my $MName = $MissedInfo{"Name"};
- next if(not $MName);
- if($MName=~/\*|\&|\s/)
+ if($TypedefName=~/\*|\&|\s/)
{ # other types
next;
}
- if($MName=~/>(::\w+)+\Z/)
+ if($TypedefName=~/>(::\w+)+\Z/)
{ # QFlags<Qt::DropAction>::enum_type
next;
}
@@ -2247,29 +2249,34 @@
{ # double-check for the name of typedef
my ($TName, $TNS) = getTrivialName(getTypeDeclId($Tid), $Tid); # base type info
next if(not $TName);
- if(length($MName)>=length($TName))
+ if(length($TypedefName)>=length($TName))
{ # too long typedef
next;
}
- if($TName=~/\A\Q$MName\E</) {
+ if($TName=~/\A\Q$TypedefName\E</) {
next;
}
- if($MName=~/\A\Q$TName\E/)
+ if($TypedefName=~/\A\Q$TName\E/)
{ # QDateTimeEdit::Section and QDateTimeEdit::Sections::enum_type
next;
}
- if(get_depth($MName)==0 and get_depth($TName)!=0)
+ if(get_depth($TypedefName)==0 and get_depth($TName)!=0)
{ # std::_Vector_base and std::vector::_Base
next;
}
}
- %{$TypeInfo{$Version}{$MissedInfo{"Tid"}}} = %MissedInfo;
- $TName_Tid{$Version}{$TypedefName} = $MissedInfo{"Tid"};
- delete($TypeInfo{$Version}{$Tid});
+
+ $AddTypes{$MissedInfo{"Tid"}} = \%MissedInfo;
+
# register typedef
$MissedTypedef{$Version}{$Tid}{"Tid"} = $MissedInfo{"Tid"};
$MissedTypedef{$Version}{$Tid}{"TDid"} = $MissedTDid;
+ $TName_Tid{$Version}{$TypedefName} = $MissedInfo{"Tid"};
}
+
+ # add missed & remove other
+ $TypeInfo{$Version} = \%AddTypes;
+ delete($Cache{"getTypeAttr"}{$Version});
}
sub addMissedTypes_Post()
@@ -2288,11 +2295,11 @@
sub getTypeInfo($)
{
- my $Tid = $_[0];
- %{$TypeInfo{$Version}{$Tid}} = getTypeAttr($Tid);
- my $TName = $TypeInfo{$Version}{$Tid}{"Name"};
+ my $TypeId = $_[0];
+ %{$TypeInfo{$Version}{$TypeId}} = getTypeAttr($TypeId);
+ my $TName = $TypeInfo{$Version}{$TypeId}{"Name"};
if(not $TName) {
- delete($TypeInfo{$Version}{$Tid});
+ delete($TypeInfo{$Version}{$TypeId});
}
}
@@ -2615,7 +2622,7 @@
if($NodeType eq "integer_cst")
{ # int (1), unsigned (2u), char ('c' as 99), ...
my $CstTid = getTreeAttr_Type($Type_Id);
- my %CstType = getTypeAttr($CstTid);
+ my %CstType = getTypeAttr($CstTid); # without recursion
my $Num = getNodeIntCst($Type_Id);
if(my $CstSuffix = $ConstantSuffix{$CstType{"Name"}}) {
return ($Num.$CstSuffix);
@@ -2642,12 +2649,13 @@
else
{
my %ParamAttr = getTypeAttr($Type_Id);
- if(not $ParamAttr{"Name"}) {
+ my $PName = $ParamAttr{"Name"};
+ if(not $PName) {
return ();
}
- my $PName = $ParamAttr{"Name"};
- if($ParamAttr{"Name"}=~/\>/) {
- if(my $Cover = cover_stdcxx_typedef($ParamAttr{"Name"})) {
+ if($PName=~/\>/)
+ {
+ if(my $Cover = cover_stdcxx_typedef($PName)) {
$PName = $Cover;
}
}
@@ -3312,7 +3320,8 @@
$TypeAttr{"Name"} = $TypeAttr{"NameSpace"}."::".$TypeAttr{"Name"};
}
}
- if(defined $TemplateInstance{$Version}{"Type"}{$TypeId})
+ if(defined $TemplateInstance{$Version}{"Type"}{$TypeId}
+ and getTypeDeclId($TypeId) eq $TypeInfoId)
{
my @TParams = getTParams($TypeId, "Type");
if(not @TParams)
@@ -4445,11 +4454,14 @@
if(isInline($InfoId)) {
$SymbolInfo{$Version}{$InfoId}{"InLine"} = 1;
}
+ if($LibInfo{$Version}{"info"}{$InfoId}=~/ artificial /i) {
+ $SymbolInfo{$Version}{$InfoId}{"Artificial"} = 1;
+ }
if($SymbolInfo{$Version}{$InfoId}{"Constructor"}
and my $ClassId = $SymbolInfo{$Version}{$InfoId}{"Class"})
{
if(not $SymbolInfo{$Version}{$InfoId}{"InLine"}
- and $LibInfo{$Version}{"info"}{$InfoId}!~/ artificial /i)
+ and not $SymbolInfo{$Version}{$InfoId}{"Artificial"})
{ # inline or auto-generated constructor
delete($TypeInfo{$Version}{$ClassId}{"Copied"});
}
@@ -7073,7 +7085,7 @@
if($MinGWMode{$Version})
{
printMsg("INFO", "Using MinGW compatibility mode");
- $MHeaderPath = "$TMP_DIR/dump$Version.i";
+ $MHeaderPath = $TMP_DIR."/dump$Version.i";
}
}
if(($COMMON_LANGUAGE{$Version} eq "C" or $CheckHeadersOnly)
@@ -7144,7 +7156,7 @@
if($C99Mode{$Version}==1)
{ # try to change C++ "keyword" to "c99_keyword"
printMsg("INFO", "Using C99 compatibility mode");
- $MHeaderPath = "$TMP_DIR/dump$Version.i";
+ $MHeaderPath = $TMP_DIR."/dump$Version.i";
}
}
if($C99Mode{$Version}==1
@@ -11091,6 +11103,11 @@
{ # remove symbol version
my ($SN, $SS, $SV) = separate_symbol($Symbol);
$Symbol=$SN;
+
+ if($CompleteSignature{2}{$Symbol}{"Artificial"})
+ { # skip artificial constructors
+ next;
+ }
}
if(not $CompleteSignature{2}{$Symbol}{"Header"}
or not $CompleteSignature{2}{$Symbol}{"MnglName"}) {
@@ -11181,6 +11198,13 @@
}
}
}
+ if(not checkDump(1, "2.15"))
+ {
+ if($Symbol=~/_IT_E\Z/)
+ { # _ZN28QExplicitlySharedDataPointerI22QSslCertificatePrivateEC1IT_EERKS_IT_E
+ next;
+ }
+ }
$RemovedInt{$Level}{$Symbol} = 1;
if($Level eq "Source")
{ # search for a source-compatible equivalent
@@ -15370,8 +15394,8 @@
{
$CssStyles .= "\n".readModule("Styles", "Tabs.css");
$JScripts .= "\n".readModule("Scripts", "Tabs.js");
- my $Title = "$TargetLibraryFName: ".$Descriptor{1}{"Version"}." to ".$Descriptor{2}{"Version"}." compatibility report";
- my $Keywords = "$TargetLibraryFName, compatibility, API, report";
+ my $Title = $TargetLibraryFName.": ".$Descriptor{1}{"Version"}." to ".$Descriptor{2}{"Version"}." compatibility report";
+ my $Keywords = $TargetLibraryFName.", compatibility, API, report";
my $Description = "Compatibility report for the $TargetLibraryFName $TargetComponent between ".$Descriptor{1}{"Version"}." and ".$Descriptor{2}{"Version"}." versions";
my ($BSummary, $BMetaData) = get_Summary("Binary");
my ($SSummary, $SMetaData) = get_Summary("Source");
@@ -15390,9 +15414,9 @@
else
{
my ($Summary, $MetaData) = get_Summary($Level);
- my $Title = "$TargetLibraryFName: ".$Descriptor{1}{"Version"}." to ".$Descriptor{2}{"Version"}." ".lc($Level)." compatibility report";
- my $Keywords = "$TargetLibraryFName, ".lc($Level)." compatibility, API, report";
- my $Description = "$Level compatibility report for the $TargetLibraryFName $TargetComponent between ".$Descriptor{1}{"Version"}." and ".$Descriptor{2}{"Version"}." versions";
+ my $Title = $TargetLibraryFName.": ".$Descriptor{1}{"Version"}." to ".$Descriptor{2}{"Version"}." ".lc($Level)." compatibility report";
+ my $Keywords = $TargetLibraryFName.", ".lc($Level)." compatibility, API, report";
+ my $Description = "$Level compatibility report for the ".$TargetLibraryFName." ".$TargetComponent." between ".$Descriptor{1}{"Version"}." and ".$Descriptor{2}{"Version"}." versions";
if($Level eq "Binary")
{
if(getArch(1) eq getArch(2)
@@ -17072,14 +17096,8 @@
next;
}
}
- if(my $MName = $SymbolInfo{$LibVersion}{$InfoId}{"MnglName"})
- {
- if($MName=~/_IT_E\Z/)
- { # _ZN28QExplicitlySharedDataPointerI22QSslCertificatePrivateEC1IT_EERKS_IT_E
- delete($SymbolInfo{$LibVersion}{$InfoId});
- }
- }
- elsif($SymbolInfo{$LibVersion}{$InfoId}{"Class"})
+ my $MName = $SymbolInfo{$LibVersion}{$InfoId}{"MnglName"};
+ if(not $MName and $SymbolInfo{$LibVersion}{$InfoId}{"Class"})
{ # templates
delete($SymbolInfo{$LibVersion}{$InfoId});
}