aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Ponomarenko <aponomarenko@rosalab.ru>2013-06-24 19:22:52 +0400
committerAndrey Ponomarenko <aponomarenko@rosalab.ru>2013-06-24 19:22:52 +0400
commit177a66ff01fead52b6f6e28ef2fc0b08b73ba27b (patch)
tree91174e62a218abbcd83a88d3d8542aa66410d3b0
parent46bef51336341bdb98ccb48ef77e476d78e1ec01 (diff)
downloadabi-compliance-checker-177a66ff01fead52b6f6e28ef2fc0b08b73ba27b.tar.gz
ABI Compliance Checker 1.99.2
-rw-r--r--INSTALL4
-rwxr-xr-xabi-compliance-checker.pl1146
-rw-r--r--doc/Changes.html125
-rw-r--r--doc/Descriptor.html2
-rw-r--r--doc/Options.html9
-rw-r--r--doc/Readme.html10
-rw-r--r--doc/SysCheck/Descriptor.html2
-rw-r--r--doc/SysCheck/Examples.html2
-rw-r--r--doc/SysCheck/Usage.html2
-rw-r--r--modules/Internals/RegTests.pm29
10 files changed, 1052 insertions, 279 deletions
diff --git a/INSTALL b/INSTALL
index 2438eb7..54d5cf1 100644
--- a/INSTALL
+++ b/INSTALL
@@ -9,8 +9,8 @@ All rights reserved.
RELEASE INFORMATION
Project: ABI Compliance Checker (ACC)
-Version: 1.99.1
-Date: 2013-06-07
+Version: 1.99.2
+Date: 2013-06-24
This file explains how to install and setup environment
diff --git a/abi-compliance-checker.pl b/abi-compliance-checker.pl
index ea2f793..7a13a98 100755
--- a/abi-compliance-checker.pl
+++ b/abi-compliance-checker.pl
@@ -60,11 +60,12 @@ use File::Path qw(mkpath rmtree);
use File::Temp qw(tempdir);
use File::Copy qw(copy move);
use Cwd qw(abs_path cwd realpath);
+use Storable qw(dclone);
use Data::Dumper;
use Config;
my $TOOL_VERSION = "1.99.2";
-my $ABI_DUMP_VERSION = "3.1";
+my $ABI_DUMP_VERSION = "3.2";
my $OLDEST_SUPPORTED_VERSION = "1.18";
my $XML_REPORT_VERSION = "1.1";
my $XML_ABI_DUMP_VERSION = "1.2";
@@ -91,7 +92,8 @@ $TargetComponent_Opt, $TargetSysInfo, $TargetHeader, $ExtendedCheck, $Quiet,
$SkipHeadersPath, $CppCompat, $LogMode, $StdOut, $ListAffected, $ReportFormat,
$UserLang, $TargetHeadersPath, $BinaryOnly, $SourceOnly, $BinaryReportPath,
$SourceReportPath, $UseXML, $Browse, $OpenReport, $SortDump, $DumpFormat,
-$ExtraInfo, $ExtraDump, $Force, $Tolerance, $Tolerant, $SkipSymbolsListPath);
+$ExtraInfo, $ExtraDump, $Force, $Tolerance, $Tolerant, $SkipSymbolsListPath,
+$CheckInfo);
my $CmdName = get_filename($0);
my %OS_LibExt = (
@@ -270,7 +272,8 @@ GetOptions("h|help!" => \$Help,
"extra-dump!" => \$ExtraDump,
"force!" => \$Force,
"tolerance=s" => \$Tolerance,
- "tolerant!" => \$Tolerant
+ "tolerant!" => \$Tolerant,
+ "check!" => \$CheckInfo
) or ERR_MESSAGE();
sub ERR_MESSAGE()
@@ -765,6 +768,9 @@ OTHER OPTIONS:
-tolerant
Enable highest tolerance level [1234].
+
+ -check
+ Check completeness of the ABI dump.
REPORT:
Compatibility report will be generated to:
@@ -972,6 +978,7 @@ my %NodeType= (
"identifier_node" => "Other",
"integer_cst" => "Other",
"integer_type" => "Intrinsic",
+ "vector_type" => "Vector",
"method_type" => "MethodType",
"namespace_decl" => "Other",
"parm_decl" => "Other",
@@ -982,7 +989,9 @@ my %NodeType= (
"reference_type" => "Ref",
"string_cst" => "Other",
"template_decl" => "Other",
- "template_type_parm" => "Other",
+ "template_type_parm" => "TemplateParam",
+ "typename_type" => "TypeName",
+ "sizeof_expr" => "SizeOf",
"tree_list" => "Other",
"tree_vec" => "Other",
"type_decl" => "Other",
@@ -1094,6 +1103,8 @@ my %IntrinsicMangling = (
"..." => "z"
);
+my %IntrinsicNames = map {$_=>1} keys(%IntrinsicMangling);
+
my %StdcxxMangling = (
"3std"=>"St",
"3std9allocator"=>"Sa",
@@ -1105,6 +1116,9 @@ my %StdcxxMangling = (
);
my $DEFAULT_STD_PARMS = "std::(allocator|less|char_traits|regex_traits|istreambuf_iterator|ostreambuf_iterator)";
+my %DEFAULT_STD_ARGS = map {$_=>1} ("_Alloc", "_Compare", "_Traits", "_Rx_traits", "_InIter", "_OutIter");
+
+my $ADD_TMPL_INSTANCES = 1;
my %ConstantSuffix = (
"unsigned int"=>"u",
@@ -1399,10 +1413,15 @@ my %EnumConstants;
my %SymbolHeader;
my %KnownLibs;
-# Types
-my %TypeInfo;
+# Templates
my %TemplateInstance;
+my %BasicTemplate;
+my %TemplateArg;
my %TemplateDecl;
+my %TemplateMap;
+
+# Types
+my %TypeInfo;
my %SkipTypes = (
"1"=>{},
"2"=>{} );
@@ -1412,7 +1431,6 @@ my %EnumMembName_Id;
my %NestedNameSpaces = (
"1"=>{},
"2"=>{} );
-my %UsedType;
my %VirtualTable;
my %VirtualTable_Model;
my %ClassVTable;
@@ -1426,6 +1444,8 @@ my %OverriddenMethods;
my %TypedefToAnon;
my $MAX_ID = 0;
+my %CheckedTypeInfo;
+
# Typedefs
my %Typedef_BaseName;
my %Typedef_Tr;
@@ -2157,10 +2177,10 @@ sub getInfo($)
getVarInfo_All();
getSymbolInfo_All();
-
# clean memory
%LibInfo = ();
%TemplateInstance = ();
+ %BasicTemplate = ();
%MangledNames = ();
%TemplateDecl = ();
%StdCxxTypedef = ();
@@ -2175,21 +2195,27 @@ sub getInfo($)
if($ExtraDump)
{
- foreach (keys(%{$TypeInfo{$Version}}))
- {
- if($TypeInfo{$Version}{$_}{"Artificial"}) {
- delete($TypeInfo{$Version}{$_});
- }
- }
+ remove_Unused($Version, "Extra");
}
else
{ # remove unused types
if($BinaryOnly and not $ExtendedCheck)
{ # --binary
- removeUnused($Version, "All");
+ remove_Unused($Version, "All");
}
else {
- removeUnused($Version, "Extended");
+ remove_Unused($Version, "Extended");
+ }
+ }
+
+ if($CheckInfo)
+ {
+ foreach my $Tid (keys(%{$TypeInfo{$Version}})) {
+ check_Completeness($TypeInfo{$Version}{$Tid}, $Version);
+ }
+
+ foreach my $Sid (keys(%{$SymbolInfo{$Version}})) {
+ check_Completeness($SymbolInfo{$Version}{$Sid}, $Version);
}
}
@@ -2215,7 +2241,7 @@ sub readTUDump($)
# clean memory
undef $Content;
- $MAX_ID = $#Lines+1;
+ $MAX_ID = $#Lines+1; # number of lines == number of nodes
foreach (0 .. $#Lines)
{
@@ -2340,14 +2366,41 @@ sub setTemplateParams_All()
sub setTemplateParams($)
{
+ my $Tid = getTypeId($_[0]);
if(my $Info = $LibInfo{$Version}{"info"}{$_[0]})
{
if($Info=~/(inst|spcs)[ ]*:[ ]*@(\d+) /)
{
my $TmplInst_Id = $2;
- setTemplateInstParams($TmplInst_Id);
+ setTemplateInstParams($_[0], $TmplInst_Id);
while($TmplInst_Id = getNextElem($TmplInst_Id)) {
- setTemplateInstParams($TmplInst_Id);
+ setTemplateInstParams($_[0], $TmplInst_Id);
+ }
+ }
+
+ $BasicTemplate{$Version}{$Tid} = $_[0];
+
+ if(my $Prms = getTreeAttr_Prms($_[0]))
+ {
+ if(my $Valu = getTreeAttr_Valu($Prms))
+ {
+ my $Vector = getTreeVec($Valu);
+ foreach my $Pos (sort {int($a)<=>int($b)} keys(%{$Vector}))
+ {
+ if(my $Val = getTreeAttr_Valu($Vector->{$Pos}))
+ {
+ if(my $Name = getNameByInfo($Val))
+ {
+ $TemplateArg{$Version}{$_[0]}{$Pos} = $Name;
+ if($LibInfo{$Version}{"info_type"}{$Val} eq "parm_decl") {
+ $TemplateInstance{$Version}{"Type"}{$Tid}{$Pos} = $Val;
+ }
+ else {
+ $TemplateInstance{$Version}{"Type"}{$Tid}{$Pos} = getTreeAttr_Type($Val);
+ }
+ }
+ }
+ }
}
}
}
@@ -2356,15 +2409,17 @@ sub setTemplateParams($)
if(my $IType = $LibInfo{$Version}{"info_type"}{$TypeId})
{
if($IType eq "record_type") {
- $TemplateDecl{$Version}{$TypeId}=1;
+ $TemplateDecl{$Version}{$TypeId} = 1;
}
}
}
}
-sub setTemplateInstParams($)
+sub setTemplateInstParams($$)
{
- if(my $Info = $LibInfo{$Version}{"info"}{$_[0]})
+ my ($Tmpl, $Inst) = @_;
+
+ if(my $Info = $LibInfo{$Version}{"info"}{$Inst})
{
my ($Params_InfoId, $ElemId) = ();
if($Info=~/purp[ ]*:[ ]*@(\d+) /) {
@@ -2381,19 +2436,19 @@ sub setTemplateInstParams($)
my ($PPos, $PTypeId) = ($1, $2);
if(my $PType = $LibInfo{$Version}{"info_type"}{$PTypeId})
{
- if($PType eq "template_type_parm")
- {
- $TemplateDecl{$Version}{$ElemId}=1;
- return;
+ if($PType eq "template_type_parm") {
+ $TemplateDecl{$Version}{$ElemId} = 1;
}
}
if($LibInfo{$Version}{"info_type"}{$ElemId} eq "function_decl")
{ # functions
$TemplateInstance{$Version}{"Func"}{$ElemId}{$PPos} = $PTypeId;
+ $BasicTemplate{$Version}{$ElemId} = $Tmpl;
}
else
{ # types
$TemplateInstance{$Version}{"Type"}{$ElemId}{$PPos} = $PTypeId;
+ $BasicTemplate{$Version}{$ElemId} = $Tmpl;
}
}
}
@@ -2448,6 +2503,175 @@ sub getTypeInfo_All()
{ # support for GCC < 4.5
addMissedTypes_Post();
}
+
+ if($ADD_TMPL_INSTANCES)
+ {
+ # templates
+ foreach my $Tid (sort {int($a)<=>int($b)} keys(%{$TypeInfo{$Version}}))
+ {
+ if(defined $TemplateMap{$Version}{$Tid}
+ and not defined $TypeInfo{$Version}{$Tid}{"Template"})
+ {
+ if(defined $TypeInfo{$Version}{$Tid}{"Memb"})
+ {
+ foreach my $Pos (sort {int($a)<=>int($b)} keys(%{$TypeInfo{$Version}{$Tid}{"Memb"}}))
+ {
+ if(my $MembTypeId = $TypeInfo{$Version}{$Tid}{"Memb"}{$Pos}{"type"})
+ {
+ if(my %MAttr = getTypeAttr($MembTypeId))
+ {
+ $TypeInfo{$Version}{$Tid}{"Memb"}{$Pos}{"algn"} = $MAttr{"Algn"};
+ $MembTypeId = $TypeInfo{$Version}{$Tid}{"Memb"}{$Pos}{"type"} = instType($TemplateMap{$Version}{$Tid}, $MembTypeId, $Version);
+ }
+ }
+ }
+ }
+ if(defined $TypeInfo{$Version}{$Tid}{"Base"})
+ {
+ foreach my $Bid (sort {int($a)<=>int($b)} keys(%{$TypeInfo{$Version}{$Tid}{"Base"}}))
+ {
+ my $NBid = instType($TemplateMap{$Version}{$Tid}, $Bid, $Version);
+
+ if($NBid ne $Bid)
+ {
+ %{$TypeInfo{$Version}{$Tid}{"Base"}{$NBid}} = %{$TypeInfo{$Version}{$Tid}{"Base"}{$Bid}};
+ delete($TypeInfo{$Version}{$Tid}{"Base"}{$Bid});
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+sub createType($$)
+{
+ my ($Attr, $LibVersion) = @_;
+ my $NewId = ++$MAX_ID;
+
+ $TypeInfo{$Version}{$NewId} = $Attr;
+ $TName_Tid{$Version}{$Attr->{"Name"}} = $NewId;
+
+ return "$NewId";
+}
+
+sub instType($$$)
+{ # create template instances
+ my ($Map, $Tid, $LibVersion) = @_;
+ my $Attr = dclone($TypeInfo{$LibVersion}{$Tid});
+
+ foreach my $Key (sort keys(%{$Map}))
+ {
+ if(my $Val = $Map->{$Key})
+ {
+ $Attr->{"Name"}=~s/\b$Key\b/$Val/g;
+
+ if(defined $Attr->{"NameSpace"}) {
+ $Attr->{"NameSpace"}=~s/\b$Key\b/$Val/g;
+ }
+ foreach (keys(%{$Attr->{"TParam"}})) {
+ $Attr->{"TParam"}{$_}{"name"}=~s/\b$Key\b/$Val/g;
+ }
+ }
+ else
+ { # remove absent
+ # _Traits, etc.
+ $Attr->{"Name"}=~s/,\s*\b$Key(,|>)/$1/g;
+ if(defined $Attr->{"NameSpace"})
+ {
+ $Attr->{"NameSpace"}=~s/,\s*\b$Key(,|>)/$1/g;
+ }
+ foreach (keys(%{$Attr->{"TParam"}}))
+ {
+ if($Attr->{"TParam"}{$_}{"name"} eq $Key) {
+ delete($Attr->{"TParam"}{$_});
+ }
+ else
+ {
+ $Attr->{"TParam"}{$_}{"name"}=~s/,\s*\b$Key(,|>)/$1/g;
+ }
+ }
+ }
+ }
+
+ my $Tmpl = 0;
+
+ if(defined $Attr->{"TParam"})
+ {
+ foreach (sort {int($a)<=>int($b)} keys(%{$Attr->{"TParam"}}))
+ {
+ my $PName = $Attr->{"TParam"}{$_}{"name"};
+
+ if(my $PTid = $TName_Tid{$LibVersion}{$PName})
+ {
+ my %Base = get_BaseType($PTid, $LibVersion);
+
+ if($Base{"Type"} eq "TemplateParam"
+ or defined $Base{"Template"})
+ {
+ $Tmpl = 1;
+ last
+ }
+ }
+ }
+ }
+
+ if(my $Id = getTypeIdByName($Attr->{"Name"}, $LibVersion)) {
+ return "$Id";
+ }
+ else
+ {
+ if(not $Tmpl) {
+ delete($Attr->{"Template"});
+ }
+
+ my %EMap = ();
+ if(defined $TemplateMap{$LibVersion}{$Tid}) {
+ %EMap = %{$TemplateMap{$LibVersion}{$Tid}};
+ }
+ foreach (keys(%{$Map})) {
+ $EMap{$_} = $Map->{$_};
+ }
+
+ if(defined $Attr->{"BaseType"}) {
+ $Attr->{"BaseType"} = instType(\%EMap, $Attr->{"BaseType"}, $LibVersion);
+ }
+ if(defined $Attr->{"Base"})
+ {
+ foreach my $Bid (keys(%{$Attr->{"Base"}}))
+ {
+ my $NBid = instType(\%EMap, $Bid, $LibVersion);
+
+ if($NBid ne $Bid)
+ {
+ %{$Attr->{"Base"}{$NBid}} = %{$Attr->{"Base"}{$Bid}};
+ delete($Attr->{"Base"}{$Bid});
+ }
+ }
+ }
+
+ my $R = createType($Attr, $LibVersion);
+
+ if(defined $Attr->{"Memb"})
+ {
+ foreach (sort {int($a)<=>int($b)} keys(%{$Attr->{"Memb"}})) {
+ $Attr->{"Memb"}{$_}{"type"} = instType(\%EMap, $Attr->{"Memb"}{$_}{"type"}, $LibVersion);
+ }
+ }
+
+ if(defined $Attr->{"Param"})
+ {
+ foreach (sort {int($a)<=>int($b)} keys(%{$Attr->{"Param"}})) {
+ $Attr->{"Param"}{$_}{"type"} = instType(\%EMap, $Attr->{"Param"}{$_}{"type"}, $LibVersion);
+ }
+ }
+
+ if(defined $Attr->{"Return"}) {
+ $Attr->{"Return"} = instType(\%EMap, $Attr->{"Return"}, $LibVersion);
+ }
+
+ return $R;
+ }
}
sub addMissedTypes_Pre()
@@ -2488,13 +2712,13 @@ sub addMissedTypes_Pre()
if(not $TypedefName) {
next;
}
- $MAX_ID++;
+ my $NewId = ++$MAX_ID;
my %MissedInfo = ( # typedef info
"Name" => $TypedefName,
"NameSpace" => $TypedefNS,
"BaseType" => $Tid,
"Type" => "Typedef",
- "Tid" => "$MAX_ID" );
+ "Tid" => "$NewId" );
my ($H, $L) = getLocation($MissedTDid);
$MissedInfo{"Header"} = $H;
$MissedInfo{"Line"} = $L;
@@ -2642,13 +2866,12 @@ sub getTypeAttr($)
{
if($Info=~/qual[ ]*:/)
{
- if(my $NID = ++$MAX_ID)
- {
- $MissedBase{$Version}{$TypeId}="$NID";
- $MissedBase_R{$Version}{$NID}=$TypeId;
- $LibInfo{$Version}{"info"}{$NID} = $LibInfo{$Version}{"info"}{$TypeId};
- $LibInfo{$Version}{"info_type"}{$NID} = $LibInfo{$Version}{"info_type"}{$TypeId};
- }
+ my $NewId = ++$MAX_ID;
+
+ $MissedBase{$Version}{$TypeId} = "$NewId";
+ $MissedBase_R{$Version}{$NewId} = $TypeId;
+ $LibInfo{$Version}{"info"}{$NewId} = $LibInfo{$Version}{"info"}{$TypeId};
+ $LibInfo{$Version}{"info_type"}{$NewId} = $LibInfo{$Version}{"info_type"}{$TypeId};
}
}
$TypeAttr{"Type"} = "Typedef";
@@ -2657,6 +2880,14 @@ sub getTypeAttr($)
$TypeAttr{"Type"} = getTypeType($TypeId);
}
+ if(my $ScopeId = getTreeAttr_Scpe($TypeDeclId))
+ {
+ if($LibInfo{$Version}{"info_type"}{$ScopeId} eq "function_decl")
+ { # local code
+ return ();
+ }
+ }
+
if($TypeAttr{"Type"} eq "Unknown") {
return ();
}
@@ -2720,13 +2951,15 @@ sub getTypeAttr($)
}
return ();
}
- elsif($TypeAttr{"Type"}=~/\A(Intrinsic|Union|Struct|Enum|Class)\Z/)
+ elsif($TypeAttr{"Type"}=~/\A(Intrinsic|Union|Struct|Enum|Class|Vector)\Z/)
{
%TypeAttr = getTrivialTypeAttr($TypeId);
if($TypeAttr{"Name"})
{
%{$TypeInfo{$Version}{$TypeId}} = %TypeAttr;
- if($TypeAttr{"Name"} ne "int" or getTypeDeclId($TypeAttr{"Tid"}))
+
+ if(not defined $IntrinsicNames{$TypeAttr{"Name"}}
+ or getTypeDeclId($TypeAttr{"Tid"}))
{ # NOTE: register only one int: with built-in decl
if(not $TName_Tid{$Version}{$TypeAttr{"Name"}}) {
$TName_Tid{$Version}{$TypeAttr{"Name"}} = $TypeId;
@@ -2738,6 +2971,35 @@ sub getTypeAttr($)
return ();
}
}
+ elsif($TypeAttr{"Type"}=~/TemplateParam|TypeName/)
+ {
+ %TypeAttr = getTrivialTypeAttr($TypeId);
+ if($TypeAttr{"Name"})
+ {
+ %{$TypeInfo{$Version}{$TypeId}} = %TypeAttr;
+ if(not $TName_Tid{$Version}{$TypeAttr{"Name"}}) {
+ $TName_Tid{$Version}{$TypeAttr{"Name"}} = $TypeId;
+ }
+ return %TypeAttr;
+ }
+ else {
+ return ();
+ }
+ }
+ elsif($TypeAttr{"Type"} eq "SizeOf")
+ {
+ $TypeAttr{"BaseType"} = getTreeAttr_Type($TypeId);
+ my %BTAttr = getTypeAttr($TypeAttr{"BaseType"});
+ $TypeAttr{"Name"} = "sizeof(".$BTAttr{"Name"}.")";
+ if($TypeAttr{"Name"})
+ {
+ %{$TypeInfo{$Version}{$TypeId}} = %TypeAttr;
+ return %TypeAttr;
+ }
+ else {
+ return ();
+ }
+ }
else
{ # derived types
my ($BTid, $BTSpec) = selectBaseType($TypeId);
@@ -2924,6 +3186,10 @@ sub get_TemplateParam($$)
}
return @Params;
}
+ elsif($NodeType eq "parm_decl")
+ {
+ (getNameByInfo($Type_Id));
+ }
else
{
my %ParamAttr = getTypeAttr($Type_Id);
@@ -3319,13 +3585,20 @@ sub getTypeType($)
sub isTypedef($)
{
- if($_[0] and my $Info = $LibInfo{$Version}{"info"}{$_[0]})
+ if($_[0])
{
- my $TDid = getTypeDeclId($_[0]);
- if(getNameByInfo($TDid)
- and $Info=~/unql[ ]*:[ ]*\@(\d+) /
- and getTypeId($TDid) eq $_[0]) {
- return $1;
+ if($LibInfo{$Version}{"info_type"}{$_[0]} eq "vector_type")
+ { # typedef float La_x86_64_xmm __attribute__ ((__vector_size__ (16)));
+ return 0;
+ }
+ if(my $Info = $LibInfo{$Version}{"info"}{$_[0]})
+ {
+ my $TDid = getTypeDeclId($_[0]);
+ if(getNameByInfo($TDid)
+ and $Info=~/unql[ ]*:[ ]*\@(\d+) /
+ and getTypeId($TDid) eq $_[0]) {
+ return $1;
+ }
}
}
return 0;
@@ -3370,31 +3643,21 @@ sub selectBaseType($)
if($Info=~/refd[ ]*:[ ]*@(\d+) /) {
return ($1, "&");
}
- else {
- return (0, "");
- }
}
elsif($InfoType eq "array_type")
{
if($Info=~/elts[ ]*:[ ]*@(\d+) /) {
return ($1, "");
}
- else {
- return (0, "");
- }
}
elsif($InfoType eq "pointer_type")
{
if($Info=~/ptd[ ]*:[ ]*@(\d+) /) {
return ($1, "*");
}
- else {
- return (0, "");
- }
- }
- else {
- return (0, "");
}
+
+ return (0, "");
}
sub getSymbolInfo_All()
@@ -3405,6 +3668,44 @@ sub getSymbolInfo_All()
getSymbolInfo($_);
}
}
+
+ if($ADD_TMPL_INSTANCES)
+ {
+ # templates
+ foreach my $Sid (sort {int($a)<=>int($b)} keys(%{$SymbolInfo{$Version}}))
+ {
+ my %Map = ();
+
+ if(my $ClassId = $SymbolInfo{$Version}{$Sid}{"Class"})
+ {
+ if(defined $TemplateMap{$Version}{$ClassId})
+ {
+ foreach (keys(%{$TemplateMap{$Version}{$ClassId}})) {
+ $Map{$_} = $TemplateMap{$Version}{$ClassId}{$_};
+ }
+ }
+ }
+
+ if(defined $TemplateMap{$Version}{$Sid})
+ {
+ foreach (keys(%{$TemplateMap{$Version}{$Sid}})) {
+ $Map{$_} = $TemplateMap{$Version}{$Sid}{$_};
+ }
+ }
+
+ if(defined $SymbolInfo{$Version}{$Sid}{"Param"})
+ {
+ foreach (keys(%{$SymbolInfo{$Version}{$Sid}{"Param"}}))
+ {
+ my $PTid = $SymbolInfo{$Version}{$Sid}{"Param"}{$_}{"type"};
+ $SymbolInfo{$Version}{$Sid}{"Param"}{$_}{"type"} = instType(\%Map, $PTid, $Version);
+ }
+ }
+ if(my $Return = $SymbolInfo{$Version}{$Sid}{"Return"}) {
+ $SymbolInfo{$Version}{$Sid}{"Return"} = instType(\%Map, $Return, $Version);
+ }
+ }
+ }
}
sub getVarInfo_All()
@@ -3474,8 +3775,9 @@ sub getVarInfo($)
$SymbolInfo{$Version}{$InfoId}{"Data"} = 1;
if(my $Rid = getTypeId($InfoId))
{
- if(not $TypeInfo{$Version}{$Rid}{"Name"})
- { # typename_type
+ if(not defined $TypeInfo{$Version}{$Rid}
+ or not $TypeInfo{$Version}{$Rid}{"Name"})
+ {
delete($SymbolInfo{$Version}{$InfoId});
return;
}
@@ -3488,8 +3790,9 @@ sub getVarInfo($)
set_Class_And_Namespace($InfoId);
if(my $ClassId = $SymbolInfo{$Version}{$InfoId}{"Class"})
{
- if(not $TypeInfo{$Version}{$ClassId}{"Name"})
- { # templates
+ if(not defined $TypeInfo{$Version}{$ClassId}
+ or not $TypeInfo{$Version}{$ClassId}{"Name"})
+ {
delete($SymbolInfo{$Version}{$InfoId});
return;
}
@@ -3608,7 +3911,7 @@ sub getTrivialName($$)
last;
}
}
- $NameSpaceId=$NSId;
+ $NameSpaceId = $NSId;
}
}
else
@@ -3636,10 +3939,6 @@ sub getTrivialName($$)
and getTypeDeclId($TypeId) eq $TypeInfoId)
{
my @TParams = getTParams($TypeId, "Type");
- if(not @TParams)
- { # template declarations with abstract params
- return ("", "");
- }
$TypeAttr{"Name"} = formatName($TypeAttr{"Name"}."< ".join(", ", @TParams)." >", "T");
}
return ($TypeAttr{"Name"}, $TypeAttr{"NameSpace"});
@@ -3650,22 +3949,13 @@ sub getTrivialTypeAttr($)
my $TypeId = $_[0];
my $TypeInfoId = getTypeDeclId($_[0]);
+ my %TypeAttr = ();
+
if($TemplateDecl{$Version}{$TypeId})
{ # template_decl
- return ();
- }
- if(my $ScopeId = getTreeAttr_Scpe($TypeInfoId))
- {
- if($TemplateDecl{$Version}{$ScopeId})
- { # template_decl
- return ();
- }
+ $TypeAttr{"Template"} = 1;
}
- my %TypeAttr = ();
- if(getTypeTypeByTypeId($TypeId)!~/\A(Intrinsic|Union|Struct|Enum|Class)\Z/) {
- return ();
- }
setTypeAccess($TypeId, \%TypeAttr);
($TypeAttr{"Header"}, $TypeAttr{"Line"}) = getLocation($TypeInfoId);
if(isBuiltIn($TypeAttr{"Header"}))
@@ -3681,27 +3971,95 @@ sub getTrivialTypeAttr($)
if(not $TypeAttr{"NameSpace"}) {
delete($TypeAttr{"NameSpace"});
}
+
+ my $Tmpl = undef;
+
if(defined $TemplateInstance{$Version}{"Type"}{$TypeId})
{
+ $Tmpl = $BasicTemplate{$Version}{$TypeId};
+
if(my @TParams = getTParams($TypeId, "Type"))
{
- foreach my $Pos (0 .. $#TParams) {
- $TypeAttr{"TParam"}{$Pos}{"name"}=$TParams[$Pos];
+ foreach my $Pos (0 .. $#TParams)
+ {
+ my $Val = $TParams[$Pos];
+ $TypeAttr{"TParam"}{$Pos}{"name"} = $Val;
+
+ if(not defined $TypeAttr{"Template"})
+ {
+ my %Base = get_BaseType($TemplateInstance{$Version}{"Type"}{$TypeId}{$Pos}, $Version);
+
+ if($Base{"Type"} eq "TemplateParam"
+ or defined $Base{"Template"}) {
+ $TypeAttr{"Template"} = 1;
+ }
+ }
+
+ if($Tmpl)
+ {
+ if(my $Arg = $TemplateArg{$Version}{$Tmpl}{$Pos})
+ {
+ $TemplateMap{$Version}{$TypeId}{$Arg} = $Val;
+
+ if($Val eq $Arg) {
+ $TypeAttr{"Template"} = 1;
+ }
+ }
+ }
+ }
+
+ if($Tmpl)
+ {
+ foreach my $Pos (sort {int($a)<=>int($b)} keys(%{$TemplateArg{$Version}{$Tmpl}}))
+ {
+ if($Pos>$#TParams)
+ {
+ my $Arg = $TemplateArg{$Version}{$Tmpl}{$Pos};
+ $TemplateMap{$Version}{$TypeId}{$Arg} = "";
+ }
+ }
+ }
+ }
+
+ if($ADD_TMPL_INSTANCES)
+ {
+ if(not getTreeAttr_Flds($TypeId))
+ {
+ if($Tmpl)
+ {
+ if(my $MainInst = getTreeAttr_Type($Tmpl))
+ {
+ if(my $Flds = getTreeAttr_Flds($MainInst)) {
+ $LibInfo{$Version}{"info"}{$TypeId} .= " flds: \@$Flds ";
+ }
+ if(my $Binf = getTreeAttr_Binf($MainInst)) {
+ $LibInfo{$Version}{"info"}{$TypeId} .= " binf: \@$Binf ";
+ }
+ }
+ }
}
}
}
+
+ my $StaticFields = setTypeMemb($TypeId, \%TypeAttr);
+
if(my $Size = getSize($TypeId))
{
$Size = $Size/$BYTE_SIZE;
$TypeAttr{"Size"} = "$Size";
}
else
- { # declaration only
- $TypeAttr{"Forward"} = 1;
+ {
+ if($ExtraDump)
+ {
+ if(not defined $TypeAttr{"Memb"}
+ and not $Tmpl)
+ { # declaration only
+ $TypeAttr{"Forward"} = 1;
+ }
+ }
}
- my $StaticFields = setTypeMemb($TypeId, \%TypeAttr);
-
if($TypeAttr{"Type"} eq "Struct"
and ($StaticFields or detect_lang($TypeId)))
{
@@ -3724,7 +4082,7 @@ sub getTrivialTypeAttr($)
if($TypeAttr{"Type"}=~/\A(Struct|Union|Enum)\Z/)
{
if(not $TypedefToAnon{$TypeId}
- and not keys(%{$TemplateInstance{$Version}{"Type"}{$TypeId}}))
+ and not defined $TemplateInstance{$Version}{"Type"}{$TypeId})
{
if(not isAnon($TypeAttr{"Name"})) {
$TypeAttr{"Name"} = lc($TypeAttr{"Type"})." ".$TypeAttr{"Name"};
@@ -3740,7 +4098,7 @@ sub getTrivialTypeAttr($)
{
my $Entry = $Entries[$_];
if($Entry=~/\A(\d+)\s+(.+)\Z/) {
- $TypeAttr{"VTable"}{$1} = $2;
+ $TypeAttr{"VTable"}{$1} = simplifyVTable($2);
}
}
}
@@ -3759,10 +4117,14 @@ sub getTrivialTypeAttr($)
};
if(isAnon($TypeAttr{"Name"}))
{
- %{$Constants{$Version}{$MName}} = (
- "Value" => $MVal,
- "Header" => $TypeAttr{"Header"}
- );
+ if($ExtraDump
+ or is_target_header($TypeAttr{"Header"}, $Version))
+ {
+ %{$Constants{$Version}{$MName}} = (
+ "Value" => $MVal,
+ "Header" => $TypeAttr{"Header"}
+ );
+ }
}
}
}
@@ -3777,6 +4139,33 @@ sub getTrivialTypeAttr($)
return %TypeAttr;
}
+sub simplifyVTable($)
+{
+ my $Content = $_[0];
+ if($Content=~s/ \[with (.+)]//)
+ { # std::basic_streambuf<_CharT, _Traits>::imbue [with _CharT = char, _Traits = std::char_traits<char>]
+ if(my @Elems = separate_Params($1, 0, 0))
+ {
+ foreach my $Elem (@Elems)
+ {
+ if($Elem=~/\A(.+?)\s*=\s*(.+?)\Z/)
+ {
+ my ($Arg, $Val) = ($1, $2);
+
+ if(defined $DEFAULT_STD_ARGS{$Arg}) {
+ $Content=~s/,\s*$Arg\b//g;
+ }
+ else {
+ $Content=~s/\b$Arg\b/$Val/g;
+ }
+ }
+ }
+ }
+ }
+
+ return $Content;
+}
+
sub detect_lang($)
{
my $TypeId = $_[0];
@@ -3812,9 +4201,9 @@ sub setBaseClasses($$)
{
my ($TypeId, $TypeAttr) = @_;
my $Info = $LibInfo{$Version}{"info"}{$TypeId};
- if($Info=~/binf[ ]*:[ ]*@(\d+) /)
+ if(my $Binf = getTreeAttr_Binf($TypeId))
{
- $Info = $LibInfo{$Version}{"info"}{$1};
+ my $Info = $LibInfo{$Version}{"info"}{$Binf};
my $Pos = 0;
while($Info=~s/(pub|public|prot|protected|priv|private|)[ ]+binf[ ]*:[ ]*@(\d+) //)
{
@@ -3824,7 +4213,7 @@ sub setBaseClasses($$)
if(not $CType or $CType eq "template_type_parm"
or $CType eq "typename_type")
{ # skip
- return 1;
+ # return 1;
}
my $BaseInfo = $LibInfo{$Version}{"info"}{$BInfoId};
if($Access=~/prot/) {
@@ -4675,13 +5064,15 @@ sub getSymbolInfo($)
}
$SymbolInfo{$Version}{$InfoId}{"Type"} = getFuncType($InfoId);
- if($SymbolInfo{$Version}{$InfoId}{"Return"} = getFuncReturn($InfoId))
+ if(my $Return = getFuncReturn($InfoId))
{
- if(not $TypeInfo{$Version}{$SymbolInfo{$Version}{$InfoId}{"Return"}}{"Name"})
- { # templates
+ if(not defined $TypeInfo{$Version}{$Return}
+ or not $TypeInfo{$Version}{$Return}{"Name"})
+ {
delete($SymbolInfo{$Version}{$InfoId});
return;
}
+ $SymbolInfo{$Version}{$InfoId}{"Return"} = $Return;
}
if(my $Rid = $SymbolInfo{$Version}{$InfoId}{"Return"})
{
@@ -4711,15 +5102,40 @@ sub getSymbolInfo($)
if(defined $TemplateInstance{$Version}{"Func"}{$Orig})
{
+ my $Tmpl = $BasicTemplate{$Version}{$InfoId};
+
my @TParams = getTParams($Orig, "Func");
if(not @TParams)
{
delete($SymbolInfo{$Version}{$InfoId});
return;
}
- foreach my $Pos (0 .. $#TParams) {
- $SymbolInfo{$Version}{$InfoId}{"TParam"}{$Pos}{"name"}=$TParams[$Pos];
+ foreach my $Pos (0 .. $#TParams)
+ {
+ my $Val = $TParams[$Pos];
+ $SymbolInfo{$Version}{$InfoId}{"TParam"}{$Pos}{"name"} = $Val;
+
+ if($Tmpl)
+ {
+ if(my $Arg = $TemplateArg{$Version}{$Tmpl}{$Pos})
+ {
+ $TemplateMap{$Version}{$InfoId}{$Arg} = $Val;
+ }
+ }
+ }
+
+ if($Tmpl)
+ {
+ foreach my $Pos (sort {int($a)<=>int($b)} keys(%{$TemplateArg{$Version}{$Tmpl}}))
+ {
+ if($Pos>$#TParams)
+ {
+ my $Arg = $TemplateArg{$Version}{$Tmpl}{$Pos};
+ $TemplateMap{$Version}{$InfoId}{$Arg} = "";
+ }
+ }
}
+
my $PrmsInLine = join(", ", @TParams);
if($SymbolInfo{$Version}{$InfoId}{"ShortName"}=~/\Aoperator\W+\Z/)
{ # operator<< <T>, operator>> <T>
@@ -4772,8 +5188,9 @@ sub getSymbolInfo($)
if(my $ClassId = $SymbolInfo{$Version}{$InfoId}{"Class"})
{
- if(not $TypeInfo{$Version}{$ClassId}{"Name"})
- { # templates
+ if(not defined $TypeInfo{$Version}{$ClassId}
+ or not $TypeInfo{$Version}{$ClassId}{"Name"})
+ {
delete($SymbolInfo{$Version}{$InfoId});
return;
}
@@ -5074,6 +5491,7 @@ sub setTypeMemb($$)
$MembTypeId = $AddedTid;
}
}
+
$TypeAttr->{"Memb"}{$Pos}{"type"} = $MembTypeId;
$TypeAttr->{"Memb"}{$Pos}{"name"} = $StructMembName;
if((my $Access = getTreeAccess($MInfoId)) ne "public")
@@ -5093,7 +5511,13 @@ sub setTypeMemb($$)
}
else
{ # in bytes
- $TypeAttr->{"Memb"}{$Pos}{"algn"} /= $BYTE_SIZE;
+ if($TypeAttr->{"Memb"}{$Pos}{"algn"}==1)
+ { # template
+ delete($TypeAttr->{"Memb"}{$Pos}{"algn"});
+ }
+ else {
+ $TypeAttr->{"Memb"}{$Pos}{"algn"} /= $BYTE_SIZE;
+ }
}
$MInfoId = getNextElem($MInfoId);
@@ -5161,6 +5585,14 @@ sub setFuncParams($)
next;
}
$SymbolInfo{$Version}{$InfoId}{"Param"}{$Pos}{"type"} = $ParamTypeId;
+
+ if(my %Base = get_BaseType($ParamTypeId, $Version))
+ {
+ if(defined $Base{"Template"}) {
+ return 1;
+ }
+ }
+
$SymbolInfo{$Version}{$InfoId}{"Param"}{$Pos}{"name"} = $ParamName;
if(my $Algn = getAlgn($ParamInfoId)) {
$SymbolInfo{$Version}{$InfoId}{"Param"}{$Pos}{"algn"} = $Algn/$BYTE_SIZE;
@@ -5411,6 +5843,17 @@ sub getTreeAttr_Flds($)
return "";
}
+sub getTreeAttr_Binf($)
+{
+ if($_[0] and my $Info = $LibInfo{$Version}{"info"}{$_[0]})
+ {
+ if($Info=~/binf[ ]*:[ ]*@(\d+) /) {
+ return $1;
+ }
+ }
+ return "";
+}
+
sub getTreeAttr_Args($)
{
if($_[0] and my $Info = $LibInfo{$Version}{"info"}{$_[0]})
@@ -5612,7 +6055,7 @@ sub getNameSpace($)
return "";
}
}
- elsif($InfoType eq "record_type")
+ elsif($InfoType ne "function_decl")
{ # inside data type
my ($Name, $NameNS) = getTrivialName(getTypeDeclId($NSInfoId), $NSInfoId);
return $Name;
@@ -7153,8 +7596,12 @@ sub get_Signature($$)
$ParamTypeName=~s/\b\Q$Typedef\E\b/$Base/g;
}
}
- if(my $ParamName = $CompleteSignature{$LibVersion}{$Symbol}{"Param"}{$Pos}{"name"}) {
- push(@ParamArray, create_member_decl($ParamTypeName, $ParamName));
+ if(my $ParamName = $CompleteSignature{$LibVersion}{$Symbol}{"Param"}{$Pos}{"name"})
+ {
+ if($ParamName ne "this" or $Symbol!~/\A(_Z|\?)/)
+ { # do NOT show first hidded "this"-parameter
+ push(@ParamArray, create_member_decl($ParamTypeName, $ParamName));
+ }
}
else {
push(@ParamArray, $ParamTypeName);
@@ -8622,7 +9069,7 @@ sub addTargetHeaders($)
{
my $Dir = get_dirname($RecInc);
- if(familiarDirs($Dir, $RegDir)
+ if(familiarDirs($RegDir, $Dir)
or $RecursiveIncludes{$LibVersion}{$RegHeader}{$RecInc}!=1)
{ # in the same directory or included by #include "..."
$TargetHeaders{$LibVersion}{get_filename($RecInc)} = 1;
@@ -8637,17 +9084,48 @@ sub familiarDirs($$)
if($D1 eq $D2) {
return 1;
}
- while($D1=~s/[\/\\]+.*?\Z//)
+
+ my $U1 = index($D1, "/usr/");
+ my $U2 = index($D2, "/usr/");
+
+ if($U1==0 and $U2!=0) {
+ return 0;
+ }
+
+ if($U2==0 and $U1!=0) {
+ return 0;
+ }
+
+ if(index($D2, $D1."/")==0) {
+ return 1;
+ }
+
+ # /usr/include/DIR
+ # /home/user/DIR
+
+ my $DL = get_depth($D1);
+
+ my @Dirs1 = ($D1);
+ while($DL - get_depth($D1)<=2
+ and get_depth($D1)>=4
+ and $D1=~s/[\/\\]+[^\/\\]*?\Z//) {
+ push(@Dirs1, $D1);
+ }
+
+ my @Dirs2 = ($D2);
+ while(get_depth($D2)>=4
+ and $D2=~s/[\/\\]+[^\/\\]*?\Z//) {
+ push(@Dirs2, $D2);
+ }
+
+ foreach my $P1 (@Dirs1)
{
- $D2=~s/[\/\\]+.*?\Z//;
- if(not $D1 or not $D2) {
- return 0;
- }
- if($D1 eq "/usr/include") {
- return 0;
- }
- if($D1 eq $D2) {
- return 1;
+ foreach my $P2 (@Dirs2)
+ {
+
+ if($P1 eq $P2) {
+ return 1;
+ }
}
}
return 0;
@@ -9038,70 +9516,153 @@ sub prepareSymbols($)
}
}
-sub register_TypeUsage($$)
+sub getFirst($$)
{
- my ($TypeId, $LibVersion) = @_;
+ my ($Tid, $LibVersion) = @_;
+ if(not $Tid) {
+ return $Tid;
+ }
+
+ if(my $Name = $TypeInfo{$LibVersion}{$Tid}{"Name"})
+ {
+ if($TName_Tid{$LibVersion}{$Name}) {
+ return $TName_Tid{$LibVersion}{$Name};
+ }
+ }
+
+ return $Tid;
+}
+
+sub register_SymbolUsage($$$)
+{
+ my ($InfoId, $UsedType, $LibVersion) = @_;
+
+ my %FuncInfo = %{$SymbolInfo{$LibVersion}{$InfoId}};
+ if(my $RTid = getFirst($FuncInfo{"Return"}, $LibVersion))
+ {
+ register_TypeUsage($RTid, $UsedType, $LibVersion);
+ $SymbolInfo{$LibVersion}{$InfoId}{"Return"} = $RTid;
+ }
+ if(my $FCid = getFirst($FuncInfo{"Class"}, $LibVersion))
+ {
+ register_TypeUsage($FCid, $UsedType, $LibVersion);
+ $SymbolInfo{$LibVersion}{$InfoId}{"Class"} = $FCid;
+
+ if(my $ThisId = getTypeIdByName($TypeInfo{$LibVersion}{$FCid}{"Name"}."*const", $LibVersion))
+ { # register "this" pointer
+ register_TypeUsage($ThisId, $UsedType, $LibVersion);
+ }
+ if(my $ThisId_C = getTypeIdByName($TypeInfo{$LibVersion}{$FCid}{"Name"}."const*const", $LibVersion))
+ { # register "this" pointer (const method)
+ register_TypeUsage($ThisId_C, $UsedType, $LibVersion);
+ }
+ }
+ foreach my $PPos (keys(%{$FuncInfo{"Param"}}))
+ {
+ if(my $PTid = getFirst($FuncInfo{"Param"}{$PPos}{"type"}, $LibVersion))
+ {
+ register_TypeUsage($PTid, $UsedType, $LibVersion);
+ $FuncInfo{"Param"}{$PPos}{"type"} = $PTid;
+ }
+ }
+ foreach my $TPos (keys(%{$FuncInfo{"TParam"}}))
+ {
+ my $TPName = $FuncInfo{"TParam"}{$TPos}{"name"};
+ if(my $TTid = $TName_Tid{$LibVersion}{$TPName}) {
+ register_TypeUsage($TTid, $UsedType, $LibVersion);
+ }
+ }
+}
+
+sub register_TypeUsage($$$)
+{
+ my ($TypeId, $UsedType, $LibVersion) = @_;
if(not $TypeId) {
- return 0;
+ return;
}
- if($UsedType{$LibVersion}{$TypeId})
+ if($UsedType->{$TypeId})
{ # already registered
- return 1;
+ return;
}
+
my %TInfo = get_Type($TypeId, $LibVersion);
if($TInfo{"Type"})
{
- if($TInfo{"Type"}=~/\A(Struct|Union|Class|FuncPtr|MethodPtr|FieldPtr|Enum)\Z/)
+ if(my $NS = $TInfo{"NameSpace"})
{
- $UsedType{$LibVersion}{$TypeId} = 1;
+ if(my $NSTid = $TName_Tid{$LibVersion}{$NS}) {
+ register_TypeUsage($NSTid, $UsedType, $LibVersion);
+ }
+ }
+
+ if($TInfo{"Type"}=~/\A(Struct|Union|Class|FuncPtr|Func|MethodPtr|FieldPtr|Enum)\Z/)
+ {
+ $UsedType->{$TypeId} = 1;
if($TInfo{"Type"}=~/\A(Struct|Class)\Z/)
{
- foreach my $BaseId (keys(%{$TInfo{"Base"}}))
- { # register base classes
- register_TypeUsage($BaseId, $LibVersion);
+ foreach my $BaseId (keys(%{$TInfo{"Base"}})) {
+ register_TypeUsage($BaseId, $UsedType, $LibVersion);
}
foreach my $TPos (keys(%{$TInfo{"TParam"}}))
{
my $TPName = $TInfo{"TParam"}{$TPos}{"name"};
if(my $TTid = $TName_Tid{$LibVersion}{$TPName}) {
- register_TypeUsage($TTid, $LibVersion);
+ register_TypeUsage($TTid, $UsedType, $LibVersion);
}
}
}
foreach my $Memb_Pos (keys(%{$TInfo{"Memb"}}))
{
- if(my $MTid = $TInfo{"Memb"}{$Memb_Pos}{"type"}) {
- register_TypeUsage($MTid, $LibVersion);
+ if(my $MTid = getFirst($TInfo{"Memb"}{$Memb_Pos}{"type"}, $LibVersion))
+ {
+ register_TypeUsage($MTid, $UsedType, $LibVersion);
+ $TInfo{"Memb"}{$Memb_Pos}{"type"} = $MTid;
}
}
if($TInfo{"Type"} eq "FuncPtr"
- or $TInfo{"Type"} eq "MethodPtr")
+ or $TInfo{"Type"} eq "MethodPtr"
+ or $TInfo{"Type"} eq "Func")
{
if(my $RTid = $TInfo{"Return"}) {
- register_TypeUsage($RTid, $LibVersion);
+ register_TypeUsage($RTid, $UsedType, $LibVersion);
}
- foreach my $Memb_Pos (keys(%{$TInfo{"Param"}}))
+ foreach my $PPos (keys(%{$TInfo{"Param"}}))
{
- if(my $MTid = $TInfo{"Param"}{$Memb_Pos}{"type"}) {
- register_TypeUsage($MTid, $LibVersion);
+ if(my $PTid = $TInfo{"Param"}{$PPos}{"type"}) {
+ register_TypeUsage($PTid, $UsedType, $LibVersion);
}
}
}
- return 1;
+ if($TInfo{"Type"} eq "FieldPtr")
+ {
+ if(my $RTid = $TInfo{"Return"}) {
+ register_TypeUsage($RTid, $UsedType, $LibVersion);
+ }
+ if(my $CTid = $TInfo{"Class"}) {
+ register_TypeUsage($CTid, $UsedType, $LibVersion);
+ }
+ }
+ if($TInfo{"Type"} eq "MethodPtr")
+ {
+ if(my $CTid = $TInfo{"Class"}) {
+ register_TypeUsage($CTid, $UsedType, $LibVersion);
+ }
+ }
}
elsif($TInfo{"Type"}=~/\A(Const|ConstVolatile|Volatile|Pointer|Ref|Restrict|Array|Typedef)\Z/)
{
- $UsedType{$LibVersion}{$TypeId} = 1;
- register_TypeUsage($TInfo{"BaseType"}, $LibVersion);
- return 1;
+ $UsedType->{$TypeId} = 1;
+ if(my $BTid = getFirst($TInfo{"BaseType"}, $LibVersion))
+ {
+ register_TypeUsage($BTid, $UsedType, $LibVersion);
+ $TypeInfo{$LibVersion}{$TypeId}{"BaseType"} = $BTid;
+ }
}
- elsif($TInfo{"Type"} eq "Intrinsic")
- {
- $UsedType{$LibVersion}{$TypeId} = 1;
- return 1;
+ else
+ { # Intrinsic, TemplateParam, TypeName, SizeOf, etc.
+ $UsedType->{$TypeId} = 1;
}
}
- return 0;
}
sub selectSymbol($$$$)
@@ -9132,7 +9693,7 @@ sub selectSymbol($$$$)
$Target = 1;
}
}
- if($CheckHeadersOnly)
+ if($CheckHeadersOnly or $Level eq "Source")
{
if($Target)
{
@@ -9213,13 +9774,20 @@ sub cleanDump($)
my $LibVersion = $_[0];
foreach my $InfoId (keys(%{$SymbolInfo{$LibVersion}}))
{
+ if(not keys(%{$SymbolInfo{$LibVersion}{$InfoId}}))
+ {
+ delete($SymbolInfo{$LibVersion}{$InfoId});
+ next;
+ }
my $MnglName = $SymbolInfo{$LibVersion}{$InfoId}{"MnglName"};
- if(not $MnglName) {
+ if(not $MnglName)
+ {
delete($SymbolInfo{$LibVersion}{$InfoId});
next;
}
my $ShortName = $SymbolInfo{$LibVersion}{$InfoId}{"ShortName"};
- if(not $ShortName) {
+ if(not $ShortName)
+ {
delete($SymbolInfo{$LibVersion}{$InfoId});
next;
}
@@ -9236,6 +9804,11 @@ sub cleanDump($)
}
foreach my $Tid (keys(%{$TypeInfo{$LibVersion}}))
{
+ if(not keys(%{$TypeInfo{$LibVersion}{$Tid}}))
+ {
+ delete($TypeInfo{$LibVersion}{$Tid});
+ next;
+ }
delete($TypeInfo{$LibVersion}{$Tid}{"Tid"});
foreach my $Attr ("Header", "Line", "Size", "NameSpace")
{
@@ -9285,66 +9858,190 @@ sub selectType($$)
return 0;
}
-sub removeUnused($$)
+sub remove_Unused($$)
{ # remove unused data types from the ABI dump
my ($LibVersion, $Kind) = @_;
- foreach my $InfoId (keys(%{$SymbolInfo{$LibVersion}}))
+
+ my %UsedType = ();
+
+ foreach my $InfoId (sort {int($a)<=>int($b)} keys(%{$SymbolInfo{$LibVersion}}))
{
- my %FuncInfo = %{$SymbolInfo{$LibVersion}{$InfoId}};
- if(my $RTid = $FuncInfo{"Return"}) {
- register_TypeUsage($RTid, $LibVersion);
+ register_SymbolUsage($InfoId, \%UsedType, $LibVersion);
+ }
+ foreach my $Tid (sort {int($a)<=>int($b)} keys(%{$TypeInfo{$LibVersion}}))
+ {
+ if($UsedType{$Tid})
+ { # All & Extended
+ next;
+ }
+
+ if($Kind eq "Extended")
+ {
+ if(selectType($Tid, $LibVersion))
+ {
+ my %Tree = ();
+ register_TypeUsage($Tid, \%Tree, $LibVersion);
+
+ my $Tmpl = 0;
+ foreach (sort {int($a)<=>int($b)} keys(%Tree))
+ {
+ if(defined $TypeInfo{$LibVersion}{$_}{"Template"}
+ or $TypeInfo{$LibVersion}{$_}{"Type"} eq "TemplateParam")
+ {
+ $Tmpl = 1;
+ last;
+ }
+ }
+ if(not $Tmpl)
+ {
+ foreach (keys(%Tree)) {
+ $UsedType{$_} = 1;
+ }
+ }
+ }
+ }
+ }
+
+ my %Delete = ();
+
+ foreach my $Tid (sort {int($a)<=>int($b)} keys(%{$TypeInfo{$LibVersion}}))
+ { # remove unused types
+ if($UsedType{$Tid})
+ { # All & Extended
+ next;
}
- if(my $FCid = $FuncInfo{"Class"})
+
+ if($Kind eq "Extra")
{
- register_TypeUsage($FCid, $LibVersion);
- if(my $ThisId = getTypeIdByName($TypeInfo{$LibVersion}{$FCid}{"Name"}."*const", $LibVersion))
- { # register "this" pointer
- $UsedType{$LibVersion}{$ThisId} = 1;
- if(my %ThisType = get_Type($ThisId, $LibVersion)) {
- register_TypeUsage($ThisType{"BaseType"}, $LibVersion);
+ my %Tree = ();
+ register_TypeUsage($Tid, \%Tree, $LibVersion);
+
+ foreach (sort {int($a)<=>int($b)} keys(%Tree))
+ {
+ if(defined $TypeInfo{$LibVersion}{$_}{"Template"}
+ or $TypeInfo{$LibVersion}{$_}{"Type"} eq "TemplateParam")
+ {
+ $Delete{$Tid} = 1;
+ last;
}
}
}
- foreach my $PPos (keys(%{$FuncInfo{"Param"}}))
+ else
{
- if(my $PTid = $FuncInfo{"Param"}{$PPos}{"type"}) {
- register_TypeUsage($PTid, $LibVersion);
+ # remove type
+ delete($TypeInfo{$LibVersion}{$Tid});
+ }
+ }
+
+ if($Kind eq "Extra")
+ { # remove duplicates
+ foreach my $Tid (sort {int($a)<=>int($b)} keys(%{$TypeInfo{$LibVersion}}))
+ {
+ if($UsedType{$Tid})
+ { # All & Extended
+ next;
+ }
+
+ my $Name = $TypeInfo{$LibVersion}{$Tid}{"Name"};
+
+ if($TName_Tid{$LibVersion}{$Name} ne $Tid) {
+ delete($TypeInfo{$LibVersion}{$Tid});
}
}
- foreach my $TPos (keys(%{$FuncInfo{"TParam"}}))
+ }
+
+ foreach my $Tid (keys(%Delete))
+ {
+ delete($TypeInfo{$LibVersion}{$Tid});
+ }
+}
+
+sub check_Completeness($$)
+{
+ my ($Info, $LibVersion) = @_;
+
+ # data types
+ if(defined $Info->{"Memb"})
+ {
+ foreach my $Pos (keys(%{$Info->{"Memb"}}))
{
- my $TPName = $FuncInfo{"TParam"}{$TPos}{"name"};
- if(my $TTid = $TName_Tid{$LibVersion}{$TPName}) {
- register_TypeUsage($TTid, $LibVersion);
+ if(defined $Info->{"Memb"}{$Pos}{"type"}) {
+ check_TypeInfo($Info->{"Memb"}{$Pos}{"type"}, $LibVersion);
}
}
}
- foreach my $Tid (keys(%{$TypeInfo{$LibVersion}}))
+ if(defined $Info->{"Base"})
{
- if($UsedType{$LibVersion}{$Tid})
- { # All & Extended
- next;
+ foreach my $Bid (keys(%{$Info->{"Base"}})) {
+ check_TypeInfo($Bid, $LibVersion);
}
-
- if($Kind eq "Extended")
+ }
+ if(defined $Info->{"BaseType"}) {
+ check_TypeInfo($Info->{"BaseType"}, $LibVersion);
+ }
+ if(defined $Info->{"TParam"})
+ {
+ foreach my $Pos (keys(%{$Info->{"TParam"}}))
{
- if(selectType($Tid, $LibVersion)) {
- register_TypeUsage($Tid, $LibVersion);
+ my $TName = $Info->{"TParam"}{$Pos}{"name"};
+ if($TName=~/\A\(.+\)(true|false|\d.*)\Z/) {
+ next;
+ }
+ if($TName eq "_BoolType") {
+ next;
+ }
+ if($TName=~/\Asizeof\(/) {
+ next;
+ }
+ if(my $Tid = $TName_Tid{$LibVersion}{$TName}) {
+ check_TypeInfo($Tid, $LibVersion);
+ }
+ else
+ {
+ if(defined $Debug) {
+ printMsg("WARNING", "missed type $TName");
+ }
}
}
}
- foreach my $Tid (keys(%{$TypeInfo{$LibVersion}}))
- { # remove unused types
- if($UsedType{$LibVersion}{$Tid})
- { # All & Extended
- next;
+
+ # symbols
+ if(defined $Info->{"Param"})
+ {
+ foreach my $Pos (keys(%{$Info->{"Param"}}))
+ {
+ if(defined $Info->{"Param"}{$Pos}{"type"}) {
+ check_TypeInfo($Info->{"Param"}{$Pos}{"type"}, $LibVersion);
+ }
}
- # remove type
- delete($TypeInfo{$LibVersion}{$Tid});
}
+ if(defined $Info->{"Return"}) {
+ check_TypeInfo($Info->{"Return"}, $LibVersion);
+ }
+ if(defined $Info->{"Class"}) {
+ check_TypeInfo($Info->{"Class"}, $LibVersion);
+ }
+}
+
+sub check_TypeInfo($$)
+{
+ my ($Tid, $LibVersion) = @_;
- # clean memory
- %UsedType = ();
+ if(defined $CheckedTypeInfo{$LibVersion}{$Tid}) {
+ return;
+ }
+ $CheckedTypeInfo{$LibVersion}{$Tid} = 1;
+
+ if(defined $TypeInfo{$LibVersion}{$Tid})
+ {
+ if(not $TypeInfo{$LibVersion}{$Tid}{"Name"}) {
+ printMsg("ERROR", "missed type name ($Tid)");
+ }
+ check_Completeness($TypeInfo{$LibVersion}{$Tid}, $LibVersion);
+ }
+ else {
+ printMsg("ERROR", "missed type id $Tid");
+ }
}
sub selfTypedef($$)
@@ -10815,9 +11512,14 @@ sub mergeTypes($$$)
}
}
- if(not $Type1_Pure{"Size"} or not $Type2_Pure{"Size"})
+ if(not $Type1_Pure{"Size"}
+ or not $Type2_Pure{"Size"})
{ # including a case when "class Class { ... };" changed to "class Class;"
- return ();
+ if(not defined $Type1_Pure{"Memb"} or not defined $Type2_Pure{"Memb"}
+ or index($Type1_Pure{"Name"}, "<")==-1 or index($Type2_Pure{"Name"}, "<")==-1)
+ { # NOTE: template instances have no size
+ return ();
+ }
}
if(isRecurType($Type1_Pure{"Tid"}, $Type2_Pure{"Tid"}, \@RecurTypes))
{ # skip recursive declarations
@@ -13465,11 +14167,11 @@ sub mergeParameters($$$$$$)
return;
}
- if(index($Symbol, "_Z")==0)
- { # do not merge this
- if($PName1 eq "this" or $PName2 eq "this") {
- return;
- }
+ if(index($Symbol, "_Z")==0)
+ { # do not merge "this"
+ if($PName1 eq "this" or $PName2 eq "this") {
+ return;
+ }
}
my %Type1 = get_Type($PType1_Id, 1);
@@ -13545,8 +14247,10 @@ sub mergeParameters($$$$$$)
}
}
}
- if(checkDump(1, "2.0") and checkDump(2, "2.0"))
+ if(checkDump(1, "2.0") and checkDump(2, "2.0")
+ and $UsedDump{1}{"V"} ne "3.1" and $UsedDump{2}{"V"} ne "3.1")
{ # "default" attribute added in ACC 1.22 (dump 2.0 format)
+ # broken in 3.1, fixed in 3.2
my $Value_Old = $CompleteSignature{1}{$Symbol}{"Param"}{$ParamPos1}{"default"};
my $Value_New = $CompleteSignature{2}{$PSymbol}{"Param"}{$ParamPos2}{"default"};
if(not checkDump(1, "2.13")
@@ -14746,7 +15450,8 @@ sub getArch($)
if($Arch=~/\A([\w]{3,})(-|\Z)/) {
$Arch = $1;
}
- $Arch = "x86" if($Arch=~/\Ai[3-7]86\Z/);
+ $Arch = "x86" if($Arch=~/\Ai[3-7]86\Z/i);
+ $Arch = "x86_64" if($Arch=~/\Aamd64\Z/i);
if($OSgroup eq "windows")
{
$Arch = "x86" if($Arch=~/win32|mingw32/i);
@@ -16383,23 +17088,6 @@ sub simpleVEntry($)
$VEntry=~s/\A0u\Z/(int (*)(...))0/;
$VEntry=~s/\A4294967268u\Z/(int (*)(...))-0x000000004/;
$VEntry=~s/\A&_Z\Z/& _Z/;
- # templates
- if($VEntry=~s/ \[with (\w+) = (.+?)(, [^=]+ = .+|])\Z//g)
- { # std::basic_streambuf<_CharT, _Traits>::imbue [with _CharT = char, _Traits = std::char_traits<char>]
- # become std::basic_streambuf<char, ...>::imbue
- my ($Pname, $Pval) = ($1, $2);
- if($Pname eq "_CharT" and $VEntry=~/\Astd::/)
- { # stdc++ typedefs
- $VEntry=~s/<$Pname(, [^<>]+|)>/<$Pval>/g;
- # FIXME: simplify names using stdcxx typedefs (StdCxxTypedef)
- # The typedef info should be added to ABI dumps
- }
- else
- {
- $VEntry=~s/<$Pname>/<$Pval>/g;
- $VEntry=~s/<$Pname, [^<>]+>/<$Pval, ...>/g;
- }
- }
$VEntry=~s/([^:]+)::\~([^:]+)\Z/~$1/; # destructors
return $VEntry;
}
@@ -17113,7 +17801,8 @@ sub checkPreprocessedUnit($)
delete($Constants{$Version}{$Constant});
next;
}
- if(not $ExtraDump and ($Constant=~/_h\Z/i or isBuiltIn($Constants{$Version}{$Constant}{"Header"})))
+ if(not $ExtraDump and ($Constant=~/_h\Z/i
+ or isBuiltIn($Constants{$Version}{$Constant}{"Header"})))
{ # skip
delete($Constants{$Version}{$Constant});
}
@@ -19085,7 +19774,7 @@ sub read_ABI_Dump($$)
{
$MAX_ID = $Tid if($Tid>$MAX_ID);
$MAX_ID = $TDid if($TDid and $TDid>$MAX_ID);
- $Tid_TDid{$Tid}{$TDid}=1;
+ $Tid_TDid{$Tid}{$TDid} = 1;
}
}
my %NewID = ();
@@ -19101,12 +19790,11 @@ sub read_ABI_Dump($$)
}
else
{
- if(my $ID = ++$MAX_ID)
- {
- $NewID{$TDid}{$Tid} = $ID;
- %{$TypeInfo{$LibVersion}{$ID}} = %{$TInfo->{$TDid}{$Tid}};
- $TypeInfo{$LibVersion}{$ID}{"Tid"} = $ID;
- }
+ my $ID = ++$MAX_ID;
+
+ $NewID{$TDid}{$Tid} = $ID;
+ %{$TypeInfo{$LibVersion}{$ID}} = %{$TInfo->{$TDid}{$Tid}};
+ $TypeInfo{$LibVersion}{$ID}{"Tid"} = $ID;
}
}
}
@@ -19273,6 +19961,35 @@ sub read_ABI_Dump($$)
}
}
+ if(not checkDump($LibVersion, "3.2"))
+ { # support for old ABI dumps
+ foreach my $TypeId (sort {int($a)<=>int($b)} keys(%{$TypeInfo{$LibVersion}}))
+ {
+ if(defined $TypeInfo{$LibVersion}{$TypeId}{"VTable"})
+ {
+ foreach my $Offset (keys(%{$TypeInfo{$LibVersion}{$TypeId}{"VTable"}})) {
+ $TypeInfo{$LibVersion}{$TypeId}{"VTable"}{$Offset} = simplifyVTable($TypeInfo{$LibVersion}{$TypeId}{"VTable"}{$Offset});
+ }
+ }
+ }
+
+ # repair target headers list
+ delete($TargetHeaders{$LibVersion});
+ foreach (keys(%{$Registered_Headers{$LibVersion}})) {
+ $TargetHeaders{$LibVersion}{get_filename($_)}=1;
+ }
+
+ # non-target constants from anon enums
+ foreach my $Name (keys(%{$Constants{$LibVersion}}))
+ {
+ if(not $ExtraDump
+ and not is_target_header($Constants{$LibVersion}{$Name}{"Header"}, $LibVersion))
+ {
+ delete($Constants{$LibVersion}{$Name});
+ }
+ }
+ }
+
if(not checkDump($LibVersion, "2.20"))
{ # support for old ABI dumps
foreach my $TypeId (sort {int($a)<=>int($b)} keys(%{$TypeInfo{$LibVersion}}))
@@ -21007,9 +21724,6 @@ sub initLogging($)
{ # enable --extra-info
$ExtraInfo = $DEBUG_PATH{$LibVersion}."/extra-info";
}
-
- # enable --extra-dump
- $ExtraDump = 1;
}
resetLogging($LibVersion);
}
diff --git a/doc/Changes.html b/doc/Changes.html
index 2e157e2..1745d05 100644
--- a/doc/Changes.html
+++ b/doc/Changes.html
@@ -21,7 +21,7 @@
</style>
<script src="/load.php?debug=false&amp;lang=en&amp;modules=startup&amp;only=scripts&amp;skin=monobook&amp;*"></script>
<script>if(window.mw){
- mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker_Downloads", "wgTitle": "ABI Compliance Checker Downloads", "wgCurRevisionId": 8283, "wgArticleId": 2293, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []});
+ mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker_Downloads", "wgTitle": "ABI Compliance Checker Downloads", "wgCurRevisionId": 8289, "wgArticleId": 2293, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []});
}
</script><script>if(window.mw){
mw.loader.load(["mediawiki.page.startup"]);
@@ -43,53 +43,82 @@
</p>
<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Version_1.99.1_.28June_07.2C_2013.29"><span class="tocnumber">1</span> <span class="toctext">Version 1.99.1 (June 07, 2013)</span></a></li>
-<li class="toclevel-1 tocsection-2"><a href="#Version_1.99_.28May_24.2C_2013.29"><span class="tocnumber">2</span> <span class="toctext">Version 1.99 (May 24, 2013)</span></a></li>
-<li class="toclevel-1 tocsection-3"><a href="#Version_1.98.8_.28February_07.2C_2013.29"><span class="tocnumber">3</span> <span class="toctext">Version 1.98.8 (February 07, 2013)</span></a></li>
-<li class="toclevel-1 tocsection-4"><a href="#Version_1.98.7_.28December_14.2C_2012.29"><span class="tocnumber">4</span> <span class="toctext">Version 1.98.7 (December 14, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-5"><a href="#Version_1.98.6_.28December_04.2C_2012.29"><span class="tocnumber">5</span> <span class="toctext">Version 1.98.6 (December 04, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-6"><a href="#Version_1.98.5_.28November_30.2C_2012.29"><span class="tocnumber">6</span> <span class="toctext">Version 1.98.5 (November 30, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-7"><a href="#Version_1.98.4_.28October_18.2C_2012.29"><span class="tocnumber">7</span> <span class="toctext">Version 1.98.4 (October 18, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-8"><a href="#Version_1.98.3_.28July_19.2C_2012.29"><span class="tocnumber">8</span> <span class="toctext">Version 1.98.3 (July 19, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-9"><a href="#Version_1.98.2_.28June_26.2C_2012.29"><span class="tocnumber">9</span> <span class="toctext">Version 1.98.2 (June 26, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-10"><a href="#Version_1.98.1_.28June_18.2C_2012.29"><span class="tocnumber">10</span> <span class="toctext">Version 1.98.1 (June 18, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-11"><a href="#Version_1.98.0_.28June_14.2C_2012.29"><span class="tocnumber">11</span> <span class="toctext">Version 1.98.0 (June 14, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-12"><a href="#Version_1.97.8_.28June_08.2C_2012.29"><span class="tocnumber">12</span> <span class="toctext">Version 1.97.8 (June 08, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-13"><a href="#Version_1.97.5_.28May_14.2C_2012.29"><span class="tocnumber">13</span> <span class="toctext">Version 1.97.5 (May 14, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-14"><a href="#Version_1.97.4_.28April_16.2C_2012.29"><span class="tocnumber">14</span> <span class="toctext">Version 1.97.4 (April 16, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-15"><a href="#Version_1.97.3_.28April_03.2C_2012.29"><span class="tocnumber">15</span> <span class="toctext">Version 1.97.3 (April 03, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-16"><a href="#Version_1.96.8_.28February_17.2C_2012.29"><span class="tocnumber">16</span> <span class="toctext">Version 1.96.8 (February 17, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-17"><a href="#Version_1.94_.28September_09.2C_2011.29"><span class="tocnumber">17</span> <span class="toctext">Version 1.94 (September 09, 2011)</span></a></li>
-<li class="toclevel-1 tocsection-18"><a href="#Version_1.93.8_.28September_08.2C_2011.29"><span class="tocnumber">18</span> <span class="toctext">Version 1.93.8 (September 08, 2011)</span></a></li>
-<li class="toclevel-1 tocsection-19"><a href="#Version_1.23.5_.28July_01.2C_2011.29"><span class="tocnumber">19</span> <span class="toctext">Version 1.23.5 (July 01, 2011)</span></a></li>
-<li class="toclevel-1 tocsection-20"><a href="#Version_1.23_.28June_07.2C_2011.29"><span class="tocnumber">20</span> <span class="toctext">Version 1.23 (June 07, 2011)</span></a></li>
-<li class="toclevel-1 tocsection-21"><a href="#Version_1.21.12_.28April_29.2C_2011.29"><span class="tocnumber">21</span> <span class="toctext">Version 1.21.12 (April 29, 2011)</span></a></li>
-<li class="toclevel-1 tocsection-22"><a href="#Version_1.21_.28August_19.2C_2010.29"><span class="tocnumber">22</span> <span class="toctext">Version 1.21 (August 19, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-23"><a href="#Version_1.20_.28August_30.2C_2010.29"><span class="tocnumber">23</span> <span class="toctext">Version 1.20 (August 30, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-24"><a href="#Version_1.19_.28July_22.2C_2010.29"><span class="tocnumber">24</span> <span class="toctext">Version 1.19 (July 22, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-25"><a href="#Version_1.18_.28June_25.2C_2010.29"><span class="tocnumber">25</span> <span class="toctext">Version 1.18 (June 25, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-26"><a href="#Version_1.17.2_.28June_16.2C_2010.29"><span class="tocnumber">26</span> <span class="toctext">Version 1.17.2 (June 16, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-27"><a href="#Version_1.17.1_.28June_09.2C_2010.29"><span class="tocnumber">27</span> <span class="toctext">Version 1.17.1 (June 09, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-28"><a href="#Version_1.17_.28June_08.2C_2010.29"><span class="tocnumber">28</span> <span class="toctext">Version 1.17 (June 08, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-29"><a href="#Version_1.16_.28May_05.2C_2010.29"><span class="tocnumber">29</span> <span class="toctext">Version 1.16 (May 05, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-30"><a href="#Version_1.15_.28March_26.2C_2010.29"><span class="tocnumber">30</span> <span class="toctext">Version 1.15 (March 26, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-31"><a href="#Version_1.14_.28March_03.2C_2010.29"><span class="tocnumber">31</span> <span class="toctext">Version 1.14 (March 03, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-32"><a href="#Version_1.13_.28February_16.2C_2010.29"><span class="tocnumber">32</span> <span class="toctext">Version 1.13 (February 16, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-33"><a href="#Version_1.12_.28December_04.2C_2009.29"><span class="tocnumber">33</span> <span class="toctext">Version 1.12 (December 04, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-34"><a href="#Version_1.11_.28November_10.2C_2009.29"><span class="tocnumber">34</span> <span class="toctext">Version 1.11 (November 10, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-35"><a href="#Version_1.10_.28November_02.2C_2009.29"><span class="tocnumber">35</span> <span class="toctext">Version 1.10 (November 02, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-36"><a href="#Version_1.9_.28October_12.2C_2009.29"><span class="tocnumber">36</span> <span class="toctext">Version 1.9 (October 12, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-37"><a href="#Version_1.8_.28September_29.2C_2009.29"><span class="tocnumber">37</span> <span class="toctext">Version 1.8 (September 29, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-38"><a href="#Version_1.7_.28September_11.2C_2009.29"><span class="tocnumber">38</span> <span class="toctext">Version 1.7 (September 11, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-39"><a href="#Version_1.6_.28August_31.2C_2009.29"><span class="tocnumber">39</span> <span class="toctext">Version 1.6 (August 31, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-40"><a href="#Version_1.5_.28August_25.2C_2009.29"><span class="tocnumber">40</span> <span class="toctext">Version 1.5 (August 25, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-41"><a href="#Version_1.4_.28August_18.2C_2009.29"><span class="tocnumber">41</span> <span class="toctext">Version 1.4 (August 18, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-42"><a href="#Version_1.3_.28August_14.2C_2009.29"><span class="tocnumber">42</span> <span class="toctext">Version 1.3 (August 14, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-43"><a href="#Version_1.2_.28August_07.2C_2009.29"><span class="tocnumber">43</span> <span class="toctext">Version 1.2 (August 07, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-44"><a href="#Version_1.1_.28August_06.2C_2009.29"><span class="tocnumber">44</span> <span class="toctext">Version 1.1 (August 06, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-45"><a href="#Version_1.0_.28July_31.2C_2009.29"><span class="tocnumber">45</span> <span class="toctext">Version 1.0 (July 31, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-1"><a href="#Version_1.99.2_.28June_24.2C_2013.29"><span class="tocnumber">1</span> <span class="toctext">Version 1.99.2 (June 24, 2013)</span></a></li>
+<li class="toclevel-1 tocsection-2"><a href="#Version_1.99.1_.28June_07.2C_2013.29"><span class="tocnumber">2</span> <span class="toctext">Version 1.99.1 (June 07, 2013)</span></a></li>
+<li class="toclevel-1 tocsection-3"><a href="#Version_1.99_.28May_24.2C_2013.29"><span class="tocnumber">3</span> <span class="toctext">Version 1.99 (May 24, 2013)</span></a></li>
+<li class="toclevel-1 tocsection-4"><a href="#Version_1.98.8_.28February_07.2C_2013.29"><span class="tocnumber">4</span> <span class="toctext">Version 1.98.8 (February 07, 2013)</span></a></li>
+<li class="toclevel-1 tocsection-5"><a href="#Version_1.98.7_.28December_14.2C_2012.29"><span class="tocnumber">5</span> <span class="toctext">Version 1.98.7 (December 14, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-6"><a href="#Version_1.98.6_.28December_04.2C_2012.29"><span class="tocnumber">6</span> <span class="toctext">Version 1.98.6 (December 04, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-7"><a href="#Version_1.98.5_.28November_30.2C_2012.29"><span class="tocnumber">7</span> <span class="toctext">Version 1.98.5 (November 30, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-8"><a href="#Version_1.98.4_.28October_18.2C_2012.29"><span class="tocnumber">8</span> <span class="toctext">Version 1.98.4 (October 18, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-9"><a href="#Version_1.98.3_.28July_19.2C_2012.29"><span class="tocnumber">9</span> <span class="toctext">Version 1.98.3 (July 19, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-10"><a href="#Version_1.98.2_.28June_26.2C_2012.29"><span class="tocnumber">10</span> <span class="toctext">Version 1.98.2 (June 26, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-11"><a href="#Version_1.98.1_.28June_18.2C_2012.29"><span class="tocnumber">11</span> <span class="toctext">Version 1.98.1 (June 18, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-12"><a href="#Version_1.98.0_.28June_14.2C_2012.29"><span class="tocnumber">12</span> <span class="toctext">Version 1.98.0 (June 14, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-13"><a href="#Version_1.97.8_.28June_08.2C_2012.29"><span class="tocnumber">13</span> <span class="toctext">Version 1.97.8 (June 08, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-14"><a href="#Version_1.97.5_.28May_14.2C_2012.29"><span class="tocnumber">14</span> <span class="toctext">Version 1.97.5 (May 14, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-15"><a href="#Version_1.97.4_.28April_16.2C_2012.29"><span class="tocnumber">15</span> <span class="toctext">Version 1.97.4 (April 16, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-16"><a href="#Version_1.97.3_.28April_03.2C_2012.29"><span class="tocnumber">16</span> <span class="toctext">Version 1.97.3 (April 03, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-17"><a href="#Version_1.96.8_.28February_17.2C_2012.29"><span class="tocnumber">17</span> <span class="toctext">Version 1.96.8 (February 17, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-18"><a href="#Version_1.94_.28September_09.2C_2011.29"><span class="tocnumber">18</span> <span class="toctext">Version 1.94 (September 09, 2011)</span></a></li>
+<li class="toclevel-1 tocsection-19"><a href="#Version_1.93.8_.28September_08.2C_2011.29"><span class="tocnumber">19</span> <span class="toctext">Version 1.93.8 (September 08, 2011)</span></a></li>
+<li class="toclevel-1 tocsection-20"><a href="#Version_1.23.5_.28July_01.2C_2011.29"><span class="tocnumber">20</span> <span class="toctext">Version 1.23.5 (July 01, 2011)</span></a></li>
+<li class="toclevel-1 tocsection-21"><a href="#Version_1.23_.28June_07.2C_2011.29"><span class="tocnumber">21</span> <span class="toctext">Version 1.23 (June 07, 2011)</span></a></li>
+<li class="toclevel-1 tocsection-22"><a href="#Version_1.21.12_.28April_29.2C_2011.29"><span class="tocnumber">22</span> <span class="toctext">Version 1.21.12 (April 29, 2011)</span></a></li>
+<li class="toclevel-1 tocsection-23"><a href="#Version_1.21_.28August_19.2C_2010.29"><span class="tocnumber">23</span> <span class="toctext">Version 1.21 (August 19, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-24"><a href="#Version_1.20_.28August_30.2C_2010.29"><span class="tocnumber">24</span> <span class="toctext">Version 1.20 (August 30, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-25"><a href="#Version_1.19_.28July_22.2C_2010.29"><span class="tocnumber">25</span> <span class="toctext">Version 1.19 (July 22, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-26"><a href="#Version_1.18_.28June_25.2C_2010.29"><span class="tocnumber">26</span> <span class="toctext">Version 1.18 (June 25, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-27"><a href="#Version_1.17.2_.28June_16.2C_2010.29"><span class="tocnumber">27</span> <span class="toctext">Version 1.17.2 (June 16, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-28"><a href="#Version_1.17.1_.28June_09.2C_2010.29"><span class="tocnumber">28</span> <span class="toctext">Version 1.17.1 (June 09, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-29"><a href="#Version_1.17_.28June_08.2C_2010.29"><span class="tocnumber">29</span> <span class="toctext">Version 1.17 (June 08, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-30"><a href="#Version_1.16_.28May_05.2C_2010.29"><span class="tocnumber">30</span> <span class="toctext">Version 1.16 (May 05, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-31"><a href="#Version_1.15_.28March_26.2C_2010.29"><span class="tocnumber">31</span> <span class="toctext">Version 1.15 (March 26, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-32"><a href="#Version_1.14_.28March_03.2C_2010.29"><span class="tocnumber">32</span> <span class="toctext">Version 1.14 (March 03, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-33"><a href="#Version_1.13_.28February_16.2C_2010.29"><span class="tocnumber">33</span> <span class="toctext">Version 1.13 (February 16, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-34"><a href="#Version_1.12_.28December_04.2C_2009.29"><span class="tocnumber">34</span> <span class="toctext">Version 1.12 (December 04, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-35"><a href="#Version_1.11_.28November_10.2C_2009.29"><span class="tocnumber">35</span> <span class="toctext">Version 1.11 (November 10, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-36"><a href="#Version_1.10_.28November_02.2C_2009.29"><span class="tocnumber">36</span> <span class="toctext">Version 1.10 (November 02, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-37"><a href="#Version_1.9_.28October_12.2C_2009.29"><span class="tocnumber">37</span> <span class="toctext">Version 1.9 (October 12, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-38"><a href="#Version_1.8_.28September_29.2C_2009.29"><span class="tocnumber">38</span> <span class="toctext">Version 1.8 (September 29, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-39"><a href="#Version_1.7_.28September_11.2C_2009.29"><span class="tocnumber">39</span> <span class="toctext">Version 1.7 (September 11, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-40"><a href="#Version_1.6_.28August_31.2C_2009.29"><span class="tocnumber">40</span> <span class="toctext">Version 1.6 (August 31, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-41"><a href="#Version_1.5_.28August_25.2C_2009.29"><span class="tocnumber">41</span> <span class="toctext">Version 1.5 (August 25, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-42"><a href="#Version_1.4_.28August_18.2C_2009.29"><span class="tocnumber">42</span> <span class="toctext">Version 1.4 (August 18, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-43"><a href="#Version_1.3_.28August_14.2C_2009.29"><span class="tocnumber">43</span> <span class="toctext">Version 1.3 (August 14, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-44"><a href="#Version_1.2_.28August_07.2C_2009.29"><span class="tocnumber">44</span> <span class="toctext">Version 1.2 (August 07, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-45"><a href="#Version_1.1_.28August_06.2C_2009.29"><span class="tocnumber">45</span> <span class="toctext">Version 1.1 (August 06, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-46"><a href="#Version_1.0_.28July_31.2C_2009.29"><span class="tocnumber">46</span> <span class="toctext">Version 1.0 (July 31, 2009)</span></a></li>
</ul>
</td></tr></table>
+<h2> <span class="mw-headline" id="Version_1.99.2_.28June_24.2C_2013.29"> Version 1.99.2 (June 24, 2013) </span></h2>
+<p><a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/archive/1.99.2.tar.gz">abi-compliance-checker-1.99.2.tar.gz</a><br />
+</p><p><b>ACC 2.0</b> pre-release.
+</p><p>This is a bug-fix release with a few new features.
+</p>
+<ul><li> <b>Improvements</b>
+<ul><li> Added missed fields of template instance types to the ABI dump
+</li><li> Improved support for old ABI dumps
+</li><li> Added Struct_Field_Size_Increased rule
+</li><li> Support for vector types (GCC extension)
+</li><li> Removed duplicates from the ABI dump
+</li><li> Corrected visualization of v-table content in the report
+</li><li> Corrected identification of target headers
+</li><li> Corrected source-compatibility check
+</li></ul>
+</li></ul>
+<ul><li> <b>New Options</b>
+<ul><li> <a href="Options.html" title="ABI Compliance Checker Options">-check</a> - to check completeness of the ABI dump
+</li></ul>
+</li></ul>
+<ul><li> <b>Bug Fixes</b>
+<ul><li> Fixed default arguments of methods (broken in 1.99.1 due to added "this" parameter)
+</li></ul>
+</li></ul>
+<ul><li> <b>Other</b>
+<ul><li> Extended test suite
+</li></ul>
+</li></ul>
<h2> <span class="mw-headline" id="Version_1.99.1_.28June_07.2C_2013.29"> Version 1.99.1 (June 07, 2013) </span></h2>
<p><a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/archive/1.99.1.tar.gz">abi-compliance-checker-1.99.1.tar.gz</a><br />
</p><p><b>ACC 2.0</b> pre-release.
@@ -1001,11 +1030,11 @@ Initial prototype of the tool.
</p>
<!--
NewPP limit report
-Preprocessor node count: 179/1000000
+Preprocessor node count: 183/1000000
Post-expand include size: 0/2097152 bytes
Template argument size: 0/2097152 bytes
Expensive parser function count: 0/100
-->
-<!-- Saved in parser cache with key rasispdb:pcache:idhash:2293-0!*!0!!en!*!* and timestamp 20130607121624 -->
+<!-- Saved in parser cache with key rasispdb:pcache:idhash:2293-0!*!0!!en!*!* and timestamp 20130624151545 -->
</div></div></div></div></div></body></html> \ No newline at end of file
diff --git a/doc/Descriptor.html b/doc/Descriptor.html
index 66039da..5556d17 100644
--- a/doc/Descriptor.html
+++ b/doc/Descriptor.html
@@ -510,5 +510,5 @@ Template argument size: 0/2097152 bytes
Expensive parser function count: 0/100
-->
-<!-- Saved in parser cache with key rasispdb:pcache:idhash:2415-0!*!*!!en!*!* and timestamp 20130607112515 -->
+<!-- Saved in parser cache with key rasispdb:pcache:idhash:2415-0!*!*!!en!*!* and timestamp 20130624085407 -->
</div></div></div></div></div></body></html> \ No newline at end of file
diff --git a/doc/Options.html b/doc/Options.html
index aff24c9..ac926bd 100644
--- a/doc/Options.html
+++ b/doc/Options.html
@@ -21,7 +21,7 @@
</style>
<script src="/load.php?debug=false&amp;lang=en&amp;modules=startup&amp;only=scripts&amp;skin=monobook&amp;*"></script>
<script>if(window.mw){
- mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker_Options", "wgTitle": "ABI Compliance Checker Options", "wgCurRevisionId": 8275, "wgArticleId": 2442, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []});
+ mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker_Options", "wgTitle": "ABI Compliance Checker Options", "wgCurRevisionId": 8290, "wgArticleId": 2442, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []});
}
</script><script>if(window.mw){
mw.loader.load(["mediawiki.page.startup"]);
@@ -265,14 +265,17 @@
<ul><li><b>-tolerant</b>
</li></ul>
<div style="padding-left:40px;">Enable highest tolerance level [1234].</div><br />
+<ul><li><b>-check</b>
+</li></ul>
+<div style="padding-left:40px;">Check completeness of the ABI dump.</div><br />
<!--
NewPP limit report
-Preprocessor node count: 85/1000000
+Preprocessor node count: 86/1000000
Post-expand include size: 0/2097152 bytes
Template argument size: 0/2097152 bytes
Expensive parser function count: 0/100
-->
-<!-- Saved in parser cache with key rasispdb:pcache:idhash:2442-0!*!0!!en!*!* and timestamp 20130607121758 -->
+<!-- Saved in parser cache with key rasispdb:pcache:idhash:2442-0!*!0!!en!*!* and timestamp 20130624151944 -->
</div></div></div></div></div></body></html> \ No newline at end of file
diff --git a/doc/Readme.html b/doc/Readme.html
index c5841b9..1f513a6 100644
--- a/doc/Readme.html
+++ b/doc/Readme.html
@@ -21,7 +21,7 @@
</style>
<script src="/load.php?debug=false&amp;lang=en&amp;modules=startup&amp;only=scripts&amp;skin=monobook&amp;*"></script>
<script>if(window.mw){
- mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker", "wgTitle": "ABI Compliance Checker", "wgCurRevisionId": 8284, "wgArticleId": 2292, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []});
+ mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker", "wgTitle": "ABI Compliance Checker", "wgCurRevisionId": 8287, "wgArticleId": 2292, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []});
}
</script><script>if(window.mw){
mw.loader.load(["mediawiki.page.startup"]);
@@ -93,7 +93,7 @@
<h2> <span class="mw-headline" id="Downloads"> Downloads </span></h2>
<h3> <span class="mw-headline" id="Releases"> Releases </span></h3>
<p>All releases can be downloaded from <b><a href="Changes.html" title="ABI Compliance Checker Downloads">this page</a></b> or <b><a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/">github.com</a></b>.
-</p><p>Latest release: <a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/archive/1.99.1.tar.gz">1.99.1</a>
+</p><p>Latest release: <a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/archive/1.99.2.tar.gz">1.99.2</a>
</p>
<h3> <span class="mw-headline" id="Git"> Git </span></h3>
<p>Read-only access to the latest development version:<br />
@@ -490,9 +490,7 @@ Check client application portability between libssh versions:<br />
</li><li> Processor ABI standards: <b><a rel="nofollow" class="external text" href="http://refspecs.freestandards.org/elf/abi386-4.pdf">Intel386</a></b>, <b><a rel="nofollow" class="external text" href="http://www.x86-64.org/documentation/abi.pdf">AMD64</a></b>, <b><a rel="nofollow" class="external text" href="http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf">ARM</a></b>, <b><a rel="nofollow" class="external text" href="http://refspecs.freestandards.org/elf/elfspec_ppc.pdf">PowerPC</a></b>, <b><a rel="nofollow" class="external text" href="http://download.boulder.ibm.com/ibmdl/pub/software/dw/linux390/docu/l390abi0.pdf">S/390</a></b>, <b><a rel="nofollow" class="external text" href="http://refspecs.freestandards.org/elf/IA64-SysV-psABI.pdf">Itanium</a></b>, <b><a rel="nofollow" class="external text" href="http://refspecs.freestandards.org/elf/mipsabi.pdf">MIPS</a></b>, <b><a rel="nofollow" class="external text" href="http://www.sparc.org/standards/psABI3rd.pdf">SPARC</a></b>, <b><a rel="nofollow" class="external text" href="http://refspecs.freestandards.org/elf/elf-pa.pdf">PA-RISK</a></b>, <b><a rel="nofollow" class="external text" href="http://www.linux-m32r.org/cmn/m32r/M32R-elf-abi.pdf">M32R</a></b>
</li><li> <a rel="nofollow" class="external text" href="http://science.webhostinggeeks.com/abi-compliance-checker"><b>Translation of this article to Serbo-Croatian</b></a>, Jovana Milutinovich
</li></ol>
-<p>nbsp;abi-compliance-checker -test
-nbsp;
-</p>
+
<!--
NewPP limit report
Preprocessor node count: 148/1000000
@@ -501,5 +499,5 @@ Template argument size: 0/2097152 bytes
Expensive parser function count: 0/100
-->
-<!-- Saved in parser cache with key rasispdb:pcache:idhash:2292-0!*!0!!en!*!* and timestamp 20130607121733 -->
+<!-- Saved in parser cache with key rasispdb:pcache:idhash:2292-0!*!0!!en!*!* and timestamp 20130624145742 -->
</div></div></div></div></div></body></html> \ No newline at end of file
diff --git a/doc/SysCheck/Descriptor.html b/doc/SysCheck/Descriptor.html
index 5caef3e..ced5d43 100644
--- a/doc/SysCheck/Descriptor.html
+++ b/doc/SysCheck/Descriptor.html
@@ -233,5 +233,5 @@ Template argument size: 0/2097152 bytes
Expensive parser function count: 0/100
-->
-<!-- Saved in parser cache with key rasispdb:pcache:idhash:2657-0!*!*!!*!*!* and timestamp 20130607084118 -->
+<!-- Saved in parser cache with key rasispdb:pcache:idhash:2657-0!*!*!!*!*!* and timestamp 20130624151648 -->
</div></div></div></div></div></body></html> \ No newline at end of file
diff --git a/doc/SysCheck/Examples.html b/doc/SysCheck/Examples.html
index db19959..9d44a66 100644
--- a/doc/SysCheck/Examples.html
+++ b/doc/SysCheck/Examples.html
@@ -239,5 +239,5 @@ Template argument size: 0/2097152 bytes
Expensive parser function count: 0/100
-->
-<!-- Saved in parser cache with key rasispdb:pcache:idhash:2656-0!*!*!!en!*!* and timestamp 20130607094743 -->
+<!-- Saved in parser cache with key rasispdb:pcache:idhash:2656-0!*!*!!en!*!* and timestamp 20130624052150 -->
</div></div></div></div></div></body></html> \ No newline at end of file
diff --git a/doc/SysCheck/Usage.html b/doc/SysCheck/Usage.html
index f9e53ce..9bd79f6 100644
--- a/doc/SysCheck/Usage.html
+++ b/doc/SysCheck/Usage.html
@@ -116,5 +116,5 @@ Template argument size: 0/2097152 bytes
Expensive parser function count: 0/100
-->
-<!-- Saved in parser cache with key rasispdb:pcache:idhash:2655-0!*!0!!en!*!* and timestamp 20130607052408 -->
+<!-- Saved in parser cache with key rasispdb:pcache:idhash:2655-0!*!0!!en!*!* and timestamp 20130624043524 -->
</div></div></div></div></div></body></html> \ No newline at end of file
diff --git a/modules/Internals/RegTests.pm b/modules/Internals/RegTests.pm
index 9bcecc2..f9b89ea 100644
--- a/modules/Internals/RegTests.pm
+++ b/modules/Internals/RegTests.pm
@@ -71,6 +71,35 @@ sub testCpp()
$SOURCE1 .= "namespace TestNS {\n";
$SOURCE2 .= "namespace TestNS {\n";
+ # Changed template internals
+ $HEADER1 .= "
+ template <typename T, int _P>
+ class $DECL_SPEC ChangedTemplate {
+ public:
+ T value;
+ T*const field;
+ T array[_P];
+ typedef int My;
+ My var;
+ };
+ ChangedTemplate<int, 1>* changedTemplate();";
+ $SOURCE1 .= "
+ ChangedTemplate<int, 1>* changedTemplate() { return new ChangedTemplate<int, 1>(); }";
+
+ $HEADER2 .= "
+ template <typename T, int _P>
+ class $DECL_SPEC ChangedTemplate {
+ public:
+ double value;
+ T* field;
+ double array[_P];
+ typedef int My;
+ My var;
+ };
+ ChangedTemplate<int, 1>* changedTemplate();";
+ $SOURCE2 .= "
+ ChangedTemplate<int, 1>* changedTemplate() { return new ChangedTemplate<int, 1>(); }";
+
# Removed inline method
$HEADER1 .= "
class $DECL_SPEC RemovedInlineMethod {