meta/size.pl (78 lines of code) (raw):
#!/usr/bin/perl
#
# Copyright (c) 2023 Microsoft Open Technologies, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
#
# THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR
# CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT
# LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS
# FOR A PARTICULAR PURPOSE, MERCHANTABILITY OR NON-INFRINGEMENT.
#
# See the Apache Version 2.0 License for specific language governing
# permissions and limitations under the License.
#
# Microsoft would like to thank the following companies for their review and
# assistance with these files: Intel Corporation, Mellanox Technologies Ltd,
# Dell Products, L.P., Facebook, Inc., Marvell International Ltd.
#
# @file size.pl
#
# @brief This module defines SAI struct/union size generator
#
BEGIN { push @INC,'.'; }
use strict;
use warnings;
use diagnostics;
use sort 'stable';
use utils;
use File::Temp qw/ tempfile /;
our $SIZE_CONTENT = "";
sub WriteSize
{
my $content = shift;
$SIZE_CONTENT .= $content . "\n";
}
our %STRUCTS=();
our $TEMP_DIR = "..";
sub CheckArguments
{
if (scalar @ARGV != 1)
{
print "expected 1 argument which is temporary SAI directory\n";
exit 1;
}
$TEMP_DIR = shift @ARGV;
}
sub ExtractStructsAndUnions
{
my @headers = GetHeaderFiles("$TEMP_DIR/inc/"); # we ignore experimental headers
for my $header (@headers)
{
my $data = ReadHeaderFile("$TEMP_DIR/inc/".$header);
my @lines = split/\n/,$data;
for my $line (@lines)
{
next if not $line =~ /typedef\s+(?:struct|union)\s+_(sai_\w+_t)/;
$STRUCTS{$1}=$1;
}
}
}
sub ConstructSource
{
my $source = "#include <stdio.h>\n";
$source .= "#include <sai.h>\n";
$source .= "#include <saiextensions.h>\n";
$source .= "int main() {\n";
for my $struct (sort keys %STRUCTS)
{
my $upname = uc($struct);
$source .= "printf(\"#define ${upname}_SIZE (%zu)\\n\", sizeof($struct));\n";
}
$source .= "return 0; }";
return $source;
}
sub GetValues
{
my $dir = $TEMP_DIR;
my $source = ConstructSource();
my ($fhs, $src) = tempfile( SUFFIX => '.c', UNLINK => 1 );
WriteFile($src, $source);
my ($fhb, $bin) = tempfile( SUFFIX => '.bin', UNLINK => 1 );
LogDebug("gcc $src -I$dir/inc/ -I$dir/experimental/ -o $bin");
system("gcc $src -I$dir/inc/ -I$dir/experimental/ -o $bin") == 0 or die "gcc failed! $!";
close $fhs;
close $fhb;
my %hash = ();
my @lines = `$bin`;
for my $line(@lines)
{
chomp $line;
WriteSize($line);
}
}
CheckArguments();
WriteSize("#ifndef __SAI_METADATASIZE_H__");
WriteSize("#define __SAI_METADATASIZE_H__");
ExtractStructsAndUnions();
GetValues();
WriteSize("#endif /* __SAI_METADATASIZE_H__ */");
WriteFile("saimetadatasize.h", $SIZE_CONTENT);