diff options
-rw-r--r-- | INSTALL | 6 | ||||
-rwxr-xr-x | Makefile.pl | 52 | ||||
-rwxr-xr-x | abi-compliance-checker.pl | 1087 | ||||
-rw-r--r-- | doc/Changes.html | 118 | ||||
-rw-r--r-- | doc/Descriptor.html | 2 | ||||
-rw-r--r-- | doc/Options.html | 2 | ||||
-rw-r--r-- | doc/Readme.html | 10 | ||||
-rw-r--r-- | doc/SysCheck/Descriptor.html | 2 | ||||
-rw-r--r-- | doc/SysCheck/Examples.html | 2 | ||||
-rw-r--r-- | doc/SysCheck/Usage.html | 2 | ||||
-rw-r--r-- | modules/Internals/RegTests.pm | 2 | ||||
-rw-r--r-- | modules/Internals/Styles/Report.css | 10 | ||||
-rw-r--r-- | modules/Internals/Styles/SymbolsList.css | 5 | ||||
-rw-r--r-- | modules/Internals/SysCheck.pm | 11 | ||||
-rw-r--r-- | modules/Internals/XmlDump.pm | 91 | ||||
-rw-r--r-- | modules/RulesSrc.xml | 4 |
16 files changed, 784 insertions, 622 deletions
@@ -9,8 +9,8 @@ All rights reserved. RELEASE INFORMATION Project: ABI Compliance Checker (ACC) -Version: 1.98.6 -Date: 2012-12-04 +Version: 1.98.7 +Date: 2012-12-14 This file explains how to install and setup environment @@ -56,7 +56,7 @@ Content: 3.1 Setup environment - 1. Add path to g++.exe (C:\MinGW\bin\) to your system PATH variable + 1. Add tool locations to the PATH environment variable 2. Run vsvars32.bat script (C:\Microsoft Visual Studio 9.0\Common7\Tools\) diff --git a/Makefile.pl b/Makefile.pl index af418d8..ee13291 100755 --- a/Makefile.pl +++ b/Makefile.pl @@ -26,6 +26,7 @@ use Getopt::Long; Getopt::Long::Configure ("posix_default", "no_ignore_case"); use File::Path qw(mkpath rmtree); +use File::Spec qw(catfile file_name_is_absolute); use File::Copy qw(copy); use File::Basename qw(dirname); use Cwd qw(abs_path); @@ -96,12 +97,6 @@ sub scenario() print $HELP_MSG; exit(0); } - if($Config{"osname"}!~/linux|freebsd|openbsd|netbsd|macos|darwin|rhapsody/) - { - print STDERR "The tool is ready-to-use without the need to install.\n"; - print STDERR "This Makefile is for GNU/Linux, FreeBSD and Mac OS X.\n"; - exit(1); - } if(not $Install and not $Update and not $Remove) { print STDERR "ERROR: command is not selected (-install, -update or -remove)\n"; @@ -112,7 +107,9 @@ sub scenario() } if(not $PREFIX) { # default prefix - $PREFIX = "/usr/local"; + if($Config{"osname"}!~/win/i) { + $PREFIX = "/usr/local"; + } } if(my $Var = $ENV{"DESTDIR"}) { @@ -124,7 +121,7 @@ sub scenario() if($DESTDIR ne "/") { $DESTDIR=~s/[\/]+\Z//g; } - if($DESTDIR!~/\A\//) + if(not isAbs($DESTDIR)) { print STDERR "ERROR: destdir is not absolute path\n"; exit(1); @@ -143,7 +140,7 @@ sub scenario() } else { - if($PREFIX!~/\A\//) + if(not isAbs($PREFIX)) { print STDERR "ERROR: prefix is not absolute path\n"; exit(1); @@ -158,9 +155,10 @@ sub scenario() print "INSTALL PREFIX: $PREFIX\n"; # paths - my $EXE_PATH = "$PREFIX/bin"; - my $MODULES_PATH = "$PREFIX/share/$TOOL_SNAME"; - my $REL_PATH = "../share/$TOOL_SNAME"; + my $EXE_PATH = catFile($PREFIX, "bin"); + my $MODULES_PATH = catFile($PREFIX, "share", $TOOL_SNAME); + my $REL_PATH = catFile("..", "share", $TOOL_SNAME); + my $TOOL_PATH = catFile($EXE_PATH, $TOOL_SNAME); if(not -w $PREFIX) { @@ -169,9 +167,11 @@ sub scenario() } if($Remove or $Update) { - # remove executable - print "-- Removing $EXE_PATH/$TOOL_SNAME\n"; - unlink($EXE_PATH."/".$TOOL_SNAME); + if(-e $EXE_PATH."/".$TOOL_SNAME) + { # remove executable + print "-- Removing $TOOL_PATH\n"; + unlink($EXE_PATH."/".$TOOL_SNAME); + } if(-d $MODULES_PATH) { # remove modules @@ -185,7 +185,7 @@ sub scenario() { # check installed if(not $Remove) { - print STDERR "ERROR: you should remove old version first (`sudo perl $0 -remove --prefix=$PREFIX`)\n"; + print STDERR "ERROR: you should remove old version first (`perl $0 -remove --prefix=$PREFIX`)\n"; exit(1); } } @@ -193,18 +193,22 @@ sub scenario() # configure my $Content = readFile($ARCHIVE_DIR."/".$TOOL_SNAME.".pl"); if($DESTDIR) { # relative path - $Content=~s/ACC_MODULES_INSTALL_PATH/$REL_PATH/; + $Content=~s/MODULES_INSTALL_PATH/$REL_PATH/; } else { # absolute path - $Content=~s/ACC_MODULES_INSTALL_PATH/$MODULES_PATH/; + $Content=~s/MODULES_INSTALL_PATH/$MODULES_PATH/; } # copy executable - print "-- Installing $EXE_PATH/$TOOL_SNAME\n"; + print "-- Installing $TOOL_PATH\n"; mkpath($EXE_PATH); writeFile($EXE_PATH."/".$TOOL_SNAME, $Content); chmod(0775, $EXE_PATH."/".$TOOL_SNAME); + if($Config{"osname"}=~/win/i) { + writeFile($EXE_PATH."/".$TOOL_SNAME.".cmd", "\@perl \"$TOOL_PATH\" \%*"); + } + # copy modules if(-d $ARCHIVE_DIR."/modules") { @@ -214,13 +218,21 @@ sub scenario() } # check PATH - if($ENV{"PATH"}!~/(\A|:)\Q$EXE_PATH\E(\Z|:)/) { + if($ENV{"PATH"}!~/(\A|[:;])\Q$EXE_PATH\E[\/\\]?(\Z|[:;])/) { print "WARNING: your PATH variable doesn't include \'$EXE_PATH\'\n"; } } exit(0); } +sub catFile(@) { + return File::Spec->catfile(@_); +} + +sub isAbs($) { + return File::Spec->file_name_is_absolute($_[0]); +} + sub copyDir($$) { my ($From, $To) = @_; diff --git a/abi-compliance-checker.pl b/abi-compliance-checker.pl index 53a79d8..ea8d832 100755 --- a/abi-compliance-checker.pl +++ b/abi-compliance-checker.pl @@ -1,6 +1,6 @@ #!/usr/bin/perl ########################################################################### -# ABI Compliance Checker (ACC) 1.98.6 +# ABI Compliance Checker (ACC) 1.98.7 # A tool for checking backward compatibility of a C/C++ library API # # Copyright (C) 2009-2010 The Linux Foundation @@ -33,7 +33,7 @@ # - Sigcheck v1.71 or newer # - Info-ZIP 3.0 (zip, unzip) # - Ctags (5.8 or newer) -# - Add gcc.exe path (C:\MinGW\bin\) to your system PATH variable +# - Add tool locations to the PATH environment variable # - Run vsvars32.bat (C:\Microsoft Visual Studio 9.0\Common7\Tools\) # # This program is free software: you can redistribute it and/or modify @@ -54,13 +54,13 @@ Getopt::Long::Configure ("posix_default", "no_ignore_case"); use File::Path qw(mkpath rmtree); use File::Temp qw(tempdir); use File::Copy qw(copy move); -use Cwd qw(abs_path cwd); +use Cwd qw(abs_path cwd realpath); use Data::Dumper; use Config; use Fcntl; -my $TOOL_VERSION = "1.98.6"; -my $ABI_DUMP_VERSION = "2.19.2"; +my $TOOL_VERSION = "1.98.7"; +my $ABI_DUMP_VERSION = "2.20"; my $OLDEST_SUPPORTED_VERSION = "1.18"; my $XML_REPORT_VERSION = "1.0"; my $XML_ABI_DUMP_VERSION = "1.2"; @@ -808,10 +808,7 @@ my $DescriptorTemplate = " <include_preamble> /* The list of header files that will be - included before other headers, one per line. - Examples: - 1) tree.h for libxml2 - 2) ft2build.h for freetype2 */ + included before other headers, one per line */ </include_preamble> <defines> @@ -1250,6 +1247,23 @@ my %ObsoleteHeaders = map {$_=>1} ( "fstream.h" ); +my %AlienHeaders = map {$_=>1} ( + # Solaris + "thread.h", + "sys/atomic.h", + # HPUX + "sys/stream.h", + # Symbian + "AknDoc.h", + # Atari ST + "ext.h", + "tos.h", + # MS-DOS + "alloc.h", + # Sparc + "sys/atomic.h" +); + my %ConfHeaders = map {$_=>1} ( "atomic", "conf.h", @@ -1355,6 +1369,10 @@ my %Constants; my %SkipConstants; my %EnumConstants; +# Extra Info +my %SymbolHeader; +my %KnownLibs; + # Types my %TypeInfo; my %TemplateInstance; @@ -1430,6 +1448,7 @@ my %WeakSymbols; # Extra Info my %UndefinedSymbols; +my %PreprocessedHeaders; # Headers my %Include_Preamble = ( @@ -1537,7 +1556,6 @@ my %Type_MaxSeverity; # Recursion locks my @RecurLib; -my @RecurSymlink; my @RecurTypes; my @RecurInclude; my @RecurConstant; @@ -1572,10 +1590,6 @@ my $ContentDivStart = "<div id=\"CONTENT_ID\" style=\"display:none;\">\n"; my $ContentDivEnd = "</div>\n"; my $Content_Counter = 0; -# XML Dump -my $TAG_ID = 0; -my $INDENT = " "; - # Modes my $JoinReport = 1; my $DoubleReport = 0; @@ -1592,8 +1606,8 @@ sub get_Modules() abs_path($TOOL_DIR), # relative path to modules abs_path($TOOL_DIR)."/../share/abi-compliance-checker", - # system directory - "ACC_MODULES_INSTALL_PATH" + # install path + 'MODULES_INSTALL_PATH' ); foreach my $DIR (@SEARCH_DIRS) { @@ -1668,12 +1682,12 @@ sub search_Tools($) { foreach my $Path (@Paths) { - if(-f joinPath($Path, $Name)) { - return joinPath($Path, $Name); + if(-f join_P($Path, $Name)) { + return join_P($Path, $Name); } if($CrossPrefix) { # user-defined prefix (arm-none-symbianelf, ...) - my $Candidate = joinPath($Path, $CrossPrefix."-".$Name); + my $Candidate = join_P($Path, $CrossPrefix."-".$Name); if(-f $Candidate) { return $Candidate; } @@ -1769,7 +1783,7 @@ sub search_Cmd($) } foreach my $Path (@{$SystemPaths{"bin"}}) { - my $CmdPath = joinPath($Path,$Name); + my $CmdPath = join_P($Path,$Name); if(-f $CmdPath) { if($Name=~/gcc/) { @@ -1814,7 +1828,7 @@ sub get_CmdPath_Default_I($) foreach my $Path (@DefaultBinPaths) { if(-f $Path."/".$Name) { - return joinPath($Path, $Name); + return join_P($Path, $Name); } } return ""; @@ -1831,7 +1845,6 @@ sub classifyPath($) } elsif($Path=~/[\/\\]/) { # directory or relative path - $Path=~s/[\/\\]+\Z//g; return (path_format($Path, $OSgroup), "Path"); } else { @@ -1976,8 +1989,11 @@ sub readDescriptor($$) $SkipHeaders{$LibVersion}{$Type}{$CPath} = 2; } $Descriptor{$LibVersion}{"GccOptions"} = parseTag(\$Content, "gcc_options"); - foreach my $Option (split(/\s*\n\s*/, $Descriptor{$LibVersion}{"GccOptions"})) { - $CompilerOptions{$LibVersion} .= " ".$Option; + foreach my $Option (split(/\s*\n\s*/, $Descriptor{$LibVersion}{"GccOptions"})) + { + if(index($Option, "-Wl")==-1) { + $CompilerOptions{$LibVersion} .= " ".$Option; + } } $Descriptor{$LibVersion}{"SkipHeaders"} = parseTag(\$Content, "skip_headers"); foreach my $Path (split(/\s*\n\s*/, $Descriptor{$LibVersion}{"SkipHeaders"})) @@ -2074,94 +2090,6 @@ sub parseTag(@) return undef; } -sub parseTag_E($$$) -{ - my ($CodeRef, $Tag, $Info) = @_; - if(not $Tag or not $CodeRef - or not $Info) { - return undef; - } - if(${$CodeRef}=~s/\<\Q$Tag\E(\s+([^<>]+)|)\>((.|\n)*?)\<\/\Q$Tag\E\>//) - { - my ($Ext, $Content) = ($2, $3); - $Content=~s/\A\s+//g; - $Content=~s/\s+\Z//g; - if($Ext) - { - while($Ext=~s/(\w+)\=\"([^\"]*)\"//) - { - my ($K, $V) = ($1, $2); - $Info->{$K} = xmlSpecChars_R($V); - } - } - if(substr($Content, 0, 1) ne "<") { - $Content = xmlSpecChars_R($Content); - } - return $Content; - } - return undef; -} - -sub addTag(@) -{ - my $Tag = shift(@_); - my $Val = shift(@_); - my @Ext = @_; - my $Content = openTag($Tag, @Ext); - chomp($Content); - $Content .= xmlSpecChars($Val); - $Content .= "</$Tag>\n"; - $TAG_ID-=1; - - return $Content; -} - -sub openTag(@) -{ - my $Tag = shift(@_); - my @Ext = @_; - my $Content = ""; - foreach (1 .. $TAG_ID) { - $Content .= $INDENT; - } - $TAG_ID+=1; - if(@Ext) - { - $Content .= "<".$Tag; - my $P = 0; - while($P<=$#Ext-1) - { - $Content .= " ".$Ext[$P]; - $Content .= "=\"".xmlSpecChars($Ext[$P+1])."\""; - $P+=2; - } - $Content .= ">\n"; - } - else { - $Content .= "<".$Tag.">\n"; - } - return $Content; -} - -sub closeTag($) -{ - my $Tag = $_[0]; - my $Content = ""; - $TAG_ID-=1; - foreach (1 .. $TAG_ID) { - $Content .= $INDENT; - } - $Content .= "</".$Tag.">\n"; - return $Content; -} - -sub checkTags() -{ - if($TAG_ID!=0) { - printMsg("WARNING", "the number of opened tags is not equal to number of closed tags"); - } -} - sub getInfo($) { my $DumpPath = $_[0]; @@ -2172,7 +2100,7 @@ sub getInfo($) # processing info setTemplateParams_All(); - if($ExtraInfo) { + if($ExtraDump) { setAnonTypedef_All(); } @@ -2198,15 +2126,23 @@ sub getInfo($) delete($Cache{"getTypeAttr"}); delete($Cache{"getTypeDeclId"}); - if(not $ExtraInfo) + if($ExtraDump) { - # remove unused types + foreach (keys(%{$TypeInfo{$Version}})) + { + if($TypeInfo{$Version}{$_}{"Artificial"}) { + delete($TypeInfo{$Version}{$_}); + } + } + } + else + { # remove unused types if($BinaryOnly and not $ExtendedCheck) { # --binary removeUnused($Version, "All"); } else { - removeUnused($Version, "Derived"); + removeUnused($Version, "Extended"); } } @@ -2800,6 +2736,11 @@ sub getTypeAttr($) if($TypeAttr{"Type"} eq "Typedef") { $TypeAttr{"Name"} = getNameByInfo($TypeDeclId); + + if(index($TypeAttr{"Name"}, "tmp_add_type")==0) { + return (); + } + if(isAnon($TypeAttr{"Name"})) { # anon typedef to anon type: ._N return (); @@ -2854,6 +2795,11 @@ sub getTypeAttr($) } } ($TypeAttr{"Header"}, $TypeAttr{"Line"}) = getLocation($TypeDeclId); + + if($LibInfo{$Version}{"info"}{$TypeDeclId}=~/ artificial /i) + { # artificial typedef of "struct X" to "X" + $TypeAttr{"Artificial"} = 1; + } } if(not $TypeAttr{"Size"}) { @@ -3246,15 +3192,16 @@ sub getTypeTypeByTypeId($) return "Unknown"; } +my %UnQual = ( + "r"=>"restrict", + "v"=>"volatile", + "c"=>"const", + "cv"=>"const volatile" +); + sub getQual($) { my $TypeId = $_[0]; - my %UnQual = ( - "r"=>"restrict", - "v"=>"volatile", - "c"=>"const", - "cv"=>"const volatile" - ); if(my $Info = $LibInfo{$Version}{"info"}{$TypeId}) { my ($Qual, $To) = (); @@ -3569,6 +3516,10 @@ sub getVarInfo($) if($ShortName=~/\A(_Z|\?)/) { delete($SymbolInfo{$Version}{$InfoId}{"ShortName"}); } + + if($ExtraDump) { + $SymbolInfo{$Version}{$InfoId}{"Header"} = guessHeader($InfoId); + } } sub isConstType($$) @@ -3699,8 +3650,11 @@ sub getTrivialTypeAttr($) { # declaration only $TypeAttr{"Forward"} = 1; } + + my $StaticFields = setTypeMemb($TypeId, \%TypeAttr); + if($TypeAttr{"Type"} eq "Struct" - and detect_lang($TypeId)) + and ($StaticFields or detect_lang($TypeId))) { $TypeAttr{"Type"} = "Class"; $TypeAttr{"Copied"} = 1; # default, will be changed in getSymbolInfo() @@ -3717,7 +3671,18 @@ sub getTrivialTypeAttr($) $TypeAttr{"Algn"} = $Algn/$BYTE_SIZE; } setSpec($TypeId, \%TypeAttr); - setTypeMemb($TypeId, \%TypeAttr); + + if($TypeAttr{"Type"}=~/\A(Struct|Union|Enum)\Z/) + { + if(not $TypedefToAnon{$TypeId} + and not keys(%{$TemplateInstance{$Version}{"Type"}{$TypeId}})) + { + if(not isAnon($TypeAttr{"Name"})) { + $TypeAttr{"Name"} = lc($TypeAttr{"Type"})." ".$TypeAttr{"Name"}; + } + } + } + $TypeAttr{"Tid"} = $TypeId; if(my $VTable = $ClassVTable_Content{$Version}{$TypeAttr{"Name"}}) { @@ -3745,7 +3710,7 @@ sub getTrivialTypeAttr($) } } } - if($ExtraInfo) + if($ExtraDump) { if(defined $TypedefToAnon{$TypeId}) { $TypeAttr{"AnonTypedef"} = 1; @@ -4151,6 +4116,7 @@ sub mangle_param($$$) my %ReplCopy = %{$Repl}; my %BaseType = get_BaseType($PTid, $LibVersion); my $BaseType_Name = $BaseType{"Name"}; + $BaseType_Name=~s/\A(struct|union|enum) //g; if(not $BaseType_Name) { return ""; } @@ -4584,13 +4550,6 @@ sub set_Class_And_Namespace($) } } -sub debugType($$) -{ - my ($Tid, $LibVersion) = @_; - my %Type = get_Type($Tid, $LibVersion); - printMsg("INFO", Dumper(\%Type)); -} - sub debugMangling($) { my $LibVersion = $_[0]; @@ -4670,6 +4629,7 @@ sub getSymbolInfo($) delete($SymbolInfo{$Version}{$InfoId}); return; } + $SymbolInfo{$Version}{$InfoId}{"Type"} = getFuncType($InfoId); if($SymbolInfo{$Version}{$InfoId}{"Return"} = getFuncReturn($InfoId)) { @@ -4693,7 +4653,13 @@ sub getSymbolInfo($) } my $Orig = getFuncOrig($InfoId); $SymbolInfo{$Version}{$InfoId}{"ShortName"} = getFuncShortName($Orig); - if($SymbolInfo{$Version}{$InfoId}{"ShortName"}=~/\._/) + if(index($SymbolInfo{$Version}{$InfoId}{"ShortName"}, "\._")!=-1) + { + delete($SymbolInfo{$Version}{$InfoId}); + return; + } + + if(index($SymbolInfo{$Version}{$InfoId}{"ShortName"}, "tmp_add_func")==0) { delete($SymbolInfo{$Version}{$InfoId}); return; @@ -4911,6 +4877,31 @@ sub getSymbolInfo($) if($WeakSymbols{$Version}{$SymbolInfo{$Version}{$InfoId}{"MnglName"}}) { $SymbolInfo{$Version}{$InfoId}{"Weak"} = 1; } + + if($ExtraDump) { + $SymbolInfo{$Version}{$InfoId}{"Header"} = guessHeader($InfoId); + } +} + +sub guessHeader($) +{ + my $InfoId = $_[0]; + my $ShortName = $SymbolInfo{$Version}{$InfoId}{"ShortName"}; + my $ClassId = $SymbolInfo{$Version}{$InfoId}{"Class"}; + my $ClassName = $ClassId?get_ShortClass($ClassId, $Version):""; + my $Header = $SymbolInfo{$Version}{$InfoId}{"Header"}; + if(my $HPath = $SymbolHeader{$Version}{$ClassName}{$ShortName}) + { + if(get_filename($HPath) eq $Header) + { + my $HDir = get_filename(get_dirname($HPath)); + if($HDir ne "include" + and $HDir=~/\A[a-z]+\Z/i) { + return join_P($HDir, $Header); + } + } + } + return $Header; } sub isInline($) @@ -4952,6 +4943,7 @@ sub setTypeMemb($$) my ($TypeId, $TypeAttr) = @_; my $TypeType = $TypeAttr->{"Type"}; my ($Pos, $UnnamedPos) = (0, 0); + my $StaticFields = 0; if($TypeType eq "Enum") { my $MInfoId = getTreeAttr_Csts($TypeId); @@ -4974,6 +4966,12 @@ sub setTypeMemb($$) my $MInfo = $LibInfo{$Version}{"info"}{$MInfoId}; if(not $IType or $IType ne "field_decl") { # search for fields, skip other stuff in the declaration + + if($IType eq "var_decl") + { # static field + $StaticFields = 1; + } + $MInfoId = getNextElem($MInfoId); next; } @@ -5033,6 +5031,8 @@ sub setTypeMemb($$) $Pos += 1; } } + + return $StaticFields; } sub setFuncParams($) @@ -5431,55 +5431,62 @@ sub getFuncLink($) return ""; } -sub get_IntNameSpace($$) +sub select_Symbol_NS($$) { - my ($Interface, $LibVersion) = @_; - return "" if(not $Interface or not $LibVersion); - if(defined $Cache{"get_IntNameSpace"}{$Interface}{$LibVersion}) { - return $Cache{"get_IntNameSpace"}{$Interface}{$LibVersion}; + my ($Symbol, $LibVersion) = @_; + return "" if(not $Symbol or not $LibVersion); + my $NS = $CompleteSignature{$LibVersion}{$Symbol}{"NameSpace"}; + if(not $NS) + { + if(my $Class = $CompleteSignature{$LibVersion}{$Symbol}{"Class"}) { + $NS = $TypeInfo{$LibVersion}{$Class}{"NameSpace"}; + } } - my $Signature = get_Signature($Interface, $LibVersion); - if($Signature=~/\:\:/) + if($NS) { - my $FounNameSpace = 0; - foreach my $NameSpace (sort {get_depth($b)<=>get_depth($a)} keys(%{$NestedNameSpaces{$LibVersion}})) + if(defined $NestedNameSpaces{$LibVersion}{$NS}) { + return $NS; + } + else { - if($Signature=~/(\A|\s+for\s+)\Q$NameSpace\E\:\:/) { - return ($Cache{"get_IntNameSpace"}{$Interface}{$LibVersion} = $NameSpace); + while($NS=~s/::[^:]+\Z//) + { + if(defined $NestedNameSpaces{$LibVersion}{$NS}) { + return $NS; + } } } } - else { - return ($Cache{"get_IntNameSpace"}{$Interface}{$LibVersion} = ""); - } + + return ""; } -sub parse_TypeNameSpace($$) +sub select_Type_NS($$) { my ($TypeName, $LibVersion) = @_; return "" if(not $TypeName or not $LibVersion); - if(defined $Cache{"parse_TypeNameSpace"}{$TypeName}{$LibVersion}) { - return $Cache{"parse_TypeNameSpace"}{$TypeName}{$LibVersion}; - } - if($TypeName=~/\:\:/) + if(my $NS = $TypeInfo{$LibVersion}{$TName_Tid{$LibVersion}{$TypeName}}{"NameSpace"}) { - my $FounNameSpace = 0; - foreach my $NameSpace (sort {get_depth($b)<=>get_depth($a)} keys(%{$NestedNameSpaces{$LibVersion}})) + if(defined $NestedNameSpaces{$LibVersion}{$NS}) { + return $NS; + } + else { - if($TypeName=~/\A\Q$NameSpace\E\:\:/) { - return ($Cache{"parse_TypeNameSpace"}{$TypeName}{$LibVersion} = $NameSpace); + while($NS=~s/::[^:]+\Z//) + { + if(defined $NestedNameSpaces{$LibVersion}{$NS}) { + return $NS; + } } } } - else { - return ($Cache{"parse_TypeNameSpace"}{$TypeName}{$LibVersion} = ""); - } + return ""; } sub getNameSpace($) { - my $TypeInfoId = $_[0]; - if(my $NSInfoId = getTreeAttr_Scpe($TypeInfoId)) + my $InfoId = $_[0]; + if(my $NSInfoId = getTreeAttr_Scpe($InfoId)) { if(my $InfoType = $LibInfo{$Version}{"info_type"}{$NSInfoId}) { @@ -5638,7 +5645,6 @@ sub register_directory($$$) my ($Dir, $WithDeps, $LibVersion) = @_; $Dir=~s/[\/\\]+\Z//g; return if(not $LibVersion or not $Dir or not -d $Dir); - return if(skipHeader($Dir, $LibVersion)); $Dir = get_abs_path($Dir); my $Mode = "All"; if($WithDeps) @@ -5678,7 +5684,6 @@ sub register_directory($$$) } next if(is_not_header($Path)); next if(ignore_path($Path)); - next if(skipHeader($Path, $LibVersion)); # Neighbors foreach my $Part (get_prefixes($Path)) { $Include_Neighbors{$LibVersion}{$Part} = $Path; @@ -5740,35 +5745,32 @@ sub parse_includes($$) { my ($Content, $Path) = @_; my %Includes = (); - while($Content=~s/^[ \t]*#[ \t]*(include|include_next|import)[ \t]*(.+?)[ \t]*$//m) + while($Content=~s/^[ \t]*#[ \t]*(include|include_next|import)[ \t]*([<"].+?[">])[ \t]*//m) { # C/C++: include, Objective C/C++: import directive my $Header = $2; - my $Method = substr($Header, 0, 1); - if($Method eq "\"" or $Method eq "<") - { # default - substr($Header, 0, 1, ""); - substr($Header, length($Header)-1, 1, ""); - $Header = path_format($Header, $OSgroup); - if($Method eq "\"" or is_abs($Header)) - { - if(-e joinPath(get_dirname($Path), $Header)) - { # relative path exists - $Includes{$Header} = -1; - } - else - { # include "..." that doesn't exist is equal to include <...> - $Includes{$Header} = 2; - } + my $Method = substr($Header, 0, 1, ""); + substr($Header, length($Header)-1, 1, ""); + $Header = path_format($Header, $OSgroup); + if($Method eq "\"" or is_abs($Header)) + { + if(-e join_P(get_dirname($Path), $Header)) + { # relative path exists + $Includes{$Header} = -1; } - else { - $Includes{$Header} = 1; + else + { # include "..." that doesn't exist is equal to include <...> + $Includes{$Header} = 2; } } - else - { - if($ExtraInfo) { - $Includes{$Header} = 0; - } + else { + $Includes{$Header} = 1; + } + } + if($ExtraInfo) + { + while($Content=~s/^[ \t]*#[ \t]*(include|include_next|import)[ \t]+(\w+)[ \t]*//m) + { # FT_FREETYPE_H + $Includes{$2} = 0; } } return \%Includes; @@ -6122,15 +6124,8 @@ sub detect_header_includes($$) } } -sub simplify_path($) -{ - my $Path = $_[0]; - while($Path=~s&([\/\\])[^\/\\]+[\/\\]\.\.[\/\\]&$1&){}; - return $Path; -} - sub fromLibc($) -{ # GLIBC header +{ # system GLIBC header my $Path = $_[0]; my ($Dir, $Name) = separate_path($Path); if(get_filename($Dir)=~/\A(include|libc)\Z/ and $GlibcHeader{$Name}) @@ -6138,14 +6133,11 @@ sub fromLibc($) # epoc32/include/libc/{stdio, ...}.h return 1; } - if(isLibcDir($Dir)) { - return 1; - } return 0; } sub isLibcDir($) -{ # GLIBC directory +{ # system GLIBC directory my $Dir = $_[0]; my ($OutDir, $Name) = separate_path($Dir); if(get_filename($OutDir)=~/\A(include|libc)\Z/ @@ -6165,8 +6157,8 @@ sub detect_recursive_includes($$) } my ($AbsDir, $Name) = separate_path($AbsPath); if(isLibcDir($AbsDir)) - { # GLIBC internals - return (); + { # system GLIBC internals + return () if(not $ExtraInfo); } if(keys(%{$RecursiveIncludes{$LibVersion}{$AbsPath}})) { return keys(%{$RecursiveIncludes{$LibVersion}{$AbsPath}}); @@ -6180,7 +6172,7 @@ sub detect_recursive_includes($$) push(@RecurInclude, $AbsPath); if(grep { $AbsDir eq $_ } @DefaultGccPaths - or fromLibc($AbsPath)) + or (grep { $AbsDir eq $_ } @DefaultIncPaths and fromLibc($AbsPath))) { # check "real" (non-"model") include paths my @Paths = detect_real_includes($AbsPath, $LibVersion); pop(@RecurInclude); @@ -6195,16 +6187,16 @@ sub detect_recursive_includes($$) my $HPath = ""; if($IncType<0) { # for #include "..." - my $Candidate = joinPath($AbsDir, $Include); + my $Candidate = join_P($AbsDir, $Include); if(-f $Candidate) { - $HPath = simplify_path($Candidate); + $HPath = realpath($Candidate); } } elsif($IncType>0 and $Include=~/[\/\\]/) # and not find_in_defaults($Include) { # search for the nearest header # QtCore/qabstractanimation.h includes <QtCore/qobject.h> - my $Candidate = joinPath(get_dirname($AbsDir), $Include); + my $Candidate = join_P(get_dirname($AbsDir), $Include); if(-f $Candidate) { $HPath = $Candidate; } @@ -6219,10 +6211,10 @@ sub detect_recursive_includes($$) if($Debug) { # boundary headers - #if($HPath=~/vtk/ and $AbsPath!~/vtk/) - #{ - # print STDERR "$AbsPath -> $HPath\n"; - #} +# if($HPath=~/vtk/ and $AbsPath!~/vtk/) +# { +# print STDERR "$AbsPath -> $HPath\n"; +# } } $RecursiveIncludes{$LibVersion}{$AbsPath}{$HPath} = $IncType; @@ -6525,33 +6517,28 @@ sub selectSystemHeader_I($$) if($OSgroup ne "macos") { if($HName eq "fp.h") - { # pngconf.h includes fp.h for MACOS + { # pngconf.h includes fp.h in Mac OS return ""; } } - if($OSgroup ne "solaris") - { - if($Header eq "thread.h") { - return ""; - } - if($Header eq "sys/atomic.h") { - return ""; - } + + if(defined $ObsoleteHeaders{$HName}) + { # obsolete headers + return ""; } - if($OSgroup ne "hpux") + if($OSgroup eq "linux" or $OSgroup eq "bsd") { - if($Header eq "sys/stream.h") { + if(defined $AlienHeaders{$HName} + or defined $AlienHeaders{$Header}) + { # alien headers from other systems return ""; } } - if($ObsoleteHeaders{$HName}) { - return ""; - } foreach my $Path (@{$SystemPaths{"include"}}) { # search in default paths if(-f $Path."/".$Header) { - return joinPath($Path,$Header); + return join_P($Path,$Header); } } if(not keys(%SystemHeaders)) @@ -6624,7 +6611,7 @@ sub identifyHeader_I($$) { # search for libc headers in the /usr/include # for non-libc target library before searching # in the library paths - return joinPath($HeaderDir,$Header); + return join_P($HeaderDir,$Header); } elsif(my $Path = $Include_Neighbors{$LibVersion}{$Header}) { # search in the target library paths @@ -6636,7 +6623,7 @@ sub identifyHeader_I($$) } elsif(my $DefaultDir = find_in_defaults($Header)) { # search in the default GCC include paths - return joinPath($DefaultDir,$Header); + return join_P($DefaultDir,$Header); } elsif(defined $DefaultCppHeader{$Header}) { # search in the default G++ include paths @@ -6652,7 +6639,7 @@ sub identifyHeader_I($$) { my $RelPath = "Headers\/".get_filename($Header); if(my $HeaderDir = find_in_framework($RelPath, $Dir.".framework", $LibVersion)) { - return joinPath($HeaderDir, $RelPath); + return join_P($HeaderDir, $RelPath); } } } @@ -7005,7 +6992,7 @@ sub get_Signature($$) } if($CompleteSignature{$LibVersion}{$Symbol}{"Static"} and $Symbol=~/\A(_Z|\?)/) - {# for static methods + { # for static methods $Func_Signature .= " [static]"; } } @@ -7205,8 +7192,13 @@ sub sortDeps($$$) return 0; } -sub joinPath($$) { - return join($SLASH, @_); +sub join_P($$) +{ + my $S = "/"; + if($OSgroup eq "windows") { + $S = "\\"; + } + return join($S, @_); } sub get_namespace_additions($) @@ -7230,7 +7222,7 @@ sub get_namespace_additions($) $TypeDecl_Prefix .= "namespace $NS_Part\{"; $TypeDecl_Suffix .= "}"; } - my $TypeDecl = $TypeDecl_Prefix."typedef int tmp_add_type_$AddNameSpaceId;".$TypeDecl_Suffix; + my $TypeDecl = $TypeDecl_Prefix."typedef int tmp_add_type_".$AddNameSpaceId.";".$TypeDecl_Suffix; my $FuncDecl = "$NS\:\:tmp_add_type_$AddNameSpaceId tmp_add_func_$AddNameSpaceId(){return 0;};"; $Additions.=" $TypeDecl\n $FuncDecl\n"; $AddNameSpaceId+=1; @@ -7239,15 +7231,16 @@ sub get_namespace_additions($) } sub path_format($$) -{ # forward slash to pass into MinGW GCC +{ my ($Path, $Fmt) = @_; - $Path=~s/[\/\\]+\Z//; + $Path=~s/[\/\\]+\.?\Z//g; if($Fmt eq "windows") { $Path=~s/\//\\/g; $Path=lc($Path); } - else { + else + { # forward slash to pass into MinGW GCC $Path=~s/\\/\//g; } return $Path; @@ -7408,6 +7401,8 @@ my %C_Structure = map {$_=>1} ( "siginfo", "mallinfo", "timex", + "sigcontext", + "ucontext", # Mac "_timex", "_class_t", @@ -7640,6 +7635,15 @@ sub getDump() } writeFile($ExtraInfo."/recursive-includes", Dumper($RecursiveIncludes{$Version})); writeFile($ExtraInfo."/direct-includes", Dumper($Header_Includes{$Version})); + + if(my @Redirects = keys(%{$Header_ErrorRedirect{$Version}})) + { + my $REDIR = ""; + foreach my $P1 (sort @Redirects) { + $REDIR .= $P1.";".$Header_ErrorRedirect{$Version}{$P1}."\n"; + } + writeFile($ExtraInfo."/include-redirect", $REDIR); + } } if(not keys(%{$TargetHeaders{$Version}})) @@ -7647,14 +7651,6 @@ sub getDump() addTargetHeaders($Version); } - if($Debug) - { # debug mode - writeFile($DEBUG_PATH{$Version}."/headers/direct-includes.txt", Dumper($Header_Includes{$Version})); - writeFile($DEBUG_PATH{$Version}."/headers/recursive-includes.txt", Dumper($RecursiveIncludes{$Version})); - writeFile($DEBUG_PATH{$Version}."/headers/include-paths.txt", Dumper($Cache{"get_HeaderDeps"}{$Version})); - writeFile($DEBUG_PATH{$Version}."/headers/default-paths.txt", Dumper(\@DefaultIncPaths)); - } - # clean memory %RecursiveIncludes = (); %Header_Include_Prefix = (); @@ -7669,8 +7665,14 @@ sub getDump() my $Pre = callPreprocessor($TmpHeaderPath, $IncludeString, $Version); checkPreprocessedUnit($Pre); + if($ExtraInfo) + { # extra information for other tools + writeFile($ExtraInfo."/header-paths", join("\n", sort keys(%{$PreprocessedHeaders{$Version}}))); + } + # clean memory delete($Include_Neighbors{$Version}); + delete($PreprocessedHeaders{$Version}); if($COMMON_LANGUAGE{$Version} eq "C++") { checkCTags($Pre); @@ -8111,7 +8113,6 @@ sub cmd_find($;$$$$) if(not $DirCmd) { exitStatus("Not_Found", "can't find \"dir\" command"); } - $Path=~s/[\\]+\Z//; $Path = get_abs_path($Path); $Path = path_format($Path, $OSgroup); my $Cmd = $DirCmd." \"$Path\" /B /O"; @@ -8121,6 +8122,9 @@ sub cmd_find($;$$$$) if($Type eq "d") { $Cmd .= " /AD"; } + elsif($Type eq "f") { + $Cmd .= " /A-D"; + } my @Files = split(/\n/, `$Cmd 2>\"$TMP_DIR/null\"`); if($Name) { # FIXME: how to search file names in MS shell? @@ -8133,7 +8137,7 @@ sub cmd_find($;$$$$) foreach my $File (@Files) { if(not is_abs($File)) { - $File = joinPath($Path, $File); + $File = join_P($Path, $File); } if($Type eq "f" and not -f $File) { # skip dirs @@ -8199,22 +8203,16 @@ sub unpackDump($) exitStatus("Not_Found", "can't find \"unzip\" command"); } chdir($UnpackDir); - system("$UnzipCmd \"$Path\" >contents.txt"); + system("$UnzipCmd \"$Path\" >\"$TMP_DIR/null\""); if($?) { - exitStatus("Error", "can't extract \'$Path\'"); + exitStatus("Error", "can't extract \'$Path\' ($?): $!"); } chdir($ORIG_DIR); - my @Contents = (); - foreach (split("\n", readFile("$UnpackDir/contents.txt"))) - { - if(/inflating:\s*([^\s]+)/) { - push(@Contents, $1); - } - } + my @Contents = cmd_find($UnpackDir, "f"); if(not @Contents) { exitStatus("Error", "can't extract \'$Path\'"); } - return joinPath($UnpackDir, $Contents[0]); + return $Contents[0]; } elsif($FileName=~s/\Q.tar.gz\E\Z//g) { # *.tar.gz @@ -8234,37 +8232,35 @@ sub unpackDump($) if($?) { exitStatus("Error", "can't extract \'$Path\'"); } - system("$TarCmd -xvf \"$Dir\\$FileName.tar\" >contents.txt"); + system("$TarCmd -xvf \"$Dir\\$FileName.tar\" >\"$TMP_DIR/null\""); if($?) { - exitStatus("Error", "can't extract \'$Path\'"); + exitStatus("Error", "can't extract \'$Path\' ($?): $!"); } chdir($ORIG_DIR); unlink($Dir."/".$FileName.".tar"); - my @Contents = split("\n", readFile("$UnpackDir/contents.txt")); + my @Contents = cmd_find($UnpackDir, "f"); if(not @Contents) { exitStatus("Error", "can't extract \'$Path\'"); } - return joinPath($UnpackDir, $Contents[0]); + return $Contents[0]; } else - { # Unix + { # Unix, Mac my $TarCmd = get_CmdPath("tar"); if(not $TarCmd) { exitStatus("Not_Found", "can't find \"tar\" command"); } chdir($UnpackDir); - system("$TarCmd -xvzf \"$Path\" >contents.txt"); + system("$TarCmd -xvzf \"$Path\" >\"$TMP_DIR/null\""); if($?) { - exitStatus("Error", "can't extract \'$Path\'"); + exitStatus("Error", "can't extract \'$Path\' ($?): $!"); } chdir($ORIG_DIR); - # The content file name may be different - # from the package file name - my @Contents = split("\n", readFile("$UnpackDir/contents.txt")); + my @Contents = cmd_find($UnpackDir, "f"); if(not @Contents) { exitStatus("Error", "can't extract \'$Path\'"); } - return joinPath($UnpackDir, $Contents[0]); + return $Contents[0]; } } } @@ -8324,15 +8320,6 @@ sub createArchive($$) } } -sub readBytes($) -{ - sysopen(FILE, $_[0], O_RDONLY); - sysread(FILE, my $Header, 4); - close(FILE); - my @Bytes = map { sprintf('%02x', ord($_)) } split (//, $Header); - return join("", @Bytes); -} - sub is_header_file($) { if($_[0]=~/\.($HEADER_EXT)\Z/i) { @@ -8765,13 +8752,15 @@ sub prepareSymbols($) $Func_ShortName{$LibVersion}{$CompleteSignature{$LibVersion}{$Symbol}{"ShortName"}}{$Symbol} = 1; } foreach my $MnglName (keys(%VTableClass)) - { # reconstruct header name for v-tables + { # reconstruct attributes of v-tables if(index($MnglName, "_ZTV")==0) { if(my $ClassName = $VTableClass{$MnglName}) { - if(my $ClassId = $TName_Tid{$LibVersion}{$ClassName}) { + if(my $ClassId = $TName_Tid{$LibVersion}{$ClassName}) + { $CompleteSignature{$LibVersion}{$MnglName}{"Header"} = $TypeInfo{$LibVersion}{$ClassId}{"Header"}; + $CompleteSignature{$LibVersion}{$MnglName}{"Class"} = $ClassId; } } } @@ -9040,6 +9029,13 @@ sub selectType($$) return 0; } +sub removeGarbage($) +{ + my $LibVersion = $_[0]; + + +} + sub removeUnused($$) { # remove unused data types from the ABI dump my ($LibVersion, $Kind) = @_; @@ -9077,11 +9073,11 @@ sub removeUnused($$) foreach my $Tid (keys(%{$TypeInfo{$LibVersion}})) { if($UsedType{$LibVersion}{$Tid}) - { # All & Derived + { # All & Extended next; } - if($Kind eq "Derived") + if($Kind eq "Extended") { if(selectType($Tid, $LibVersion)) { register_TypeUsage($Tid, $LibVersion); @@ -9091,7 +9087,7 @@ sub removeUnused($$) foreach my $Tid (keys(%{$TypeInfo{$LibVersion}})) { # remove unused types if($UsedType{$LibVersion}{$Tid}) - { # All & Derived + { # All & Extended next; } # remove type @@ -9600,7 +9596,6 @@ sub mergeVTables($) { %{$CompatProblems{$Level}{$Symbol}{"Virtual_Table_Changed_Unknown"}{$ClassName}}=( "Type_Name"=>$ClassName, - "Type_Type"=>"Class", "Target"=>$ClassName); } } @@ -9694,7 +9689,6 @@ sub mergeBases($) } %{$CompatProblems{$Level}{$AffectedInt}{$ProblemType}{$tr_name{$AddedVFunc}}}=( "Type_Name"=>$Class_Type{"Name"}, - "Type_Type"=>"Class", "Target"=>get_Signature($AddedVFunc, 2), "Old_Value"=>get_Signature($RemovedVFunc, 1)); } @@ -9750,8 +9744,8 @@ sub mergeBases($) my ($BNum1, $BNum2) = (1, 1); my %BasePos_Old = map {$Tr_Old{$TypeInfo{1}{$_}{"Name"}} => $BNum1++} @Bases_Old; my %BasePos_New = map {$Tr_New{$TypeInfo{2}{$_}{"Name"}} => $BNum2++} @Bases_New; - my %ShortBase_Old = map {get_ShortType($_, 1) => 1} @Bases_Old; - my %ShortBase_New = map {get_ShortType($_, 2) => 1} @Bases_New; + my %ShortBase_Old = map {get_ShortClass($_, 1) => 1} @Bases_Old; + my %ShortBase_New = map {get_ShortClass($_, 2) => 1} @Bases_New; my $Shift_Old = getShift($ClassId_Old, 1); my $Shift_New = getShift($ClassId_New, 2); my %BaseId_New = map {$Tr_New{$TypeInfo{2}{$_}{"Name"}} => $_} @Bases_New; @@ -9764,7 +9758,7 @@ sub mergeBases($) push(@StableBases_Old, $BaseId); } elsif(not $ShortBase_New{$Tr_Old{$BaseName}} - and not $ShortBase_New{get_ShortType($BaseId, 1)}) + and not $ShortBase_New{get_ShortClass($BaseId, 1)}) { # removed base # excluding namespace::SomeClass to SomeClass renaming my $ProblemKind = "Removed_Base_Class"; @@ -9804,7 +9798,6 @@ sub mergeBases($) } %{$CompatProblems{$Level}{$Interface}{$ProblemKind}{"this"}}=( "Type_Name"=>$ClassName, - "Type_Type"=>"Class", "Target"=>$BaseName, "Old_Size"=>$Class_Old{"Size"}*$BYTE_SIZE, "New_Size"=>$Class_New{"Size"}*$BYTE_SIZE, @@ -9821,7 +9814,7 @@ sub mergeBases($) push(@StableBases_New, $BaseId); } elsif(not $ShortBase_Old{$Tr_New{$BaseName}} - and not $ShortBase_Old{get_ShortType($BaseId, 2)}) + and not $ShortBase_Old{get_ShortClass($BaseId, 2)}) { # added base # excluding namespace::SomeClass to SomeClass renaming my $ProblemKind = "Added_Base_Class"; @@ -9861,7 +9854,6 @@ sub mergeBases($) } %{$CompatProblems{$Level}{$Interface}{$ProblemKind}{"this"}}=( "Type_Name"=>$ClassName, - "Type_Type"=>"Class", "Target"=>$BaseName, "Old_Size"=>$Class_Old{"Size"}*$BYTE_SIZE, "New_Size"=>$Class_New{"Size"}*$BYTE_SIZE, @@ -9891,7 +9883,6 @@ sub mergeBases($) } %{$CompatProblems{$Level}{$Interface}{"Base_Class_Position"}{"this"}}=( "Type_Name"=>$ClassName, - "Type_Type"=>"Class", "Target"=>$BaseName, "Old_Value"=>$OldPos-1, "New_Value"=>$NewPos-1 ); @@ -9907,7 +9898,6 @@ sub mergeBases($) } %{$CompatProblems{$Level}{$Interface}{"Base_Class_Became_Non_Virtually_Inherited"}{"this->".$BaseName}}=( "Type_Name"=>$ClassName, - "Type_Type"=>"Class", "Target"=>$BaseName ); } } @@ -9921,7 +9911,6 @@ sub mergeBases($) } %{$CompatProblems{$Level}{$Interface}{"Base_Class_Became_Virtually_Inherited"}{"this->".$BaseName}}=( "Type_Name"=>$ClassName, - "Type_Type"=>"Class", "Target"=>$BaseName ); } } @@ -9965,7 +9954,6 @@ sub mergeBases($) } %{$CompatProblems{$Level}{$Interface}{$ProblemType}{"this->".$BaseType{"Name"}}}=( "Type_Name"=>$BaseType{"Name"}, - "Type_Type"=>"Class", "Target"=>$BaseType{"Name"}, "Old_Size"=>$Size_Old*$BYTE_SIZE, "New_Size"=>$Size_New*$BYTE_SIZE ); @@ -10020,7 +10008,6 @@ sub mergeBases($) } %{$CompatProblems{$Level}{$Symbol}{$ProblemType}{get_Signature($VirtFunc, 2)}}=( "Type_Name"=>$BaseType{"Name"}, - "Type_Type"=>"Class", "Target"=>get_Signature($VirtFunc, 2) ); } foreach my $VirtFunc (keys(%{$RemovedInt_Virt{$Level}{$BaseType{"Name"}}})) @@ -10032,7 +10019,6 @@ sub mergeBases($) } %{$CompatProblems{$Level}{$Symbol}{$ProblemType}{get_Signature($VirtFunc, 1)}}=( "Type_Name"=>$BaseType{"Name"}, - "Type_Type"=>"Class", "Target"=>get_Signature($VirtFunc, 1) ); } } @@ -10119,7 +10105,6 @@ sub mergeVirtualTables($$) { # became pure virtual %{$CompatProblems{$Level}{$Interface}{"Virtual_Method_Became_Pure"}{$tr_name{$Func}}}=( "Type_Name"=>$CName, - "Type_Type"=>"Class", "Target"=>get_Signature_M($Func, 1) ); $VTableChanged_M{$CName} = 1; } @@ -10128,7 +10113,6 @@ sub mergeVirtualTables($$) { # became non-pure virtual %{$CompatProblems{$Level}{$Interface}{"Virtual_Method_Became_Non_Pure"}{$tr_name{$Func}}}=( "Type_Name"=>$CName, - "Type_Type"=>"Class", "Target"=>get_Signature_M($Func, 1) ); $VTableChanged_M{$CName} = 1; } @@ -10146,7 +10130,6 @@ sub mergeVirtualTables($$) { # pure virtual methods affect all others (virtual and non-virtual) %{$CompatProblems{$Level}{$Interface}{"Added_Pure_Virtual_Method"}{$tr_name{$AddedVFunc}}}=( "Type_Name"=>$CName, - "Type_Type"=>"Class", "Target"=>get_Signature($AddedVFunc, 2) ); $VTableChanged_M{$CName} = 1; } @@ -10157,7 +10140,6 @@ sub mergeVirtualTables($$) { # became polymorphous class, added v-table pointer %{$CompatProblems{$Level}{$Interface}{"Added_First_Virtual_Method"}{$tr_name{$AddedVFunc}}}=( "Type_Name"=>$CName, - "Type_Type"=>"Class", "Target"=>get_Signature($AddedVFunc, 2) ); $VTableChanged_M{$CName} = 1; } @@ -10174,7 +10156,6 @@ sub mergeVirtualTables($$) } %{$CompatProblems{$Level}{$Interface}{$ProblemType}{$tr_name{$AddedVFunc}}}=( "Type_Name"=>$CName, - "Type_Type"=>"Class", "Target"=>get_Signature($AddedVFunc, 2) ); $VTableChanged_M{$CName} = 1; } @@ -10186,7 +10167,6 @@ sub mergeVirtualTables($$) } %{$CompatProblems{$Level}{$Interface}{$ProblemType}{$tr_name{$AddedVFunc}}}=( "Type_Name"=>$CName, - "Type_Type"=>"Class", "Target"=>get_Signature($AddedVFunc, 2) ); $VTableChanged_M{$CName} = 1; } @@ -10214,7 +10194,6 @@ sub mergeVirtualTables($$) $CheckedSymbols{$Level}{$ASymbol} = 1; %{$CompatProblems{$Level}{$ASymbol}{"Added_Virtual_Method"}{$tr_name{$AddedVFunc}}}=( "Type_Name"=>$CName, - "Type_Type"=>"Class", "Target"=>get_Signature($AddedVFunc, 2) ); $VTableChanged_M{$TypeInfo{1}{$CompleteSignature{1}{$ASymbol}{"Class"}}{"Name"}} = 1; } @@ -10238,7 +10217,6 @@ sub mergeVirtualTables($$) { # became non-polymorphous class, removed v-table pointer %{$CompatProblems{$Level}{$Interface}{"Removed_Last_Virtual_Method"}{$tr_name{$RemovedVFunc}}}=( "Type_Name"=>$CName, - "Type_Type"=>"Class", "Target"=>get_Signature($RemovedVFunc, 1) ); $VTableChanged_M{$CName} = 1; } @@ -10281,7 +10259,6 @@ sub mergeVirtualTables($$) $CheckedSymbols{$Level}{$ASymbol} = 1; %{$CompatProblems{$Level}{$ASymbol}{$ProblemType}{$tr_name{$RemovedVFunc}}}=( "Type_Name"=>$CName, - "Type_Type"=>"Class", "Target"=>get_Signature($RemovedVFunc, 1) ); $VTableChanged_M{$TypeInfo{1}{$CompleteSignature{1}{$ASymbol}{"Class"}}{"Name"}} = 1; } @@ -10299,7 +10276,6 @@ sub mergeVirtualTables($$) { %{$CompatProblems{$Level}{$Interface}{"Added_Pure_Virtual_Method"}{$tr_name{$AddedVFunc}}}=( "Type_Name"=>$CName, - "Type_Type"=>"Class", "Target"=>get_Signature($AddedVFunc, 2) ); } } @@ -10309,7 +10285,6 @@ sub mergeVirtualTables($$) { %{$CompatProblems{$Level}{$Interface}{"Removed_Pure_Virtual_Method"}{$tr_name{$RemovedVFunc}}}=( "Type_Name"=>$CName, - "Type_Type"=>"Class", "Target"=>get_Signature($RemovedVFunc, 1) ); } } @@ -10562,30 +10537,38 @@ sub mergeTypes($$$) %{$SubProblems{"DataType_Size"}{$Typedef_1{"Name"}}}=( "Target"=>$Typedef_1{"Name"}, "Type_Name"=>$Typedef_1{"Name"}, - "Type_Type"=>"Typedef", "Old_Size"=>$Type1{"Size"}*$BYTE_SIZE, "New_Size"=>$Type2{"Size"}*$BYTE_SIZE ); } %{$SubProblems{"Typedef_BaseType"}{$Typedef_1{"Name"}}}=( "Target"=>$Typedef_1{"Name"}, "Type_Name"=>$Typedef_1{"Name"}, - "Type_Type"=>"Typedef", "Old_Value"=>$Base_1{"Name"}, "New_Value"=>$Base_2{"Name"} ); } } if(nonComparable(\%Type1_Pure, \%Type2_Pure)) { # different types (reported in detectTypeChange(...)) - if($Type1_Pure{"Name"} eq $Type2_Pure{"Name"} - and $Type1_Pure{"Type"} ne $Type2_Pure{"Type"} - and $Type1_Pure{"Type"}!~/Intrinsic|Pointer|Ref|Typedef/) + my $TT1 = $Type1_Pure{"Type"}; + my $TT2 = $Type2_Pure{"Type"}; + + if($TT1 ne $TT2 + and $TT1!~/Intrinsic|Pointer|Ref|Typedef/) { # different type of the type - %{$SubProblems{"DataType_Type"}{$Type1_Pure{"Name"}}}=( - "Target"=>$Type1_Pure{"Name"}, - "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"}, - "Old_Value"=>lc($Type1_Pure{"Type"}), - "New_Value"=>lc($Type2_Pure{"Type"}) ); + my $Short1 = $Type1_Pure{"Name"}; + my $Short2 = $Type2_Pure{"Name"}; + + $Short1=~s/\A\Q$TT1\E //ig; + $Short2=~s/\A\Q$TT2\E //ig; + + if($Short1 eq $Short2) + { + %{$SubProblems{"DataType_Type"}{$Type1_Pure{"Name"}}}=( + "Target"=>$Type1_Pure{"Name"}, + "Type_Name"=>$Type1_Pure{"Name"}, + "Old_Value"=>lc($Type1_Pure{"Type"}), + "New_Value"=>lc($Type2_Pure{"Type"}) ); + } } %{$Cache{"mergeTypes"}{$Level}{$Type1_Id}{$Type2_Id}} = %SubProblems; return %SubProblems; @@ -10619,7 +10602,6 @@ sub mergeTypes($$$) %{$SubProblems{$ProblemKind}{$Type1_Pure{"Name"}}}=( "Target"=>$Type1_Pure{"Name"}, "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"}, "Old_Size"=>$Type1_Pure{"Size"}*$BYTE_SIZE, "New_Size"=>$Type2_Pure{"Size"}*$BYTE_SIZE, "InitialType_Type"=>$Type1_Pure{"Type"} ); @@ -10788,7 +10770,6 @@ sub mergeTypes($$$) %{$SubProblems{$ProblemType}{$Member_Name}}=( "Target"=>$Member_Name, "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"}, "Old_Value"=>$RPos1, "New_Value"=>$RPos2 ); } @@ -10808,7 +10789,6 @@ sub mergeTypes($$$) %{$SubProblems{"Renamed_Field"}{$Member_Name}}=( "Target"=>$Member_Name, "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"}, "Old_Value"=>$Member_Name, "New_Value"=>$RenamedTo ); } @@ -10817,7 +10797,6 @@ sub mergeTypes($$$) %{$SubProblems{"Used_Reserved_Field"}{$Member_Name}}=( "Target"=>$Member_Name, "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"}, "Old_Value"=>$Member_Name, "New_Value"=>$RenamedTo ); } @@ -10827,7 +10806,6 @@ sub mergeTypes($$$) %{$SubProblems{"Enum_Member_Name"}{$Type1_Pure{"Memb"}{$Member_Pos}{"value"}}}=( "Target"=>$Type1_Pure{"Memb"}{$Member_Pos}{"value"}, "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"}, "Old_Value"=>$Member_Name, "New_Value"=>$RenamedTo ); } @@ -10865,8 +10843,7 @@ sub mergeTypes($$$) } %{$SubProblems{$ProblemType}{$Member_Name}}=( "Target"=>$Member_Name, - "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"} ); + "Type_Name"=>$Type1_Pure{"Name"} ); } elsif($Type2_Pure{"Type"} eq "Union") { @@ -10875,15 +10852,13 @@ sub mergeTypes($$$) { %{$SubProblems{"Removed_Union_Field_And_Size"}{$Member_Name}}=( "Target"=>$Member_Name, - "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"} ); + "Type_Name"=>$Type1_Pure{"Name"} ); } else { %{$SubProblems{"Removed_Union_Field"}{$Member_Name}}=( "Target"=>$Member_Name, - "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"} ); + "Type_Name"=>$Type1_Pure{"Name"} ); } } elsif($Type1_Pure{"Type"} eq "Enum") @@ -10891,7 +10866,6 @@ sub mergeTypes($$$) %{$SubProblems{"Enum_Member_Removed"}{$Member_Name}}=( "Target"=>$Member_Name, "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"}, "Old_Value"=>$Member_Name ); } } @@ -10913,7 +10887,6 @@ sub mergeTypes($$$) %{$SubProblems{$ProblemType}{$Member_Name}}=( "Target"=>$Member_Name, "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"}, "Old_Value"=>$Member_Value1, "New_Value"=>$Member_Value2 ); } @@ -10970,7 +10943,6 @@ sub mergeTypes($$$) %{$SubProblems{$ProblemType}{$Member_Name}}=( "Target"=>$Member_Name, "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"}, "Old_Size"=>$SizeV1, "New_Size"=>$SizeV2); } @@ -10988,16 +10960,14 @@ sub mergeTypes($$$) { %{$SubProblems{"Field_Became_Mutable"}{$Member_Name}}=( "Target"=>$Member_Name, - "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"}); + "Type_Name"=>$Type1_Pure{"Name"}); } elsif($Type1_Pure{"Memb"}{$Member_Pos}{"mutable"} and not $Type2_Pure{"Memb"}{$MemberPair_Pos}{"mutable"}) { %{$SubProblems{"Field_Became_NonMutable"}{$Member_Name}}=( "Target"=>$Member_Name, - "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"}); + "Type_Name"=>$Type1_Pure{"Name"}); } } %Sub_SubProblems = detectTypeChange($MemberType1_Id, $MemberType2_Id, "Field", $Level); @@ -11091,8 +11061,8 @@ sub mergeTypes($$$) } %{$SubProblems{$ProblemType}{$Member_Name}}=( "Target"=>$Member_Name, - "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"} ); + "Type_Name"=>$Type1_Pure{"Name"}); + foreach my $Attr (keys(%{$Sub_SubProblems{$ProblemType_Init}})) { # other properties $SubProblems{$ProblemType}{$Member_Name}{$Attr} = $Sub_SubProblems{$ProblemType_Init}{$Attr}; @@ -11160,8 +11130,7 @@ sub mergeTypes($$$) } %{$SubProblems{$ProblemType}{$Member_Name}}=( "Target"=>$Member_Name, - "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"} ); + "Type_Name"=>$Type1_Pure{"Name"}); } elsif($Type2_Pure{"Type"} eq "Union") { @@ -11170,15 +11139,13 @@ sub mergeTypes($$$) { %{$SubProblems{"Added_Union_Field_And_Size"}{$Member_Name}}=( "Target"=>$Member_Name, - "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"} ); + "Type_Name"=>$Type1_Pure{"Name"}); } else { %{$SubProblems{"Added_Union_Field"}{$Member_Name}}=( "Target"=>$Member_Name, - "Type_Name"=>$Type1_Pure{"Name"}, - "Type_Type"=>$Type1_Pure{"Type"} ); + "Type_Name"=>$Type1_Pure{"Name"}); } } elsif($Type2_Pure{"Type"} eq "Enum") @@ -11188,8 +11155,7 @@ sub mergeTypes($$$) %{$SubProblems{"Added_Enum_Member"}{$Member_Name}}=( "Target"=>$Member_Name, "Type_Name"=>$Type2_Pure{"Name"}, - "Type_Type"=>$Type2_Pure{"Type"}, - "New_Value"=>$Member_Value ); + "New_Value"=>$Member_Value); } } } @@ -11202,12 +11168,15 @@ sub isUnnamed($) { return $_[0]=~/\Aunnamed\d+\Z/; } -sub get_ShortType($$) +sub get_ShortClass($$) { my ($TypeId, $LibVersion) = @_; - my $TypeName = uncover_typedefs($TypeInfo{$LibVersion}{$TypeId}{"Name"}, $LibVersion); + my $TypeName = $TypeInfo{$LibVersion}{$TypeId}{"Name"}; + if($TypeInfo{$LibVersion}{$TypeId}{"Type"}!~/Intrinsic|Class|Struct|Union|Enum/) { + $TypeName = uncover_typedefs($TypeName, $LibVersion); + } if(my $NameSpace = $TypeInfo{$LibVersion}{$TypeId}{"NameSpace"}) { - $TypeName=~s/\A$NameSpace\:\://g; + $TypeName=~s/\A(struct |)\Q$NameSpace\E\:\://g; } return $TypeName; } @@ -11926,8 +11895,7 @@ sub mergeHeaders($) my $Cid = $CompleteSignature{1}{$Symbol}{"Class"}; %{$CompatProblems{$Level}{$Symbol}{"Removed_Const_Overload"}{$tr_name{$Symbol}}}=( "Type_Name"=>$TypeInfo{1}{$Cid}{"Name"}, - "Type_Type"=>"Class", - "Target"=>get_Signature($Alt, 1) ); + "Target"=>get_Signature($Alt, 1)); } else { # do NOT show removed symbol @@ -12116,10 +12084,9 @@ sub mergeSignatures($) { # old v-table is NOT copied by old applications %{$CompatProblems{$Level}{$OverriddenMethod}{"Overridden_Virtual_Method"}{$tr_name{$Symbol}}}=( "Type_Name"=>$AffectedClass_Name, - "Type_Type"=>"Class", "Target"=>get_Signature($Symbol, 2), "Old_Value"=>get_Signature($OverriddenMethod, 2), - "New_Value"=>get_Signature($Symbol, 2) ); + "New_Value"=>get_Signature($Symbol, 2)); } } } @@ -12156,10 +12123,9 @@ sub mergeSignatures($) { # old v-table is NOT copied by old applications %{$CompatProblems{$Level}{$Symbol}{"Overridden_Virtual_Method_B"}{$tr_name{$OverriddenMethod}}}=( "Type_Name"=>$AffectedClass_Name, - "Type_Type"=>"Class", "Target"=>get_Signature($OverriddenMethod, 1), "Old_Value"=>get_Signature($Symbol, 1), - "New_Value"=>get_Signature($OverriddenMethod, 1) ); + "New_Value"=>get_Signature($OverriddenMethod, 1)); } } } @@ -12477,10 +12443,9 @@ sub mergeSignatures($) } %{$CompatProblems{$Level}{$ASymbol}{$ProblemType}{$tr_name{$MnglName}}}=( "Type_Name"=>$Class_Type{"Name"}, - "Type_Type"=>"Class", "Old_Value"=>$CompleteSignature{1}{$Symbol}{"RelPos"}, "New_Value"=>$CompleteSignature{2}{$PSymbol}{"RelPos"}, - "Target"=>get_Signature($Symbol, 1) ); + "Target"=>get_Signature($Symbol, 1)); } $VTableChanged_M{$Class_Type{"Name"}} = 1; } @@ -13411,6 +13376,7 @@ sub detectTypeChange($$$$) my %Type2_Pure = get_PureType($Type2_Id, $TypeInfo{2}); my %Type1_Base = ($Type1_Pure{"Type"} eq "Array")?get_OneStep_BaseType($Type1_Pure{"Tid"}, $TypeInfo{1}):get_BaseType($Type1_Id, 1); my %Type2_Base = ($Type2_Pure{"Type"} eq "Array")?get_OneStep_BaseType($Type2_Pure{"Tid"}, $TypeInfo{2}):get_BaseType($Type2_Id, 2); + my $Type1_PLevel = get_PLevel($Type1_Id, 1); my $Type2_PLevel = get_PLevel($Type2_Id, 2); return () if(not $Type1{"Name"} or not $Type2{"Name"}); @@ -13582,11 +13548,12 @@ sub tNameLock($$) } elsif(differentDumps("V")) { # different versions of ABI dumps - if(not checkDump(1, "2.13") - or not checkDump(2, "2.13")) + if(not checkDump(1, "2.20") + or not checkDump(2, "2.20")) { # latest names update # 2.6: added restrict qualifier # 2.13: added missed typedefs to qualified types + # 2.20: prefix for struct, union and enum types $Changed = 1; } } @@ -13621,8 +13588,7 @@ sub tNameLock($$) or not checkDump(2, "2.13")) { # broken array names in ABI dumps < 2.13 if($TT1 eq "Array" - and $TT2 eq "Array") - { + and $TT2 eq "Array") { return 0; } } @@ -13631,8 +13597,16 @@ sub tNameLock($$) or not checkDump(2, "2.6")) { # added restrict attribute in 2.6 if($TN1!~/\brestrict\b/ - and $TN2=~/\brestrict\b/) - { + and $TN2=~/\brestrict\b/) { + return 0; + } + } + + if(not checkDump(1, "2.20") + or not checkDump(2, "2.20")) + { # added restrict attribute in 2.6 + if($TN1=~/\A(struct|union|enum) \Q$TN2\E\Z/ + or $TN2=~/\A(struct|union|enum) \Q$TN1\E\Z/) { return 0; } } @@ -14817,20 +14791,13 @@ sub get_Report_Impl() { foreach my $DyLib (sort {lc($a) cmp lc($b)} keys(%{$ReportMap{$HeaderName}})) { - my $FDyLib=$DyLib.($DyLib!~/\.\w+\Z/?" (.$LIB_EXT)":""); - if($HeaderName) { - $CHANGED_IMPLEMENTATION .= "<span class='h_name'>$HeaderName</span>, <span class='lib_name'>$FDyLib</span><br/>\n"; - } - else { - $CHANGED_IMPLEMENTATION .= "<span class='lib_name'>$DyLib</span><br/>\n"; - } my %NameSpaceSymbols = (); foreach my $Interface (keys(%{$ReportMap{$HeaderName}{$DyLib}})) { - $NameSpaceSymbols{get_IntNameSpace($Interface, 2)}{$Interface} = 1; + $NameSpaceSymbols{select_Symbol_NS($Interface, 2)}{$Interface} = 1; } foreach my $NameSpace (sort keys(%NameSpaceSymbols)) { - $CHANGED_IMPLEMENTATION .= ($NameSpace)?"<span class='ns_title'>namespace</span> <span class='ns'>$NameSpace</span><br/>\n":""; + $CHANGED_IMPLEMENTATION .= getTitle($HeaderName, $DyLib, $NameSpace); my @SortedInterfaces = sort {lc(get_Signature($a, 1)) cmp lc(get_Signature($b, 1))} keys(%{$NameSpaceSymbols{$NameSpace}}); foreach my $Interface (@SortedInterfaces) { @@ -14839,13 +14806,15 @@ sub get_Report_Impl() if($NameSpace) { $Signature=~s/\b\Q$NameSpace\E::\b//g; } - $CHANGED_IMPLEMENTATION .= insertIDs($ContentSpanStart.highLight_Signature_Italic_Color($Signature).$ContentSpanEnd."<br/>\n".$ContentDivStart."<span class='mangled'>[symbol: <b>$Interface</b>]</span>".$ImplProblems{$Interface}{"Diff"}."<br/><br/>".$ContentDivEnd."\n"); + $CHANGED_IMPLEMENTATION .= $ContentSpanStart.highLight_Signature_Italic_Color($Signature).$ContentSpanEnd."<br/>\n".$ContentDivStart."<span class='mangled'>[symbol: <b>$Interface</b>]</span>".$ImplProblems{$Interface}{"Diff"}."<br/><br/>".$ContentDivEnd."\n"; } + $CHANGED_IMPLEMENTATION .= "<br/>\n"; } - $CHANGED_IMPLEMENTATION .= "<br/>\n"; } } - if($CHANGED_IMPLEMENTATION) { + if($CHANGED_IMPLEMENTATION) + { + $CHANGED_IMPLEMENTATION = insertIDs($CHANGED_IMPLEMENTATION); $CHANGED_IMPLEMENTATION = "<a name='Changed_Implementation'></a><h2>Problems with Implementation ($Changed_Number)</h2><hr/>\n".$CHANGED_IMPLEMENTATION.$TOP_REF."<br/>\n"; } @@ -14874,7 +14843,7 @@ sub getTitle($$$) $Title .= "<span class='h_name'>$Header</span><br/>\n"; } if($NameSpace) { - $Title .= "<span class='ns_title'>namespace</span> <span class='ns'>$NameSpace</span><br/>\n"; + $Title .= "<span class='ns'>namespace <b>$NameSpace</b></span><br/>\n"; } return $Title; } @@ -14926,7 +14895,7 @@ sub get_Report_Added($) { my %NameSpaceSymbols = (); foreach my $Interface (keys(%{$ReportMap{$HeaderName}{$DyLib}})) { - $NameSpaceSymbols{get_IntNameSpace($Interface, 2)}{$Interface} = 1; + $NameSpaceSymbols{select_Symbol_NS($Interface, 2)}{$Interface} = 1; } foreach my $NameSpace (sort keys(%NameSpaceSymbols)) { @@ -15021,7 +14990,7 @@ sub get_Report_Removed($) { my %NameSpaceSymbols = (); foreach my $Interface (keys(%{$ReportMap{$HeaderName}{$DyLib}})) { - $NameSpaceSymbols{get_IntNameSpace($Interface, 1)}{$Interface} = 1; + $NameSpaceSymbols{select_Symbol_NS($Interface, 1)}{$Interface} = 1; } foreach my $NameSpace (sort keys(%NameSpaceSymbols)) { @@ -15291,7 +15260,7 @@ sub get_Report_SymbolProblems($$) { my (%NameSpaceSymbols, %NewSignature) = (); foreach my $Symbol (keys(%{$ReportMap{$HeaderName}{$DyLib}})) { - $NameSpaceSymbols{get_IntNameSpace($Symbol, 1)}{$Symbol} = 1; + $NameSpaceSymbols{select_Symbol_NS($Symbol, 1)}{$Symbol} = 1; } foreach my $NameSpace (sort keys(%NameSpaceSymbols)) { @@ -15368,7 +15337,7 @@ sub get_Report_TypeProblems($$) { my ($TargetSeverity, $Level) = @_; my $TYPE_PROBLEMS = ""; - my (%ReportMap, %TypeChanges, %TypeType) = (); + my (%ReportMap, %TypeChanges) = (); foreach my $Interface (sort keys(%{$CompatProblems{$Level}})) { foreach my $Kind (keys(%{$CompatProblems{$Level}{$Interface}})) @@ -15378,19 +15347,12 @@ sub get_Report_TypeProblems($$) foreach my $Location (sort {cmp_locations($b, $a)} sort keys(%{$CompatProblems{$Level}{$Interface}{$Kind}})) { my $TypeName = $CompatProblems{$Level}{$Interface}{$Kind}{$Location}{"Type_Name"}; - my $TypeType = $CompatProblems{$Level}{$Interface}{$Kind}{$Location}{"Type_Type"}; my $Target = $CompatProblems{$Level}{$Interface}{$Kind}{$Location}{"Target"}; - $CompatProblems{$Level}{$Interface}{$Kind}{$Location}{"Type_Type"} = lc($TypeType); my $Severity = getProblemSeverity($Level, $Kind); if($Severity eq "Safe" and $TargetSeverity ne "Safe") { next; } - if(not $TypeType{$TypeName} - or $TypeType{$TypeName} eq "struct") - { # register type of the type, select "class" if type has "class"- and "struct"-type changes - $TypeType{$TypeName} = $CompatProblems{$Level}{$Interface}{$Kind}{$Location}{"Type_Type"}; - } if(cmpSeverities($Type_MaxSeverity{$Level}{$TypeName}{$Kind}{$Target}, $Severity)) { # select a problem with the highest priority @@ -15475,12 +15437,12 @@ sub get_Report_TypeProblems($$) { my (%NameSpace_Type) = (); foreach my $TypeName (keys(%{$ReportMap{$HeaderName}})) { - $NameSpace_Type{parse_TypeNameSpace($TypeName, 1)}{$TypeName} = 1; + $NameSpace_Type{select_Type_NS($TypeName, 1)}{$TypeName} = 1; } foreach my $NameSpace (sort keys(%NameSpace_Type)) { $TYPE_PROBLEMS .= getTitle($HeaderName, "", $NameSpace); - my @SortedTypes = sort {$TypeType{$a}." ".lc($a) cmp $TypeType{$b}." ".lc($b)} keys(%{$NameSpace_Type{$NameSpace}}); + my @SortedTypes = sort {lc(show_Type($a, 0, 1)) cmp lc(show_Type($b, 0, 1))} keys(%{$NameSpace_Type{$NameSpace}}); foreach my $TypeName (@SortedTypes) { my $ProblemNum = 1; @@ -15507,7 +15469,8 @@ sub get_Report_TypeProblems($$) if($Level eq "Binary" and grep {$_=~/Virtual|Base_Class/} keys(%{$Kinds_Locations{$TypeName}})) { $ShowVTables = showVTables($TypeName); } - $TYPE_PROBLEMS .= $ContentSpanStart."<span class='extendable'>[+]</span> <span class='ttype'>".$TypeType{$TypeName}."</span> ".htmlSpecChars($TypeName)." ($ProblemNum)".$ContentSpanEnd; + + $TYPE_PROBLEMS .= $ContentSpanStart."<span class='extendable'>[+]</span> ".show_Type($TypeName, 1, 1)." ($ProblemNum)".$ContentSpanEnd; $TYPE_PROBLEMS .= "<br/>\n".$ContentDivStart."<table class='ptable'><tr>\n"; $TYPE_PROBLEMS .= "<th width='2%'></th><th width='47%'>Change</th>\n"; $TYPE_PROBLEMS .= "<th>Effect</th></tr>".$TYPE_REPORT."</table>\n"; @@ -15534,6 +15497,23 @@ sub get_Report_TypeProblems($$) return $TYPE_PROBLEMS; } +sub show_Type($$$) +{ + my ($Name, $Html, $LibVersion) = @_; + my $TType = $TypeInfo{$LibVersion}{$TName_Tid{$LibVersion}{$Name}}{"Type"}; + $TType = lc($TType); + if($TType=~/struct|union|enum/) { + $Name=~s/\A\Q$TType\E //g; + } + if($Html) { + $Name = "<span class='ttype'>".$TType."</span> ".htmlSpecChars($Name); + } + else { + $Name = $TType." ".$Name; + } + return $Name; +} + sub get_Anchor($$$) { my ($Kind, $Level, $Severity) = @_; @@ -16276,10 +16256,11 @@ sub checkPreprocessedUnit($) { my $Path = $_[0]; my ($CurHeader, $CurHeaderName) = ("", ""); + my $CurClass = ""; # extra info open(PREPROC, $Path) || die ("can't open file \'$Path\': $!\n"); + while(my $Line = <PREPROC>) { # detecting public and private constants - if(substr($Line, 0, 1) eq "#") { chomp($Line); @@ -16287,8 +16268,21 @@ sub checkPreprocessedUnit($) { $CurHeader = path_format($1, $OSgroup); $CurHeaderName = get_filename($CurHeader); + $CurClass = ""; + + if(index($CurHeader, $TMP_DIR)==0) { + next; + } + + if($ExtraInfo) + { + if(substr($CurHeaderName, 0, 1) ne "<") + { # skip <built-in>, <command-line>, etc. + $PreprocessedHeaders{$Version}{$CurHeader} = 1; + } + } } - if(not $ExtraInfo) + if(not $ExtraDump) { if(not $Include_Neighbors{$Version}{$CurHeaderName} and not $Registered_Headers{$Version}{$CurHeader}) @@ -16316,21 +16310,35 @@ sub checkPreprocessedUnit($) $Constants{$Version}{$1}{"Access"} = "private"; } } + else + { + if(defined $ExtraDump) + { + if($Line=~/(\w+)\s*\(/) + { # functions + $SymbolHeader{$Version}{$CurClass}{$1} = $CurHeader; + } + #elsif($Line=~/(\w+)\s*;/) + #{ # data + # $SymbolHeader{$Version}{$CurClass}{$1} = $CurHeader; + #} + elsif($Line=~/(\A|\s)class\s+(\w+)/) { + $CurClass = $2; + } + } + } } close(PREPROC); foreach my $Constant (keys(%{$Constants{$Version}})) { - if($Constants{$Version}{$Constant}{"Access"} eq "private" - or $Constant=~/_h\Z/i - or isBuiltIn($Constants{$Version}{$Constant}{"Header"})) - { # skip private constants - if($ExtraInfo) - { # save - delete($Constants{$Version}{$Constant}{"Access"}); - } - else { - delete($Constants{$Version}{$Constant}); - } + if($Constants{$Version}{$Constant}{"Access"} eq "private") + { + delete($Constants{$Version}{$Constant}); + next; + } + if(not $ExtraDump and ($Constant=~/_h\Z/i or isBuiltIn($Constants{$Version}{$Constant}{"Header"}))) + { # skip + delete($Constants{$Version}{$Constant}); } else { delete($Constants{$Version}{$Constant}{"Access"}); @@ -16550,15 +16558,20 @@ sub readSymbols($) { my %UndefinedLibs = (); - foreach my $LibPath (sort {length($a)<=>length($b)} @LibPaths) + my @Libs = (keys(%{$Library_Symbol{$LibVersion}}), keys(%{$DepLibrary_Symbol{$LibVersion}})); + + foreach my $LibName (sort @Libs) { - my $LibName = get_filename($LibPath); - foreach my $Symbol (keys(%{$UndefinedSymbols{$LibVersion}{$LibPath}})) + if(defined $UndefinedSymbols{$LibVersion}{$LibName}) { - if(not $Symbol_Library{$LibVersion}{$Symbol} and not $DepSymbol_Library{$LibVersion}{$Symbol}) + foreach my $Symbol (keys(%{$UndefinedSymbols{$LibVersion}{$LibName}})) { - foreach my $Path (find_SymbolLibs($LibVersion, $Symbol)) { - $UndefinedLibs{$Path} = 1; + if(not $Symbol_Library{$LibVersion}{$Symbol} + and not $DepSymbol_Library{$LibVersion}{$Symbol}) + { + foreach my $Path (find_SymbolLibs($LibVersion, $Symbol)) { + $UndefinedLibs{$Path} = 1; + } } } } @@ -16570,22 +16583,27 @@ sub readSymbols($) my $LibString = ""; foreach (@Paths) { + $KnownLibs{$_} = 1; my ($Dir, $Name) = separate_path($_); if(not grep {$Dir eq $_} (@{$SystemPaths{"lib"}})) { - $LibString .= "-L".esc($Dir); + $LibString .= " -L".esc($Dir); } $Name = parse_libname($Name, "name", $OStarget); $Name=~s/\Alib//; - $LibString .= "-l$Name"; + $LibString .= " -l$Name"; } writeFile($ExtraInfo."/libs-string", $LibString); } } } + if($ExtraInfo) { + writeFile($ExtraInfo."/lib-paths", join("\n", sort keys(%KnownLibs))); + } + if(not $CheckHeadersOnly) { if($#LibPaths!=-1) @@ -17062,7 +17080,7 @@ sub readline_ELF($) { # other lines return (); } - return () if(not defined $ELF_TYPE{$Info[2]}); + return () if(not defined $ELF_TYPE{$Info[2]} and $Info[5] ne "UND"); return () if(not defined $ELF_BIND{$Info[3]}); return () if(not defined $ELF_VIS{$Info[4]}); if($Info[5] eq "ABS" and $Info[0]=~/\A0+\Z/) @@ -17084,81 +17102,6 @@ sub readline_ELF($) return @Info; } -sub read_symlink($) -{ - my $Path = $_[0]; - if(my $Res = readlink($Path)) { - return $Res; - } - elsif(my $ReadlinkCmd = get_CmdPath("readlink")) { - return `$ReadlinkCmd -n \"$Path\"`; - } - elsif(my $FileCmd = get_CmdPath("file")) - { - my $Info = `$FileCmd \"$Path\"`; - if($Info=~/symbolic\s+link\s+to\s+['`"]*([\w\d\.\-\/\\]+)['`"]*/i) { - return $1; - } - } - - # can't read - return ""; -} - -sub resolve_symlink($) -{ - my $Path = $_[0]; - return "" if(not $Path); - - if(defined $Cache{"resolve_symlink"}{$Path}) { - return $Cache{"resolve_symlink"}{$Path}; - } - if(not -f $Path and not -l $Path) - { # broken - return ($Cache{"resolve_symlink"}{$Path} = ""); - } - return ($Cache{"resolve_symlink"}{$Path} = resolve_symlink_I($Path)); -} - -sub resolve_symlink_I($) -{ - my $Path = $_[0]; - return $Path if(isCyclical(\@RecurSymlink, $Path)); - my $Res = $Path; - push(@RecurSymlink, $Path); - if(-l $Path and my $Redirect = read_symlink($Path)) - { - if(is_abs($Redirect)) - { # absolute path - if($SystemRoot and $SystemRoot ne "/" - and $Path=~/\A\Q$SystemRoot\E\// - and (-f $SystemRoot.$Redirect or -l $SystemRoot.$Redirect)) - { # symbolic links from the sysroot - # should be corrected to point to - # the files inside sysroot - $Redirect = $SystemRoot.$Redirect; - } - $Res = resolve_symlink($Redirect); - } - elsif($Redirect=~/\.\.[\/\\]/) - { # relative path - $Redirect = joinPath(get_dirname($Path), $Redirect); - while($Redirect=~s&(/|\\)[^\/\\]+(\/|\\)\.\.(\/|\\)&$1&){}; - $Res = resolve_symlink($Redirect); - } - elsif(-f get_dirname($Path)."/".$Redirect) - { # file name in the same directory - $Res = resolve_symlink(joinPath(get_dirname($Path), $Redirect)); - } - else - { # broken link - $Res = ""; - } - } - pop(@RecurSymlink); - return $Res; -} - sub get_LibPath($$) { my ($LibVersion, $Name) = @_; @@ -17199,7 +17142,7 @@ sub get_LibPath_I($$) { # search in default linker directories # and then in all system paths if(-f $Dir."/".$Name) { - return joinPath($Dir,$Name); + return join_P($Dir,$Name); } } detectSystemObjects() if(not keys(%SystemObjects)); @@ -17223,7 +17166,20 @@ sub readSymbols_Lib($$$$$$) { my ($LibVersion, $Lib_Path, $IsNeededLib, $Weak, $Deps, $Vers) = @_; return () if(not $LibVersion or not $Lib_Path); - my $Lib_Name = get_filename(resolve_symlink($Lib_Path)); + + my $Real_Path = realpath($Lib_Path); + + if(not $Real_Path) + { # broken link + return (); + } + + my $Lib_Name = get_filename($Real_Path); + + if($ExtraInfo) { + $KnownLibs{$Real_Path} = 1; + } + if($IsNeededLib) { if($CheckedDyLib{$LibVersion}{$Lib_Name}) { @@ -17289,7 +17245,7 @@ sub readSymbols_Lib($$$$$$) { if(/ U _([\w\$]+)\s*\Z/) { - $UndefinedSymbols{$LibVersion}{$Lib_Path}{$1} = 1; + $UndefinedSymbols{$LibVersion}{$Lib_Name}{$1} = 0; next; } } @@ -17460,7 +17416,7 @@ sub readSymbols_Lib($$$$$$) if($CheckUndefined) { if(not $IsNeededLib) { - $UndefinedSymbols{$LibVersion}{$Lib_Path}{$Symbol} = 1; + $UndefinedSymbols{$LibVersion}{$Lib_Name}{$Symbol} = 0; } } next; @@ -17528,7 +17484,7 @@ sub readSymbols_Lib($$$$$$) { if(not $IsNeededLib and $LIB_EXT eq "so") { # get symbol versions - foreach my $Symbol (keys(%{$Symbol_Library{$LibVersion}})) + foreach my $Symbol (keys(%{$Library_Symbol{$LibVersion}{$Lib_Name}})) { next if(index($Symbol,"\@")==-1); if(my $Value = $Interface_Value{$LibVersion}{$Symbol}) @@ -17559,8 +17515,11 @@ sub readSymbols_Lib($$$$$$) { foreach my $DyLib (sort keys(%NeededLib)) { - if(my $DepPath = get_LibPath($LibVersion, $DyLib)) { - readSymbols_Lib($LibVersion, $DepPath, 1, "+Weak", $Deps, $Vers); + if(my $DepPath = get_LibPath($LibVersion, $DyLib)) + { + if(not $CheckedDyLib{$LibVersion}{get_filename($DepPath)}) { + readSymbols_Lib($LibVersion, $DepPath, 1, "+Weak", $Deps, $Vers); + } } } } @@ -17816,7 +17775,7 @@ sub getSOPaths_Dest($$) if(get_filename($Path)=~/\A(|lib)\Q$TargetLibraryName\E[\d\-]*\.$LIB_EXT[\d\.]*\Z/i) { registerObject($Path, $LibVersion); - $Libs{resolve_symlink($Path)}=1; + $Libs{realpath($Path)}=1; } } } @@ -17827,7 +17786,7 @@ sub getSOPaths_Dest($$) next if(ignore_path($Path)); next if(skip_lib($Path, $LibVersion)); registerObject($Path, $LibVersion); - $Libs{resolve_symlink($Path)}=1; + $Libs{realpath($Path)}=1; } if($OSgroup eq "macos") { # shared libraries on MacOS X may have no extension @@ -17839,7 +17798,7 @@ sub getSOPaths_Dest($$) and cmd_file($Path)=~/(shared|dynamic)\s+library/i) { registerObject($Path, $LibVersion); - $Libs{resolve_symlink($Path)}=1; + $Libs{realpath($Path)}=1; } } } @@ -18009,6 +17968,10 @@ sub read_ABI_Dump($$) { # --ext option $ExtendedCheck = 1; } + if($ABI->{"Extra"}) { + $ExtraDump = 1; + } + if(my $Lang = $ABI->{"Language"}) { $UsedDump{$LibVersion}{"L"} = $Lang; @@ -18196,6 +18159,37 @@ sub read_ABI_Dump($$) translateSymbols(keys(%{$Symbol_Library{$LibVersion}}), $LibVersion); translateSymbols(keys(%{$DepSymbol_Library{$LibVersion}}), $LibVersion); + if(not checkDump($LibVersion, "2.20")) + { # support for old ABI dumps + foreach my $TypeId (sort {int($a)<=>int($b)} keys(%{$TypeInfo{$LibVersion}})) + { + my $TType = $TypeInfo{$LibVersion}{$TypeId}{"Type"}; + + if($TType=~/Struct|Union|Enum|Typedef/) + { # repair complex types first + next; + } + + if(my $BaseId = $TypeInfo{$LibVersion}{$TypeId}{"BaseType"}{"Tid"}) + { + my $BType = lc($TypeInfo{$LibVersion}{$BaseId}{"Type"}); + if($BType=~/Struct|Union|Enum/i) + { + my $BName = $TypeInfo{$LibVersion}{$BaseId}{"Name"}; + $TypeInfo{$LibVersion}{$TypeId}{"Name"}=~s/\A\Q$BName\E\b/$BType $BName/g; + } + } + } + foreach my $TypeId (sort {int($a)<=>int($b)} keys(%{$TypeInfo{$LibVersion}})) + { + my $TType = $TypeInfo{$LibVersion}{$TypeId}{"Type"}; + my $TName = $TypeInfo{$LibVersion}{$TypeId}{"Name"}; + if($TType=~/Struct|Union|Enum/) { + $TypeInfo{$LibVersion}{$TypeId}{"Name"} = lc($TType)." ".$TName; + } + } + } + foreach my $TypeId (sort {int($a)<=>int($b)} keys(%{$TypeInfo{$LibVersion}})) { # order is important if(defined $TypeInfo{$LibVersion}{$TypeId}{"BaseClass"}) @@ -18460,8 +18454,12 @@ sub detect_lib_default_paths() { foreach my $Line (split(/\n/, `$LdConfig -r 2>\"$TMP_DIR/null\"`)) { - if($Line=~/\A[ \t]*\d+:\-l(.+) \=\> (.+)\Z/) { - $LPaths{"lib".$1} = $2; + if($Line=~/\A[ \t]*\d+:\-l(.+) \=\> (.+)\Z/) + { + my $Name = "lib".$1; + if(not defined $LPaths{$Name}) { + $LPaths{$Name} = $2; + } } } } @@ -18485,7 +18483,15 @@ sub detect_lib_default_paths() { my ($Name, $Path) = ($1, $2); $Path=~s/[\/]{2,}/\//; - $LPaths{$Name} = $Path; + if(not defined $LPaths{$Name}) + { # get first element from the list of available paths + + # libstdc++.so.6 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 + # libstdc++.so.6 (libc6) => /usr/lib/i386-linux-gnu/libstdc++.so.6 + # libstdc++.so.6 (libc6) => /usr/lib32/libstdc++.so.6 + + $LPaths{$Name} = $Path; + } } } } @@ -18506,7 +18512,6 @@ sub detect_bin_default_paths() foreach my $Path (split(/$Sep/, $EnvPaths)) { $Path = path_format($Path, $OSgroup); - $Path=~s/[\/\\]+\Z//g; next if(not $Path); if($SystemRoot and $Path=~/\A\Q$SystemRoot\E\//) @@ -18528,8 +18533,7 @@ sub detect_inc_default_paths() if($Line=~/\A[ \t]*((\/|\w+:\\).+)[ \t]*\Z/) { - my $Path = simplify_path($1); - $Path=~s/[\/\\]+\.?\Z//g; + my $Path = realpath($1); $Path = path_format($Path, $OSgroup); if(index($Path, "c++")!=-1 or index($Path, "/g++/")!=-1) @@ -18766,6 +18770,12 @@ sub detect_default_paths($) push_U(\@UsersIncPath, $IncPath); } } + + if($ExtraInfo) + { + writeFile($ExtraInfo."/default-libs", join("\n", @DefaultLibPaths)); + writeFile($ExtraInfo."/default-includes", join("\n", (@DefaultCppPaths, @DefaultGccPaths, @DefaultIncPaths))); + } } sub getLIB_EXT($) @@ -19070,7 +19080,7 @@ sub createSymbolsList($$$$$) { my %NS_Symbol = (); foreach my $Symbol (keys(%{$SymbolHeaderLib{$HeaderName}{$DyLib}})) { - $NS_Symbol{get_IntNameSpace($Symbol, 1)}{$Symbol} = 1; + $NS_Symbol{select_Symbol_NS($Symbol, 1)}{$Symbol} = 1; } foreach my $NameSpace (sort keys(%NS_Symbol)) { @@ -19524,25 +19534,6 @@ sub create_ABI_Dump() if(not -e $DumpAPI) { exitStatus("Access_Error", "can't access \'$DumpAPI\'"); } - # check the archive utilities - if($OSgroup eq "windows") - { # using zip - my $ZipCmd = get_CmdPath("zip"); - if(not $ZipCmd) { - exitStatus("Not_Found", "can't find \"zip\""); - } - } - else - { # using tar and gzip - my $TarCmd = get_CmdPath("tar"); - if(not $TarCmd) { - exitStatus("Not_Found", "can't find \"tar\""); - } - my $GzipCmd = get_CmdPath("gzip"); - if(not $GzipCmd) { - exitStatus("Not_Found", "can't find \"gzip\""); - } - } my @DParts = split(/\s*,\s*/, $DumpAPI); foreach my $Part (@DParts) { @@ -19562,6 +19553,27 @@ sub create_ABI_Dump() } initLogging(1); detect_default_paths("inc|lib|bin|gcc"); # complete analysis + + # check the archive utilities + if($OSgroup eq "windows") + { # using zip + my $ZipCmd = get_CmdPath("zip"); + if(not $ZipCmd) { + exitStatus("Not_Found", "can't find \"zip\""); + } + } + else + { # using tar and gzip + my $TarCmd = get_CmdPath("tar"); + if(not $TarCmd) { + exitStatus("Not_Found", "can't find \"tar\""); + } + my $GzipCmd = get_CmdPath("gzip"); + if(not $GzipCmd) { + exitStatus("Not_Found", "can't find \"gzip\""); + } + } + if(not $Descriptor{1}{"Dump"}) { if(not $CheckHeadersOnly) { @@ -19660,6 +19672,11 @@ sub create_ABI_Dump() { # --binary $ABI{"BinOnly"} = 1; } + if($ExtraDump) + { # --extra-info + $ABI{"UndefinedSymbols"} = $UndefinedSymbols{1}; + $ABI{"Extra"} = 1; + } my $ABI_DUMP = ""; if($UseXML) @@ -19801,6 +19818,14 @@ sub initLogging($) if($Debug) { # debug directory $DEBUG_PATH{$LibVersion} = "debug/$TargetLibraryName/".$Descriptor{$LibVersion}{"Version"}; + + if(not $ExtraInfo) + { # enable --extra-info + $ExtraInfo = $DEBUG_PATH{$LibVersion}."/extra-info"; + } + + # enable --extra-dump + $ExtraDump = 1; } resetLogging($LibVersion); } @@ -19835,7 +19860,7 @@ sub printErrorLog($) sub isDump($) { - if(get_filename($_[0])=~/\A(.+)\.(abi|abidump)(\.tar\.gz|\.zip|\.xml|)\Z/) { + if(get_filename($_[0])=~/\A(.+)\.(abi|abidump|dump)(\.tar\.gz|\.zip|\.xml|)\Z/) { return $1; } return 0; @@ -19843,7 +19868,7 @@ sub isDump($) sub isDump_U($) { - if(get_filename($_[0])=~/\A(.+)\.(abi|abidump)(\.xml|)\Z/) { + if(get_filename($_[0])=~/\A(.+)\.(abi|abidump|dump)(\.xml|)\Z/) { return $1; } return 0; @@ -19965,6 +19990,12 @@ sub compareInit() if($UseDumps) { # --use-dumps # parallel processing + my $DumpPath1 = "abi_dumps/$TargetLibraryName/".$TargetLibraryName."_".$Descriptor{1}{"Version"}.".abi.$AR_EXT"; + my $DumpPath2 = "abi_dumps/$TargetLibraryName/".$TargetLibraryName."_".$Descriptor{2}{"Version"}.".abi.$AR_EXT"; + + unlink($DumpPath1); + unlink($DumpPath2); + my $pid = fork(); if($pid) { # dump on two CPU cores @@ -20020,7 +20051,7 @@ sub compareInit() printMsg("INFO", "running perl $0 @PARAMS"); } system("perl", $0, @PARAMS); - if($?) { + if(not -f $DumpPath1) { exit(1); } } @@ -20078,7 +20109,7 @@ sub compareInit() printMsg("INFO", "running perl $0 @PARAMS"); } system("perl", $0, @PARAMS); - if($?) { + if(not -f $DumpPath2) { exit(1); } else { @@ -20087,8 +20118,8 @@ sub compareInit() } waitpid($pid, 0); my @CMP_PARAMS = ("-l", $TargetLibraryName); - @CMP_PARAMS = (@CMP_PARAMS, "-d1", "abi_dumps/$TargetLibraryName/".$TargetLibraryName."_".$Descriptor{1}{"Version"}.".abi.$AR_EXT"); - @CMP_PARAMS = (@CMP_PARAMS, "-d2", "abi_dumps/$TargetLibraryName/".$TargetLibraryName."_".$Descriptor{2}{"Version"}.".abi.$AR_EXT"); + @CMP_PARAMS = (@CMP_PARAMS, "-d1", $DumpPath1); + @CMP_PARAMS = (@CMP_PARAMS, "-d2", $DumpPath2); if($TargetLibraryFName ne $TargetLibraryName) { @CMP_PARAMS = (@CMP_PARAMS, "-l-full", $TargetLibraryFName); } @@ -20331,7 +20362,7 @@ sub getSysOpts() return \%Opts; } -sub get_CoreError($) +sub get_CodeError($) { my %CODE_ERROR = reverse(%ERROR_CODE); return $CODE_ERROR{$_[0]}; @@ -20364,7 +20395,7 @@ sub scenario() } if($OutputDumpPath) { # validate - if($OutputDumpPath!~/\.abi(\.\Q$AR_EXT\E|)\Z/) { + if(not isDump($OutputDumpPath)) { exitStatus("Error", "the dump path should be a path to *.abi.$AR_EXT or *.abi file"); } } diff --git a/doc/Changes.html b/doc/Changes.html index 618537d..1a883e0 100644 --- a/doc/Changes.html +++ b/doc/Changes.html @@ -21,7 +21,7 @@ </style> <script src="/load.php?debug=false&lang=en&modules=startup&only=scripts&skin=monobook&*"></script> <script>if(window.mw){ - mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker_Downloads", "wgTitle": "ABI Compliance Checker Downloads", "wgCurRevisionId": 8163, "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": 8212, "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,49 +43,79 @@ </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.98.6_.28December_04.2C_2012.29"><span class="tocnumber">1</span> <span class="toctext">Version 1.98.6 (December 04, 2012)</span></a></li> -<li class="toclevel-1 tocsection-2"><a href="#Version_1.98.5_.28November_30.2C_2012.29"><span class="tocnumber">2</span> <span class="toctext">Version 1.98.5 (November 30, 2012)</span></a></li> -<li class="toclevel-1 tocsection-3"><a href="#Version_1.98.4_.28October_18.2C_2012.29"><span class="tocnumber">3</span> <span class="toctext">Version 1.98.4 (October 18, 2012)</span></a></li> -<li class="toclevel-1 tocsection-4"><a href="#Version_1.98.3_.28July_19.2C_2012.29"><span class="tocnumber">4</span> <span class="toctext">Version 1.98.3 (July 19, 2012)</span></a></li> -<li class="toclevel-1 tocsection-5"><a href="#Version_1.98.2_.28June_26.2C_2012.29"><span class="tocnumber">5</span> <span class="toctext">Version 1.98.2 (June 26, 2012)</span></a></li> -<li class="toclevel-1 tocsection-6"><a href="#Version_1.98.1_.28June_18.2C_2012.29"><span class="tocnumber">6</span> <span class="toctext">Version 1.98.1 (June 18, 2012)</span></a></li> -<li class="toclevel-1 tocsection-7"><a href="#Version_1.98.0_.28June_14.2C_2012.29"><span class="tocnumber">7</span> <span class="toctext">Version 1.98.0 (June 14, 2012)</span></a></li> -<li class="toclevel-1 tocsection-8"><a href="#Version_1.97.8_.28June_08.2C_2012.29"><span class="tocnumber">8</span> <span class="toctext">Version 1.97.8 (June 08, 2012)</span></a></li> -<li class="toclevel-1 tocsection-9"><a href="#Version_1.97.5_.28May_14.2C_2012.29"><span class="tocnumber">9</span> <span class="toctext">Version 1.97.5 (May 14, 2012)</span></a></li> -<li class="toclevel-1 tocsection-10"><a href="#Version_1.97.4_.28April_16.2C_2012.29"><span class="tocnumber">10</span> <span class="toctext">Version 1.97.4 (April 16, 2012)</span></a></li> -<li class="toclevel-1 tocsection-11"><a href="#Version_1.97.3_.28April_03.2C_2012.29"><span class="tocnumber">11</span> <span class="toctext">Version 1.97.3 (April 03, 2012)</span></a></li> -<li class="toclevel-1 tocsection-12"><a href="#Version_1.96.8_.28February_17.2C_2012.29"><span class="tocnumber">12</span> <span class="toctext">Version 1.96.8 (February 17, 2012)</span></a></li> -<li class="toclevel-1 tocsection-13"><a href="#Version_1.94_.28September_09.2C_2011.29"><span class="tocnumber">13</span> <span class="toctext">Version 1.94 (September 09, 2011)</span></a></li> -<li class="toclevel-1 tocsection-14"><a href="#Version_1.93.8_.28September_08.2C_2011.29"><span class="tocnumber">14</span> <span class="toctext">Version 1.93.8 (September 08, 2011)</span></a></li> -<li class="toclevel-1 tocsection-15"><a href="#Version_1.23.5_.28July_01.2C_2011.29"><span class="tocnumber">15</span> <span class="toctext">Version 1.23.5 (July 01, 2011)</span></a></li> -<li class="toclevel-1 tocsection-16"><a href="#Version_1.23_.28June_07.2C_2011.29"><span class="tocnumber">16</span> <span class="toctext">Version 1.23 (June 07, 2011)</span></a></li> -<li class="toclevel-1 tocsection-17"><a href="#Version_1.21.12_.28April_29.2C_2011.29"><span class="tocnumber">17</span> <span class="toctext">Version 1.21.12 (April 29, 2011)</span></a></li> -<li class="toclevel-1 tocsection-18"><a href="#Version_1.21_.28August_19.2C_2010.29"><span class="tocnumber">18</span> <span class="toctext">Version 1.21 (August 19, 2010)</span></a></li> -<li class="toclevel-1 tocsection-19"><a href="#Version_1.20_.28August_30.2C_2010.29"><span class="tocnumber">19</span> <span class="toctext">Version 1.20 (August 30, 2010)</span></a></li> -<li class="toclevel-1 tocsection-20"><a href="#Version_1.19_.28July_22.2C_2010.29"><span class="tocnumber">20</span> <span class="toctext">Version 1.19 (July 22, 2010)</span></a></li> -<li class="toclevel-1 tocsection-21"><a href="#Version_1.18_.28June_25.2C_2010.29"><span class="tocnumber">21</span> <span class="toctext">Version 1.18 (June 25, 2010)</span></a></li> -<li class="toclevel-1 tocsection-22"><a href="#Version_1.17.2_.28June_16.2C_2010.29"><span class="tocnumber">22</span> <span class="toctext">Version 1.17.2 (June 16, 2010)</span></a></li> -<li class="toclevel-1 tocsection-23"><a href="#Version_1.17.1_.28June_09.2C_2010.29"><span class="tocnumber">23</span> <span class="toctext">Version 1.17.1 (June 09, 2010)</span></a></li> -<li class="toclevel-1 tocsection-24"><a href="#Version_1.17_.28June_08.2C_2010.29"><span class="tocnumber">24</span> <span class="toctext">Version 1.17 (June 08, 2010)</span></a></li> -<li class="toclevel-1 tocsection-25"><a href="#Version_1.16_.28May_05.2C_2010.29"><span class="tocnumber">25</span> <span class="toctext">Version 1.16 (May 05, 2010)</span></a></li> -<li class="toclevel-1 tocsection-26"><a href="#Version_1.15_.28March_26.2C_2010.29"><span class="tocnumber">26</span> <span class="toctext">Version 1.15 (March 26, 2010)</span></a></li> -<li class="toclevel-1 tocsection-27"><a href="#Version_1.14_.28March_03.2C_2010.29"><span class="tocnumber">27</span> <span class="toctext">Version 1.14 (March 03, 2010)</span></a></li> -<li class="toclevel-1 tocsection-28"><a href="#Version_1.13_.28February_16.2C_2010.29"><span class="tocnumber">28</span> <span class="toctext">Version 1.13 (February 16, 2010)</span></a></li> -<li class="toclevel-1 tocsection-29"><a href="#Version_1.12_.28December_04.2C_2009.29"><span class="tocnumber">29</span> <span class="toctext">Version 1.12 (December 04, 2009)</span></a></li> -<li class="toclevel-1 tocsection-30"><a href="#Version_1.11_.28November_10.2C_2009.29"><span class="tocnumber">30</span> <span class="toctext">Version 1.11 (November 10, 2009)</span></a></li> -<li class="toclevel-1 tocsection-31"><a href="#Version_1.10_.28November_02.2C_2009.29"><span class="tocnumber">31</span> <span class="toctext">Version 1.10 (November 02, 2009)</span></a></li> -<li class="toclevel-1 tocsection-32"><a href="#Version_1.9_.28October_12.2C_2009.29"><span class="tocnumber">32</span> <span class="toctext">Version 1.9 (October 12, 2009)</span></a></li> -<li class="toclevel-1 tocsection-33"><a href="#Version_1.8_.28September_29.2C_2009.29"><span class="tocnumber">33</span> <span class="toctext">Version 1.8 (September 29, 2009)</span></a></li> -<li class="toclevel-1 tocsection-34"><a href="#Version_1.7_.28September_11.2C_2009.29"><span class="tocnumber">34</span> <span class="toctext">Version 1.7 (September 11, 2009)</span></a></li> -<li class="toclevel-1 tocsection-35"><a href="#Version_1.6_.28August_31.2C_2009.29"><span class="tocnumber">35</span> <span class="toctext">Version 1.6 (August 31, 2009)</span></a></li> -<li class="toclevel-1 tocsection-36"><a href="#Version_1.5_.28August_25.2C_2009.29"><span class="tocnumber">36</span> <span class="toctext">Version 1.5 (August 25, 2009)</span></a></li> -<li class="toclevel-1 tocsection-37"><a href="#Version_1.4_.28August_18.2C_2009.29"><span class="tocnumber">37</span> <span class="toctext">Version 1.4 (August 18, 2009)</span></a></li> -<li class="toclevel-1 tocsection-38"><a href="#Version_1.3_.28August_14.2C_2009.29"><span class="tocnumber">38</span> <span class="toctext">Version 1.3 (August 14, 2009)</span></a></li> -<li class="toclevel-1 tocsection-39"><a href="#Version_1.2_.28August_07.2C_2009.29"><span class="tocnumber">39</span> <span class="toctext">Version 1.2 (August 07, 2009)</span></a></li> -<li class="toclevel-1 tocsection-40"><a href="#Version_1.1_.28August_06.2C_2009.29"><span class="tocnumber">40</span> <span class="toctext">Version 1.1 (August 06, 2009)</span></a></li> -<li class="toclevel-1 tocsection-41"><a href="#Version_1.0_.28July_31.2C_2009.29"><span class="tocnumber">41</span> <span class="toctext">Version 1.0 (July 31, 2009)</span></a></li> +<li class="toclevel-1 tocsection-1"><a href="#Version_1.98.7_.28December_14.2C_2012.29"><span class="tocnumber">1</span> <span class="toctext">Version 1.98.7 (December 14, 2012)</span></a></li> +<li class="toclevel-1 tocsection-2"><a href="#Version_1.98.6_.28December_04.2C_2012.29"><span class="tocnumber">2</span> <span class="toctext">Version 1.98.6 (December 04, 2012)</span></a></li> +<li class="toclevel-1 tocsection-3"><a href="#Version_1.98.5_.28November_30.2C_2012.29"><span class="tocnumber">3</span> <span class="toctext">Version 1.98.5 (November 30, 2012)</span></a></li> +<li class="toclevel-1 tocsection-4"><a href="#Version_1.98.4_.28October_18.2C_2012.29"><span class="tocnumber">4</span> <span class="toctext">Version 1.98.4 (October 18, 2012)</span></a></li> +<li class="toclevel-1 tocsection-5"><a href="#Version_1.98.3_.28July_19.2C_2012.29"><span class="tocnumber">5</span> <span class="toctext">Version 1.98.3 (July 19, 2012)</span></a></li> +<li class="toclevel-1 tocsection-6"><a href="#Version_1.98.2_.28June_26.2C_2012.29"><span class="tocnumber">6</span> <span class="toctext">Version 1.98.2 (June 26, 2012)</span></a></li> +<li class="toclevel-1 tocsection-7"><a href="#Version_1.98.1_.28June_18.2C_2012.29"><span class="tocnumber">7</span> <span class="toctext">Version 1.98.1 (June 18, 2012)</span></a></li> +<li class="toclevel-1 tocsection-8"><a href="#Version_1.98.0_.28June_14.2C_2012.29"><span class="tocnumber">8</span> <span class="toctext">Version 1.98.0 (June 14, 2012)</span></a></li> +<li class="toclevel-1 tocsection-9"><a href="#Version_1.97.8_.28June_08.2C_2012.29"><span class="tocnumber">9</span> <span class="toctext">Version 1.97.8 (June 08, 2012)</span></a></li> +<li class="toclevel-1 tocsection-10"><a href="#Version_1.97.5_.28May_14.2C_2012.29"><span class="tocnumber">10</span> <span class="toctext">Version 1.97.5 (May 14, 2012)</span></a></li> +<li class="toclevel-1 tocsection-11"><a href="#Version_1.97.4_.28April_16.2C_2012.29"><span class="tocnumber">11</span> <span class="toctext">Version 1.97.4 (April 16, 2012)</span></a></li> +<li class="toclevel-1 tocsection-12"><a href="#Version_1.97.3_.28April_03.2C_2012.29"><span class="tocnumber">12</span> <span class="toctext">Version 1.97.3 (April 03, 2012)</span></a></li> +<li class="toclevel-1 tocsection-13"><a href="#Version_1.96.8_.28February_17.2C_2012.29"><span class="tocnumber">13</span> <span class="toctext">Version 1.96.8 (February 17, 2012)</span></a></li> +<li class="toclevel-1 tocsection-14"><a href="#Version_1.94_.28September_09.2C_2011.29"><span class="tocnumber">14</span> <span class="toctext">Version 1.94 (September 09, 2011)</span></a></li> +<li class="toclevel-1 tocsection-15"><a href="#Version_1.93.8_.28September_08.2C_2011.29"><span class="tocnumber">15</span> <span class="toctext">Version 1.93.8 (September 08, 2011)</span></a></li> +<li class="toclevel-1 tocsection-16"><a href="#Version_1.23.5_.28July_01.2C_2011.29"><span class="tocnumber">16</span> <span class="toctext">Version 1.23.5 (July 01, 2011)</span></a></li> +<li class="toclevel-1 tocsection-17"><a href="#Version_1.23_.28June_07.2C_2011.29"><span class="tocnumber">17</span> <span class="toctext">Version 1.23 (June 07, 2011)</span></a></li> +<li class="toclevel-1 tocsection-18"><a href="#Version_1.21.12_.28April_29.2C_2011.29"><span class="tocnumber">18</span> <span class="toctext">Version 1.21.12 (April 29, 2011)</span></a></li> +<li class="toclevel-1 tocsection-19"><a href="#Version_1.21_.28August_19.2C_2010.29"><span class="tocnumber">19</span> <span class="toctext">Version 1.21 (August 19, 2010)</span></a></li> +<li class="toclevel-1 tocsection-20"><a href="#Version_1.20_.28August_30.2C_2010.29"><span class="tocnumber">20</span> <span class="toctext">Version 1.20 (August 30, 2010)</span></a></li> +<li class="toclevel-1 tocsection-21"><a href="#Version_1.19_.28July_22.2C_2010.29"><span class="tocnumber">21</span> <span class="toctext">Version 1.19 (July 22, 2010)</span></a></li> +<li class="toclevel-1 tocsection-22"><a href="#Version_1.18_.28June_25.2C_2010.29"><span class="tocnumber">22</span> <span class="toctext">Version 1.18 (June 25, 2010)</span></a></li> +<li class="toclevel-1 tocsection-23"><a href="#Version_1.17.2_.28June_16.2C_2010.29"><span class="tocnumber">23</span> <span class="toctext">Version 1.17.2 (June 16, 2010)</span></a></li> +<li class="toclevel-1 tocsection-24"><a href="#Version_1.17.1_.28June_09.2C_2010.29"><span class="tocnumber">24</span> <span class="toctext">Version 1.17.1 (June 09, 2010)</span></a></li> +<li class="toclevel-1 tocsection-25"><a href="#Version_1.17_.28June_08.2C_2010.29"><span class="tocnumber">25</span> <span class="toctext">Version 1.17 (June 08, 2010)</span></a></li> +<li class="toclevel-1 tocsection-26"><a href="#Version_1.16_.28May_05.2C_2010.29"><span class="tocnumber">26</span> <span class="toctext">Version 1.16 (May 05, 2010)</span></a></li> +<li class="toclevel-1 tocsection-27"><a href="#Version_1.15_.28March_26.2C_2010.29"><span class="tocnumber">27</span> <span class="toctext">Version 1.15 (March 26, 2010)</span></a></li> +<li class="toclevel-1 tocsection-28"><a href="#Version_1.14_.28March_03.2C_2010.29"><span class="tocnumber">28</span> <span class="toctext">Version 1.14 (March 03, 2010)</span></a></li> +<li class="toclevel-1 tocsection-29"><a href="#Version_1.13_.28February_16.2C_2010.29"><span class="tocnumber">29</span> <span class="toctext">Version 1.13 (February 16, 2010)</span></a></li> +<li class="toclevel-1 tocsection-30"><a href="#Version_1.12_.28December_04.2C_2009.29"><span class="tocnumber">30</span> <span class="toctext">Version 1.12 (December 04, 2009)</span></a></li> +<li class="toclevel-1 tocsection-31"><a href="#Version_1.11_.28November_10.2C_2009.29"><span class="tocnumber">31</span> <span class="toctext">Version 1.11 (November 10, 2009)</span></a></li> +<li class="toclevel-1 tocsection-32"><a href="#Version_1.10_.28November_02.2C_2009.29"><span class="tocnumber">32</span> <span class="toctext">Version 1.10 (November 02, 2009)</span></a></li> +<li class="toclevel-1 tocsection-33"><a href="#Version_1.9_.28October_12.2C_2009.29"><span class="tocnumber">33</span> <span class="toctext">Version 1.9 (October 12, 2009)</span></a></li> +<li class="toclevel-1 tocsection-34"><a href="#Version_1.8_.28September_29.2C_2009.29"><span class="tocnumber">34</span> <span class="toctext">Version 1.8 (September 29, 2009)</span></a></li> +<li class="toclevel-1 tocsection-35"><a href="#Version_1.7_.28September_11.2C_2009.29"><span class="tocnumber">35</span> <span class="toctext">Version 1.7 (September 11, 2009)</span></a></li> +<li class="toclevel-1 tocsection-36"><a href="#Version_1.6_.28August_31.2C_2009.29"><span class="tocnumber">36</span> <span class="toctext">Version 1.6 (August 31, 2009)</span></a></li> +<li class="toclevel-1 tocsection-37"><a href="#Version_1.5_.28August_25.2C_2009.29"><span class="tocnumber">37</span> <span class="toctext">Version 1.5 (August 25, 2009)</span></a></li> +<li class="toclevel-1 tocsection-38"><a href="#Version_1.4_.28August_18.2C_2009.29"><span class="tocnumber">38</span> <span class="toctext">Version 1.4 (August 18, 2009)</span></a></li> +<li class="toclevel-1 tocsection-39"><a href="#Version_1.3_.28August_14.2C_2009.29"><span class="tocnumber">39</span> <span class="toctext">Version 1.3 (August 14, 2009)</span></a></li> +<li class="toclevel-1 tocsection-40"><a href="#Version_1.2_.28August_07.2C_2009.29"><span class="tocnumber">40</span> <span class="toctext">Version 1.2 (August 07, 2009)</span></a></li> +<li class="toclevel-1 tocsection-41"><a href="#Version_1.1_.28August_06.2C_2009.29"><span class="tocnumber">41</span> <span class="toctext">Version 1.1 (August 06, 2009)</span></a></li> +<li class="toclevel-1 tocsection-42"><a href="#Version_1.0_.28July_31.2C_2009.29"><span class="tocnumber">42</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.98.7_.28December_14.2C_2012.29"> Version 1.98.7 (December 14, 2012) </span></h2> +<p><a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/archive/abi-compliance-checker-1.98.7.tar.gz">abi-compliance-checker-1.98.7.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> Extended extra info dumped by <a href="Options.html" title="ABI Compliance Checker Options">-extra-info</a> option +</li><li> Extended additional info dumped by <a href="Options.html" title="ABI Compliance Checker Options">-extra-dump</a> option +</li><li> Added specifiers for structs, unions and enums in the report and ABI dump +</li><li> Improved support for old ABI dumps +</li></ul> +</li></ul> +<ul><li> <b>Bug Fixes</b> +<ul><li> Corrected <a href="Options.html" title="ABI Compliance Checker Options">-debug</a> option +</li><li> Corrected creating of archives with ABI dumps +</li><li> Corrected parsing of includes in header files +</li><li> Corrected processing of undefined symbols +</li><li> Corrected <a href="Options.html" title="ABI Compliance Checker Options">-app</a> option +</li><li> Corrected processing of default paths to system libraries +</li><li> Corrected Makefile +</li><li> Other fixes +</li></ul> +</li></ul> +<ul><li> <b>Other</b> +<ul><li> Code cleaning and refactoring +</li></ul> +</li></ul> +<p><br /> +</p> <h2> <span class="mw-headline" id="Version_1.98.6_.28December_04.2C_2012.29"> Version 1.98.6 (December 04, 2012) </span></h2> <p><a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/downloads/abi-compliance-checker-1.98.6.tar.gz">abi-compliance-checker-1.98.6.tar.gz</a><br /> </p><p><b>ACC 2.0</b> pre-release. @@ -880,11 +910,11 @@ Initial prototype of the tool. </p> <!-- NewPP limit report -Preprocessor node count: 163/1000000 +Preprocessor node count: 167/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 20121204120006 --> +<!-- Saved in parser cache with key rasispdb:pcache:idhash:2293-0!*!0!!en!*!* and timestamp 20121214111728 --> </div></div></div></div></div></body></html>
\ No newline at end of file diff --git a/doc/Descriptor.html b/doc/Descriptor.html index d2fa356..14c93f1 100644 --- a/doc/Descriptor.html +++ b/doc/Descriptor.html @@ -465,5 +465,5 @@ Template argument size: 0/2097152 bytes Expensive parser function count: 0/100 --> -<!-- Saved in parser cache with key rasispdb:pcache:idhash:2415-0!*!*!!*!*!* and timestamp 20121203211544 --> +<!-- Saved in parser cache with key rasispdb:pcache:idhash:2415-0!*!*!!*!*!* and timestamp 20121213184241 --> </div></div></div></div></div></body></html>
\ No newline at end of file diff --git a/doc/Options.html b/doc/Options.html index 902d79f..b2537e0 100644 --- a/doc/Options.html +++ b/doc/Options.html @@ -262,5 +262,5 @@ 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 20121204120238 --> +<!-- Saved in parser cache with key rasispdb:pcache:idhash:2442-0!*!0!!en!*!* and timestamp 20121214090740 --> </div></div></div></div></div></body></html>
\ No newline at end of file diff --git a/doc/Readme.html b/doc/Readme.html index 0ea1f62..33ab7a4 100644 --- a/doc/Readme.html +++ b/doc/Readme.html @@ -21,7 +21,7 @@ </style> <script src="/load.php?debug=false&lang=en&modules=startup&only=scripts&skin=monobook&*"></script> <script>if(window.mw){ - mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker", "wgTitle": "ABI Compliance Checker", "wgCurRevisionId": 8164, "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": 8213, "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"]); @@ -91,8 +91,8 @@ </td></tr></table> <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/downloads/">github.com</a></b>. -</p><p>Latest release: <a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/downloads/abi-compliance-checker-1.98.6.tar.gz">1.98.6</a> +<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/abi-compliance-checker-1.98.7.tar.gz">1.98.7</a> </p> <h3> <span class="mw-headline" id="Git"> Git </span></h3> <p>Read-only access to the latest development version:<br /> @@ -425,7 +425,7 @@ Check client application portability between libssh versions:<br /> </li><li> <b>chkshlib</b>, <b>cmpdylib</b>, <b>cmpshlib</b> - Tools to compare symbols presence. </li></ol> <h2> <span class="mw-headline" id="Bugs"> Bugs </span></h2> -<p>Please post your bug reports, feature requests and questions to the <a rel="nofollow" class="external text" href="http://forge.ispras.ru/projects/abi-compliance-checker">issue tracker</a> or send to <a rel="nofollow" class="external text" href="mailto:aponomarenko@rosalab.ru">this address</a>. +<p>Please post your bug reports, feature requests and questions to the <a rel="nofollow" class="external text" href="http://forge.ispras.ru/projects/abi-compliance-checker">issue tracker</a>, send to <a rel="nofollow" class="external text" href="mailto:aponomarenko@rosalab.ru">the maintainer</a> or <a rel="nofollow" class="external text" href="https://groups.google.com/forum/#!forum/lvc-tools">mailing list</a>. </p> <h2> <span class="mw-headline" id="Maintainers"> Maintainers </span></h2> <p>The tool was originally developed by the <a rel="nofollow" class="external text" href="http://linuxtesting.org">Russian Linux Verification Center</a> at <a href="http://ispras.linuxbase.org/index.php/ISP_RAS_Company_Profile" title="ISP RAS Company Profile">ISPRAS</a> and since <b>1.93</b> version it's developed by the <a rel="nofollow" class="external text" href="http://www.rosalab.com/">ROSA Laboratory</a> in Russia. <a rel="nofollow" class="external text" href="http://andrey-ponomarenko.myopenid.com/">Andrey Ponomarenko</a> is the leader of this project. @@ -483,5 +483,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 20121204120033 --> +<!-- Saved in parser cache with key rasispdb:pcache:idhash:2292-0!*!0!!en!*!* and timestamp 20121214111752 --> </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 a03fdd0..9ad1c4b 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 20121204100352 --> +<!-- Saved in parser cache with key rasispdb:pcache:idhash:2657-0!*!*!!*!*!* and timestamp 20121214090743 --> </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 a1cb76f..a37b49d 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 20121204102245 --> +<!-- Saved in parser cache with key rasispdb:pcache:idhash:2656-0!*!*!!en!*!* and timestamp 20121214092725 --> </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 6cdaacc..a4d2f24 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 20121204085752 --> +<!-- Saved in parser cache with key rasispdb:pcache:idhash:2655-0!*!0!!en!*!* and timestamp 20121213115150 --> </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 8d74a10..434d8c1 100644 --- a/modules/Internals/RegTests.pm +++ b/modules/Internals/RegTests.pm @@ -4285,7 +4285,7 @@ sub testC() $SOURCE2 .= " int* testRegression(int *pointer, char const *name, ...) { return 0; }"; - runTests("libsample_c", "C", $HEADER1, $SOURCE1, $HEADER2, $SOURCE2, "OpaqueType", "internalTypeUse"); + runTests("libsample_c", "C", $HEADER1, $SOURCE1, $HEADER2, $SOURCE2, "struct OpaqueType", "internalTypeUse"); } sub runTests($$$$$$$$) diff --git a/modules/Internals/Styles/Report.css b/modules/Internals/Styles/Report.css index 7b9853e..7788703 100644 --- a/modules/Internals/Styles/Report.css +++ b/modules/Internals/Styles/Report.css @@ -69,14 +69,9 @@ div.h_list { font-size:15px; padding-left:5px; } -span.ns_title { - color:#408080; - font-size:15px; -} span.ns { color:#408080; font-size:15px; - font-weight:bold; } div.lib_list { font-size:15px; @@ -182,9 +177,8 @@ table.summary td { table.code_view { cursor:text; margin-top:7px; - width:50%; - margin-left:20px; - font-family:Consolas, 'DejaVu Sans Mono', 'Droid Sans Mono', Monaco, Monospace; + margin-left:15px; + font-family:Monaco, Consolas, 'DejaVu Sans Mono', 'Droid Sans Mono', Monospace; font-size:14px; padding:10px; border:1px solid #e0e8e5; diff --git a/modules/Internals/Styles/SymbolsList.css b/modules/Internals/Styles/SymbolsList.css index 1e7757a..2f1e05b 100644 --- a/modules/Internals/Styles/SymbolsList.css +++ b/modules/Internals/Styles/SymbolsList.css @@ -34,14 +34,9 @@ span.h_name { font-size:14px; font-weight:bold; } -span.ns_title { - color:#408080; - font-size:15px; -} span.ns { color:#408080; font-size:15px; - font-weight:bold; } span.lib_name { color:Green; diff --git a/modules/Internals/SysCheck.pm b/modules/Internals/SysCheck.pm index 6634c3d..861cda9 100644 --- a/modules/Internals/SysCheck.pm +++ b/modules/Internals/SysCheck.pm @@ -1338,6 +1338,15 @@ sub get_binversion($) return ""; } +sub readBytes($) +{ + sysopen(FILE, $_[0], O_RDONLY); + sysread(FILE, my $Header, 4); + close(FILE); + my @Bytes = map { sprintf('%02x', ord($_)) } split (//, $Header); + return join("", @Bytes); +} + sub dumpSystem($) { # -dump-system option handler # should be used with -sysroot and -cross-gcc options @@ -2567,7 +2576,7 @@ sub dumpSystem($) if(-s "$TMP_DIR/$LName.stderr") { appendFile("$SYS_DUMP_PATH/logs/$LName.txt", readFile("$TMP_DIR/$LName.stderr")); - if(get_CoreError($?>>8) eq "Invalid_Dump") { + if(get_CodeError($?>>8) eq "Invalid_Dump") { printMsg("INFO", "Empty"); } else { diff --git a/modules/Internals/XmlDump.pm b/modules/Internals/XmlDump.pm index 5b4fd4d..23b10c6 100644 --- a/modules/Internals/XmlDump.pm +++ b/modules/Internals/XmlDump.pm @@ -23,6 +23,9 @@ ########################################################################### use strict; +my $TAG_ID = 0; +my $INDENT = " "; + sub createXmlDump($) { my $ABI = $_[0]; @@ -787,4 +790,92 @@ sub readXmlDump($) return \%ABI; } +sub parseTag_E($$$) +{ + my ($CodeRef, $Tag, $Info) = @_; + if(not $Tag or not $CodeRef + or not $Info) { + return undef; + } + if(${$CodeRef}=~s/\<\Q$Tag\E(\s+([^<>]+)|)\>((.|\n)*?)\<\/\Q$Tag\E\>//) + { + my ($Ext, $Content) = ($2, $3); + $Content=~s/\A\s+//g; + $Content=~s/\s+\Z//g; + if($Ext) + { + while($Ext=~s/(\w+)\=\"([^\"]*)\"//) + { + my ($K, $V) = ($1, $2); + $Info->{$K} = xmlSpecChars_R($V); + } + } + if(substr($Content, 0, 1) ne "<") { + $Content = xmlSpecChars_R($Content); + } + return $Content; + } + return undef; +} + +sub addTag(@) +{ + my $Tag = shift(@_); + my $Val = shift(@_); + my @Ext = @_; + my $Content = openTag($Tag, @Ext); + chomp($Content); + $Content .= xmlSpecChars($Val); + $Content .= "</$Tag>\n"; + $TAG_ID-=1; + + return $Content; +} + +sub openTag(@) +{ + my $Tag = shift(@_); + my @Ext = @_; + my $Content = ""; + foreach (1 .. $TAG_ID) { + $Content .= $INDENT; + } + $TAG_ID+=1; + if(@Ext) + { + $Content .= "<".$Tag; + my $P = 0; + while($P<=$#Ext-1) + { + $Content .= " ".$Ext[$P]; + $Content .= "=\"".xmlSpecChars($Ext[$P+1])."\""; + $P+=2; + } + $Content .= ">\n"; + } + else { + $Content .= "<".$Tag.">\n"; + } + return $Content; +} + +sub closeTag($) +{ + my $Tag = $_[0]; + my $Content = ""; + $TAG_ID-=1; + foreach (1 .. $TAG_ID) { + $Content .= $INDENT; + } + $Content .= "</".$Tag.">\n"; + return $Content; +} + +sub checkTags() +{ + if($TAG_ID!=0) { + printMsg("WARNING", "the number of opened tags is not equal to number of closed tags"); + } +} + return 1;
\ No newline at end of file diff --git a/modules/RulesSrc.xml b/modules/RulesSrc.xml index c4bddb7..dfec89b 100644 --- a/modules/RulesSrc.xml +++ b/modules/RulesSrc.xml @@ -15,7 +15,7 @@ Field @target has been renamed to @new_value. </change> <effect> - Recompilation of a client program may be broken with the error message: @type_type @type_name has no member named @target. + Recompilation of a client program may be broken with the error message: @type_name has no member named @target. </effect> </rule> @@ -249,7 +249,7 @@ Field @target has been removed from this type. </change> <effect> - Recompilation of a client program may be broken with the error message: '@type_type @type_name' has no member named '@target'. + Recompilation of a client program may be broken with the error message: '@type_name' has no member named '@target'. </effect> </rule> |