in src/main/abi-symbols/abi-dumper.pl [5563:5709]
sub removeUnused()
{ # remove unused data types from the ABI dump
%HeadersInfo = ();
%SourcesInfo = ();
my (%SelectedHeaders, %SelectedSources) = ();
foreach my $ID (sort {$a<=>$b} keys(%SymbolInfo))
{
if($SelectedSymbols{$ID}==2)
{ # data, inline, pure
next;
}
registerSymbolUsage($ID);
if(my $H = $SymbolInfo{$ID}{"Header"}) {
$SelectedHeaders{$H} = 1;
}
if(my $S = $SymbolInfo{$ID}{"Source"}) {
$SelectedSources{$S} = 1;
}
}
foreach my $ID (sort {$a<=>$b} keys(%SymbolInfo))
{
if($SelectedSymbols{$ID}==2)
{ # data, inline, pure
my $Save = 0;
if(my $Class = getFirst($SymbolInfo{$ID}{"Class"}))
{
if(defined $UsedType{$Class}) {
$Save = 1;
}
else
{
if(defined $ClassChild{$Class})
{
foreach (keys(%{$ClassChild{$Class}}))
{
if(defined $UsedType{getFirst($_)})
{
$Save = 1;
last;
}
}
}
}
}
if(my $Header = $SymbolInfo{$ID}{"Header"})
{
if(defined $SelectedHeaders{$Header}) {
$Save = 1;
}
}
if(my $Source = $SymbolInfo{$ID}{"Source"})
{
if(defined $SelectedSources{$Source}) {
$Save = 1;
}
}
if($Save) {
registerSymbolUsage($ID);
}
else {
delete($SymbolInfo{$ID});
}
}
}
if(defined $AllTypes)
{
# register all data types (except anon structs and unions)
foreach my $Tid (keys(%TypeInfo))
{
if(defined $LocalType{$Tid})
{ # except local code
next;
}
if($TypeInfo{$Tid}{"Type"} eq "Enum"
or index($TypeInfo{$Tid}{"Name"}, "anon-")!=0) {
registerTypeUsage($Tid);
}
}
# remove unused anons (except enums)
foreach my $Tid (keys(%TypeInfo))
{
if(not $UsedType{$Tid})
{
if($TypeInfo{$Tid}{"Type"} ne "Enum")
{
if(index($TypeInfo{$Tid}{"Name"}, "anon-")==0) {
delete($TypeInfo{$Tid});
}
}
}
}
# remove duplicates
foreach my $Tid (keys(%TypeInfo))
{
my $Name = $TypeInfo{$Tid}{"Name"};
my $Type = $TypeInfo{$Tid}{"Type"};
if($TName_Tid{$Type}{$Name} ne $Tid) {
delete($TypeInfo{$Tid});
}
}
}
else
{
foreach my $Tid (keys(%TypeInfo))
{ # remove unused types
if(not $UsedType{$Tid}) {
delete($TypeInfo{$Tid});
}
}
}
foreach my $Tid (keys(%MergedTypes)) {
delete($TypeInfo{$Tid});
}
foreach my $Tid (keys(%LocalType))
{
if(not $UsedType{$Tid}) {
delete($TypeInfo{$Tid});
}
}
# clean memory
%MergedTypes = ();
%LocalType = ();
# completeness
foreach my $Tid (sort keys(%TypeInfo)) {
checkCompleteness($TypeInfo{$Tid});
}
foreach my $Sid (sort keys(%SymbolInfo)) {
checkCompleteness($SymbolInfo{$Sid});
}
# clean memory
%UsedType = ();
}