Add 'warning density' computation to the warnhist script (#3910)

* Add 'warning density' computation to the warnhist script, along with several
cleanups to it.   Add "--enable-show-all-warnings" configure (and CMake)
option to disable compiler diagnostic suppression (and therefore show all the
otherwise suppressed compiler diagnostics), disabled by default.  Clean up
a buncn of misc. warnings.

Signed-off-by: Quincey Koziol <qkoziol@amazon.com>
This commit is contained in:
Quincey Koziol 2023-12-29 08:42:35 -06:00 committed by GitHub
parent 6ffc55c6d9
commit 3a21ee0877
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 414 additions and 136 deletions

View File

@ -22,8 +22,13 @@ use warnings;
# Perl modules/settings
use strict;
use Getopt::Std;
use File::Find;
use File::Basename;
use Cwd;
#use Data::Dumper;
# Global variables, for accumulating information
my %options=();
my $totalcount = 0;
my $notecount = 0;
my $dupcount = 0;
@ -54,11 +59,25 @@ my $last_fort_name;
my $last_fort_line;
my $last_fort_offset;
# Info about source files
my %c_files;
my %c_files_counted;
my %cpp_files;
my %cpp_files_counted;
my %fort_files;
my %fort_files_counted;
my $c_lines = 0;
my $cpp_lines = 0;
my $fort_lines = 0;
# Display usage
sub do_help {
print "Usage: 'warnhist [-h, --help] [-t <prefix>] [-w <n>] [-W] [-f <n>] [-F] [-s <warning string list>] [-S <file string list] [-l] [-u] [-i <name list>] [file]'\n";
print "\t-h, --help\tDisplay this usage\n";
print "\t-t <prefix>\tTrim pathname prefix from filenames, <prefix>\n";
print "Usage: 'warnhist [-h, --help] [-t <prefix>] [-w <n>] [-W] [-f <n>] [-F]\n";
print "\t[-s <warning string list>] [-S <file string list] [-l] [-u]'\n";
print "\t[-i <name list>] [-d] [-p <path list] [-q] [file]'\n\n";
print "Options:\n";
print "\t-h, --help Display this usage\n";
print "\t-t <prefix> Trim pathname prefix from filenames, <prefix>\n";
print "\t-w <n>\tDisplay files for a given warning index list, <n>\n";
print "\t\t<n> can be a single value, a range, or a comma separated list\n";
print "\t\tFor example: '0' or '0,4' or '8-10' or '0,2-4,8-10,13'\n";
@ -67,10 +86,13 @@ sub do_help {
print "\t\t<n> can be a single value, a range, or a comma separated list\n";
print "\t\tFor example: '0' or '0,4' or '8-10' or '0,2-4,8-10,13'\n";
print "\t-F\tDisplay warnings for all files\n";
print "\t-s <warning string list>\tDisplay files for warnings which contain a string, <warning string list>\n";
print "\t-s <warning string list> Display files for warnings which contain a\n";
print "\t\tstring, <warning string list>\n";
print "\t\t<warning string list> is a comma separated list, with no spaces\n";
print "\t\tFor example: 'Wunused-dummy-argument' or 'Wunused-dummy-argument,Wunused-variable'\n";
print "\t-S <file string list>\tDisplay warnings for files which contain a string, <file string list>\n";
print "\t\tFor example: 'Wunused-dummy-argument' or\n";
print "\t\t'Wunused-dummy-argument,Wunused-variable'\n";
print "\t-S <file string list> Display warnings for files which contain a\n";
print "\t\tstring, <file string list>\n";
print "\t\t<file string list> is a comma separated list, with no spaces\n";
print "\t\tFor example: 'H5Fint' or 'H5Fint,H5Gnode'\n";
print "\t-l\tDisplay line numbers for file/warning\n";
@ -78,18 +100,182 @@ sub do_help {
print "\t-i <name list>\tIgnore named files, <name list>\n";
print "\t\t<name list> is a comma separated list, with no spaces\n";
print "\t\tFor example: 'H5LTparse' or 'H5LTparse,H5LTanalyze'\n";
print "\t-d\tCompute warning density for compiled source files. Paths to the\n";
print "\t\troot of a directory containing source may be provided with the\n";
print "\t\t'-p <path list>' option. If the path list is given, only those\n";
print "\t\tdirectories are scanned for source files. If the path list\n";
print "\t\toption is not given, the current working directory is scanned.\n";
print "\t-p <path list>\tPaths to search for compiled files. Compiled files\n";
print "\t\tare only used when computing warning density and are not\n";
print "\t\tnecessary for just analyzing warnings in build output.\n";
print "\t\t<path list> is a comma separated list, with no spaces\n";
print "\t\tFor example: '/home/koziol/hdf5' or '.,~/dev/hdf5,~/dev/build'\n";
print "\t-q\tSuppress warning output\n";
print "\tfile\tFilename containing build output\n";
print "\t\tIf no file is given, standard input is used.\n";
exit;
}
# Count # of lines in a file
sub line_count {
my ($name) = @_;
#print "name = '$name'\n";
my $tmp;
my $lines = 0;
open (FILE, $name) or die "Can't open '$name': $!";
$lines++ while ($tmp = <FILE>);
close FILE;
#print "$lines\n";
return $lines;
}
# Recursively search a directory hierarchy for source files
# Adds results to the global %c_files, %cpp_files, and %fort_files hashes
sub parse_tree {
my ($root_path) = @_;
#print "root_path = $root_path\n";
my $path_checker = sub {
my $name = $File::Find::name;
if (-f $name) {
my $bn = basename($name);
# Check for different kinds of source files
# Use lists here: https://gist.github.com/ppisarczyk/43962d06686722d26d176fad46879d41#file-programming_languages_extensions-json
# FORTRAN source file
if($bn =~ /.*(\.f90)|(\.f)|(\.f03)|(\.f08)|(\.f77)|(\.f95)|(\.for)|(\.fpp)$/i) {
$bn =~ s/(\.f90)|(\.f)|(\.f03)|(\.f08)|(\.f77)|(\.f95)|(\.for)|(\.fpp)$//ig;
if(!exists $fort_files{$bn}) {
$fort_files{$bn} = [ $name ];
} else {
push @{ $fort_files{$bn} }, $name;
}
# C++ source file
} elsif($bn =~ /.*(\.cpp)|(\.c\+\+)|(\.cc)|(\.cp)|(\.cxx)$/i) {
$bn =~ s/(\.cpp)|(\.c\+\+)|(\.cc)|(\.cp)|(\.cxx)$//ig;
if(!exists $cpp_files{$bn}) {
$cpp_files{$bn} = [ $name ];
} else {
push @{ $cpp_files{$bn} }, $name;
}
# C source file
} elsif($bn =~ /.*(\.c)$/i) {
$bn =~ s/(\.c)$//g;
if(!exists $c_files{$bn}) {
$c_files{$bn} = [ $name ];
} else {
push @{ $c_files{$bn} }, $name;
}
}
}
};
find($path_checker, $root_path);
#print Dumper \%c_files;
#print Dumper \%cpp_files;
#print Dumper \%fort_files;
}
sub count_file_loc {
my ($filename, $typename, $file_paths, $files_counted, $count) = @_;
# Attempt to detect and handle object file name mangling by Automake
if(!exists $file_paths->{$filename} && $filename =~ /\-/) {
my ($bn) = $filename =~ /\S+\-(\S+)$/x;
if(exists $file_paths->{$bn}) {
if(!exists $options{q}) {
warn "No path for $typename source file '$filename', but '$bn' has path, assuming automake generated object file name";
}
$filename = $bn;
}
}
if(exists $file_paths->{$filename}) {
my $filecount = 0;
# Attempt to count LOC for files with same name
if(scalar(@{$file_paths->{$filename}}) > 1) {
$filecount = $files_counted->{$filename}++;
# Issue warning about multiple source files with same name
if($filecount == 0 && !exists $options{q}) {
local $" = ', '; # '$"' is documented in https://perldoc.perl.org/perlvar
warn "Multiple paths for $typename source file named '$filename', assuming each is compiled once, paths: [@{$file_paths->{$filename}}]\n";
}
# Sanity check for too many compiles of a file
if($filecount >= scalar(@{$file_paths->{$filename}})) {
if(!exists $options{q}) {
local $" = ', '; # '$"' is documented in https://perldoc.perl.org/perlvar
warn "Too many compiles of $typename source file named '$filename' with paths: [@{$file_paths->{$filename}}], disabling warning density calculations\n";
}
delete $options{d};
}
}
# Increment the # of lines of code (if not too many)
if($filecount < scalar(@{$file_paths->{$filename}})) {
${$count} += line_count($file_paths->{$filename}[$filecount]);
}
} else {
if(!exists $options{q}) {
warn "No path for $typename source file '$filename', e '-p' option to specify, disabling warning density calculations\n";
}
delete $options{d};
}
}
# Compute LOC for compiled source file
sub count_source_loc {
my ($compile_line) = @_;
#print "compile_line = $compile_line\n";
my $filetype;
my $filename;
($filetype, $filename) = $compile_line =~ /^\s+(CC|FC|CXX|PPFC)\s+(\S*)\.l*o$/x;
if($filename =~ /\//) {
$filename = basename($filename);
}
#print "filetype = '$filetype'\n";
#print "filename = '$filename'\n";
if($filetype =~ /FC|PPFC/) { # FORTRAN source file
count_file_loc($filename, "FORTRAN", \%fort_files, \%fort_files_counted, \$fort_lines);
} elsif($filetype =~ /CXX/) { # C++ source file
count_file_loc($filename, "C++", \%cpp_files, \%cpp_files_counted, \$cpp_lines);
} elsif($filetype =~ /CC/) { # C source file
count_file_loc($filename, "C", \%c_files, \%c_files_counted, \$c_lines);
}
}
sub sanity_check_loc {
my ($typename, $file_paths, $files_counted) = @_;
if(scalar keys %{$files_counted} > 0) {
for my $x (keys(%{$files_counted})) {
#print "x = $x, # of compiles = ${$files_counted}{$x}, # of paths = ", scalar(@{$file_paths->{$x}}), "\n";
if($files_counted->{$x} != scalar(@{$file_paths->{$x}})) {
if(!exists $options{q}) {
warn "# of compiles of C source file '$x' ($files_counted->{$x}) != # of paths (", scalar(@{$file_paths->{$x}}), "), disabling warning density calculation\n";
}
# Don't print warning density, it's not accurate
delete $options{d};
last;
}
}
}
}
sub main::HELP_MESSAGE {
do_help();
}
# declare the Perl command line flags/options we want to allow
my %options=();
getopts("FWhut:w:f:s:S:i:l", \%options);
getopts("FWhut:w:f:s:S:i:ldp:q", \%options);
# Display usage, if requested
if($options{h}) {
@ -185,6 +371,20 @@ if($options{u}) {
$genericize = 0;
}
# Scan source files, if warning density requested
if(exists $options{d}) {
if(exists $options{p}) {
my @pathnames = split /,/, $options{p};
#print STDERR @pathnames;
for my $path (@pathnames) {
parse_tree($path);
}
} else {
# Scan the current working directory
parse_tree(getcwd);
}
}
PARSE_LINES:
while (<>) {
my $name;
@ -197,7 +397,7 @@ while (<>) {
my $extra2;
# Retain last FORTRAN compile line, which comes a few lines before warning
if($_ =~ /.*\.[fF]90:.*/) {
if($_ =~ /.*((\.inc)|(\.f90)|(\.f)|(\.f03)|(\.f08)|(\.f77)|(\.f95)|(\.for)|(\.fpp))\:.*/i) {
($last_fort_name, $last_fort_line, $last_fort_offset) = split /\:/, $_;
($last_fort_line, $toss) = split /\./, $last_fort_line;
}
@ -212,17 +412,30 @@ while (<>) {
$last_c_name = $_;
}
# Compute LOC for compiled source files, if warning density requested
if(exists $options{d}) {
# Check for compilation line
if($_ =~ /^\s+(CC|FC|CXX|PPFC)\s+/) {
count_source_loc($_);
}
}
# Skip lines that don't have the word "warning"
next if $_ !~ /[Ww]arning/;
# Skip warnings from linker
next if $_ =~ /ld: warning:/;
# Skip warnings from make
next if $_ =~ /^Makefile:[\d]*: warning:/;
# Skip warnings from build_py and install_lib
next if $_ =~ /warning: (build_py|install_lib)/;
# Skip variables with the word 'warning' in them
next if $_ =~ /_warning_/;
# Skip variables with the word 'warning' (case insensitively) in them
next if $_ =~ /_warning_/i;
next if $_ =~ /_warning/i;
next if $_ =~ /warning_/i;
# Skip AMD Optimizing Compiler (aocc) lines "<#> warning(s) generated."
next if $_ =~ / warnings? generated\./;
@ -235,13 +448,9 @@ while (<>) {
# Check for weird formatting of warning message
$line = "??";
$offset = "??";
if($_ =~ /^cc1: warning:.*/) {
if($_ =~ /^(cc1|<command-line>): warning:.*/) {
$name = $last_c_name;
($toss, $toss, $warning, $extra, $extra2) = split /\:/, $_;
# Check for CMAKE build with warning on first line and no filename
} elsif($_ =~ /^\s*[Ww]arning:.*/) {
$name = $last_c_name;
($toss, $warning, $extra, $extra2) = split /\:/, $_;
# Check for file-scope gcc Fortran warning output
} elsif($_ =~ /f\d\d\d: Warning:/) {
# These are interspersed with the "compiling a file" output
@ -274,9 +483,9 @@ while (<>) {
} elsif($_ =~ /^\".*, line [0-9]+: *[Ww]arning:.*/) {
($name, $toss, $warning, $extra, $extra2) = split /\:/, $_;
($name, $line) = split /\,/, $name;
$name =~ s/^\"//g;
$name =~ s/\"$//g;
$line =~ s/^\s*line\s*//g;
$name =~ s/^\"//g;
$name =~ s/\"$//g;
$line =~ s/^\s*line\s*//g;
# Check for Intel icc warning
} elsif($_ =~ /.*[A-Za-z0-9_]\.[chC]\(.*[0-9]\):.*#.*/) {
($last_c_name, $toss, $warning) = split /\:/, $last_c_name;
@ -294,19 +503,13 @@ while (<>) {
# Check for extra ':' followed by more text in original warning string,
# and append the ':' and text back onto the parsed warning
# (Use 'length $extra' idiom to avoid warning when $extra is undefined)
if(length $extra ) {
if(defined $extra) {
$warning = join ':', $warning, $extra;
}
if(length $extra2 ) {
if(defined $extra2) {
$warning = join ':', $warning, $extra2;
}
# Restore the C++ '::' symbol now that we've parsed out the parts of the line
while($warning =~ /@@@@/) {
$warning =~ s/@@@@/\:\:/g;
}
# Trim leading '..' paths from filename
while($name =~ /^\.\.\//) {
$name =~ s/^\.\.\///g;
@ -336,6 +539,11 @@ while (<>) {
next
}
# Restore the C++ '::' symbol now that we've parsed out the parts of the line
while($warning =~ /@@@@/) {
$warning =~ s/@@@@/\:\:/g;
}
# Get rid of leading & trailing whitespace
$warning =~ s/^\s//g;
$warning =~ s/\s$//g;
@ -383,8 +591,8 @@ while (<>) {
if($warning =~ /'[A-Za-z_0-9\(\)\*\,\[\]\.\<\>\&\:\+\#\-\=]+[A-Za-z_0-9\(\)\*\,\[\]\.\<\>\&\:\+\#\-\=\ ]*'/) {
$warning =~ s/'[A-Za-z_0-9\(\)\*\,\[\]\.\<\>\&\:\+\#\-\=]+[A-Za-z_0-9\(\)\*\,\[\]\.\<\>\&\:\+\#\-\=\ ]*'/'-'/g;
}
if($warning =~ /'%[\#0\-\ \+]*[,;\:_]?[0-9\*]*\.?[0-9\*]*[hjltzL]*[aAcdeEfFgGinosuxX]'/) {
$warning =~ s/'%[\#0\-\ \+]*[,;\:_]?[0-9\*]*\.?[0-9\*]*[hjltzL]*[aAcdeEfFgGinosuxX]'/'-'/g;
if($warning =~ /'%[\#0\-\ \+]*[,;\:_]?[0-9\*]*\.?[0-9\*]*[hjltzL]*[aAcdeEfFgGinopsuxX]'/) {
$warning =~ s/'%[\#0\-\ \+]*[,;\:_]?[0-9\*]*\.?[0-9\*]*[hjltzL]*[aAcdeEfFgGinopsuxX]'/'-'/g;
}
# Genericize C/C++ "<macro>" warnings into "-"
@ -397,6 +605,11 @@ while (<>) {
$warning =~ s/=[A-Za-z_0-9]*\]/=-\]/g;
}
# Genericize C/C++ "No such file or directory" warnings into "-"
if($warning =~ /^[A-Za-z_0-9\/]*: No such file or directory/) {
$warning =~ s/^[A-Za-z_0-9\/]*:/'-':/g;
}
# Genericize FORTRAN "at (<n>)" into "at (-)", "REAL(<n>)" into "REAL(-)",
# and "INTEGER(<n>)" into "INTEGER(-)"
if($warning =~ /.*at\s\([0-9]+\).*/) {
@ -449,7 +662,31 @@ while (<>) {
# print STDERR "warning = \"$warning\"\n";
}
print "Total unique [non-ignored] warnings: $totalcount\n";
# Sanity check compiled source files with multiple paths when computing
# warning density
# (Check $options{d} each time, because any of the sanity checks could disable
# displaying the warning density)
if(exists $options{d}) {
sanity_check_loc("C", \%c_files, \%c_files_counted);
}
if(exists $options{d}) {
sanity_check_loc("FORTRAN", \%fort_files, \%fort_files_counted);
}
if(exists $options{d}) {
sanity_check_loc("C++", \%cpp_files, \%cpp_files_counted);
}
#
# Display results
#
print "\nTotal unique [non-ignored] warnings: $totalcount\n";
# Display warning density, if requested
if(exists $options{d}) {
print "Lines of code compiled: <total> (C/C++/FORTRAN): ", ($c_lines + $cpp_lines + $fort_lines), " ($c_lines/$cpp_lines/$fort_lines)\n";
printf "Warning density (<# of warnings> / <# of LOC compiled>): %10.10f\n", $totalcount / ($c_lines + $cpp_lines + $fort_lines);
}
print "Ignored notes / supplemental warning lines [not counted in unique warnings]: $notecount\n";
print "Duplicated warning lines [not counted in unique warnings]: $dupcount\n";
print "Total ignored warnings: $ignorecount\n";
@ -484,7 +721,7 @@ for my $x (sort {$warn_count{$b} <=> $warn_count{$a}} keys(%warn_count)) {
$match = 1;
}
if($match) {
if($match || exists $options{W}) {
for my $y (sort {$warn_file{$x}{$b} <=> $warn_file{$x}{$a}} keys(%{$warn_file{$x}})) {
printf ("\t%4d - %s\n", $warn_file{$x}{$y}, $y);
if(exists $options{l}) {
@ -522,7 +759,7 @@ for my $x (sort {$file_count{$b} <=> $file_count{$a}} keys(%file_count)) {
$match = 1;
}
if($match) {
if($match || exists $options{F}) {
for my $y (sort {$file_warn{$x}{$b} <=> $file_warn{$x}{$a}} keys(%{$file_warn{$x}})) {
printf ("\t%4d - %s\n", $file_warn{$x}{$y}, $y);
if(exists $options{l}) {

View File

@ -594,6 +594,17 @@ if (HDF5_ENABLE_CODESTACK)
endif ()
MARK_AS_ADVANCED (HDF5_ENABLE_CODESTACK)
# ----------------------------------------------------------------------
# Check if they would like to show all warnings (not suppressed internally)
#-----------------------------------------------------------------------------
option (HDF5_SHOW_ALL_WARNINGS "Show all warnings (not suppressed internally)." OFF)
mark_as_advanced (HDF5_SHOW_ALL_WARNINGS)
if (HDF5_SHOW_ALL_WARNINGS)
message (STATUS "....All warnings will be displayed")
set (${HDF_PREFIX}_SHOW_ALL_WARNINGS 1)
endif ()
MARK_AS_ADVANCED (HDF5_SHOW_ALL_WARNINGS)
# ----------------------------------------------------------------------
# Check if they would like to use file locking by default
#-----------------------------------------------------------------------------

View File

@ -631,6 +631,9 @@
/* Check exception handling functions during data conversions */
#cmakedefine H5_WANT_DCONV_EXCEPTION @H5_WANT_DCONV_EXCEPTION@
/* Define if showing all compiler warnings are desired (i.e. don't suppress them internally) */
#cmakedefine H5_SHOW_ALL_WARNINGS @H5_SHOW_ALL_WARNINGS@
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */
#if !defined(__APPLE__)

View File

@ -2311,6 +2311,45 @@ case "X-$DEV_WARNINGS" in
;;
esac
## ----------------------------------------------------------------------
## Check if they would like suppessed compiler diagnostics displayed
## (i.e. not suppressed)
##
## NOTE: Compiler diagnostics (i.e. warnings) are suppressed for some
## "noisy" warnings that are harmless (in the opinion of the primary
## HDF5 development team), but this option is provided to allow
## developers to see those warnings.
##
AC_MSG_CHECKING([whether showing all compiler warnings is enabled])
AC_ARG_ENABLE([show-all-warnings],
[AS_HELP_STRING([--enable-show-all-warnings],
[Enable showing all compiler warnings (for developer debugging).
[default=no]
])],
[SHOW_ALL_WARNINGS=$enableval])
## Set the default level.
if test "X-$SHOW_ALL_WARNINGS" = X- ; then
SHOW_ALL_WARNINGS=no
fi
## Allow this variable to be substituted in
## other files (src/libhdf5.settings.in, etc.)
AC_SUBST([SHOW_ALL_WARNINGS])
case "X-$SHOW_ALL_WARNINGS" in
X-yes)
AC_MSG_RESULT([yes])
AC_DEFINE([SHOW_ALL_WARNINGS], [1], [Define if showing all warnings is desired (i.e. not suppressed internally with H5_DIAG_OFF)])
;;
X-no)
AC_MSG_RESULT([no])
;;
*)
AC_MSG_ERROR([Unrecognized value: $SHOW_ALL_WARNINGS])
;;
esac
## ----------------------------------------------------------------------
## Check if the compiler should use profiling flags/settings
##

View File

@ -28,8 +28,8 @@
#endif
! Define if on APPLE
#cmakedefine01 H5_HAVE_DARWIN
#if H5_HAVE_DARWIN == 0
#cmakedefine01 CMAKE_H5_HAVE_DARWIN
#if CMAKE_H5_HAVE_DARWIN == 0
#undef H5_HAVE_DARWIN
#else
#define H5_HAVE_DARWIN

View File

@ -826,6 +826,7 @@ ALLOW_UNSUPPORTED "Allow unsupported combinations of configure opti
HDF5_EXTERNAL_LIB_PREFIX "Use prefix for custom library naming." ""
HDF5_DISABLE_COMPILER_WARNINGS "Disable compiler warnings" OFF
HDF5_ENABLE_ALL_WARNINGS "Enable all warnings" OFF
HDF5_SHOW_ALL_WARNINGS "Show all warnings (i.e. not suppress "noisy" ones internally)" OFF
HDF5_ENABLE_CODESTACK "Enable the function stack tracing (for developer debugging)." OFF
HDF5_ENABLE_COVERAGE "Enable code coverage for Libraries and Programs" OFF
HDF5_ENABLE_DEBUG_APIS "Turn on extra debug output in all packages" OFF

View File

@ -727,7 +727,7 @@ H5_DLL herr_t H5D__chunk_allocated(const H5D_t *dset, hsize_t *nbytes);
H5_DLL herr_t H5D__chunk_allocate(const H5D_t *dset, bool full_overwrite, const hsize_t old_dim[]);
H5_DLL herr_t H5D__chunk_file_alloc(const H5D_chk_idx_info_t *idx_info, const H5F_block_t *old_chunk,
H5F_block_t *new_chunk, bool *need_insert, const hsize_t *scaled);
H5_DLL void *H5D__chunk_mem_alloc(size_t size, void *pline);
H5_DLL void *H5D__chunk_mem_alloc(size_t size, void *pline) H5_ATTR_MALLOC;
H5_DLL void H5D__chunk_mem_free(void *chk, void *pline);
H5_DLL void *H5D__chunk_mem_xfree(void *chk, const void *pline);
H5_DLL void *H5D__chunk_mem_realloc(void *chk, size_t size, const H5O_pline_t *pline);

View File

@ -389,7 +389,7 @@ H5_DLL herr_t H5EA__destroy_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t
H5_DLL H5EA_hdr_t *H5EA__hdr_alloc(H5F_t *f);
H5_DLL herr_t H5EA__hdr_init(H5EA_hdr_t *hdr, void *ctx_udata);
H5_DLL haddr_t H5EA__hdr_create(H5F_t *f, const H5EA_create_t *cparam, void *ctx_udata);
H5_DLL void *H5EA__hdr_alloc_elmts(H5EA_hdr_t *hdr, size_t nelmts);
H5_DLL void *H5EA__hdr_alloc_elmts(H5EA_hdr_t *hdr, size_t nelmts) H5_ATTR_MALLOC;
H5_DLL herr_t H5EA__hdr_free_elmts(H5EA_hdr_t *hdr, size_t nelmts, void *elmts);
H5_DLL herr_t H5EA__hdr_incr(H5EA_hdr_t *hdr);
H5_DLL herr_t H5EA__hdr_decr(H5EA_hdr_t *hdr);

View File

@ -75,7 +75,7 @@ typedef int (*H5ES_list_iter_func_t)(H5ES_event_t *ev, void *ctx);
/******************************/
/* Package Private Prototypes */
/******************************/
H5_DLL H5ES_t *H5ES__create(void);
H5_DLL H5ES_t *H5ES__create(void) H5_ATTR_MALLOC;
H5_DLL herr_t H5ES__insert_request(H5ES_t *es, H5VL_t *connector, void *token);
H5_DLL herr_t H5ES__wait(H5ES_t *es, uint64_t timeout, size_t *num_in_progress, bool *op_failed);
H5_DLL herr_t H5ES__get_requests(H5ES_t *es, H5_iter_order_t order, hid_t *connector_ids, void **requests,

View File

@ -83,13 +83,13 @@ H5I__id_dump_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
fprintf(stderr, " id = %" PRIdHID "\n", info->id);
fprintf(stderr, " count = %u\n", info->count);
fprintf(stderr, " obj = 0x%8p\n", info->object);
fprintf(stderr, " obj = 0x%8p\n", info->u.c_object);
fprintf(stderr, " marked = %d\n", info->marked);
/* Get the group location, so we get get the name */
switch (type) {
case H5I_GROUP: {
const H5VL_object_t *vol_obj = (const H5VL_object_t *)info->object;
const H5VL_object_t *vol_obj = (const H5VL_object_t *)info->u.c_object;
object = H5VL_object_data(vol_obj);
if (H5_VOL_NATIVE == vol_obj->connector->cls->value)
@ -98,7 +98,7 @@ H5I__id_dump_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
}
case H5I_DATASET: {
const H5VL_object_t *vol_obj = (const H5VL_object_t *)info->object;
const H5VL_object_t *vol_obj = (const H5VL_object_t *)info->u.c_object;
object = H5VL_object_data(vol_obj);
if (H5_VOL_NATIVE == vol_obj->connector->cls->value)
@ -107,13 +107,10 @@ H5I__id_dump_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
}
case H5I_DATATYPE: {
const H5T_t *dt = (const H5T_t *)info->object;
H5T_t *dt = info->u.object;
H5_GCC_CLANG_DIAG_OFF("cast-qual")
object = (void *)H5T_get_actual_type((H5T_t *)dt);
H5_GCC_CLANG_DIAG_ON("cast-qual")
path = H5T_nameof(object);
object = H5T_get_actual_type((H5T_t *)dt);
path = H5T_nameof(object);
break;
}

View File

@ -369,17 +369,16 @@ H5I__mark_node(void *_info, void H5_ATTR_UNUSED *key, void *_udata)
*/
if (udata->force || (info->count - (!udata->app_ref * info->app_count)) <= 1) {
/* Check if this is an un-realized future object */
H5_GCC_CLANG_DIAG_OFF("cast-qual")
if (info->is_future) {
/* Discard the future object */
if ((info->discard_cb)((void *)info->object) < 0) {
if ((info->discard_cb)(info->u.object) < 0) {
if (udata->force) {
#ifdef H5I_DEBUG
if (H5DEBUG(I)) {
fprintf(H5DEBUG(I),
"H5I: discard type=%d obj=%p "
"failure ignored\n",
(int)udata->type_info->cls->type, info->object);
(int)udata->type_info->cls->type, info->u.c_object);
}
#endif /* H5I_DEBUG */
@ -395,14 +394,14 @@ H5I__mark_node(void *_info, void H5_ATTR_UNUSED *key, void *_udata)
else {
/* Check for a 'free' function and call it, if it exists */
if (udata->type_info->cls->free_func &&
(udata->type_info->cls->free_func)((void *)info->object, H5_REQUEST_NULL) < 0) {
(udata->type_info->cls->free_func)(info->u.object, H5_REQUEST_NULL) < 0) {
if (udata->force) {
#ifdef H5I_DEBUG
if (H5DEBUG(I)) {
fprintf(H5DEBUG(I),
"H5I: free type=%d obj=%p "
"failure ignored\n",
(int)udata->type_info->cls->type, info->object);
(int)udata->type_info->cls->type, info->u.c_object);
}
#endif /* H5I_DEBUG */
@ -415,7 +414,6 @@ H5I__mark_node(void *_info, void H5_ATTR_UNUSED *key, void *_udata)
mark = true;
}
}
H5_GCC_CLANG_DIAG_ON("cast-qual")
/* Remove ID if requested */
if (mark) {
@ -524,7 +522,7 @@ H5I__register(H5I_type_t type, const void *object, bool app_ref, H5I_future_real
info->id = new_id;
info->count = 1; /* initial reference count */
info->app_count = !!app_ref;
info->object = object;
info->u.c_object = object;
info->is_future = (NULL != realize_cb);
info->realize_cb = realize_cb;
info->discard_cb = discard_cb;
@ -633,7 +631,7 @@ H5I_register_using_existing_id(H5I_type_t type, void *object, bool app_ref, hid_
info->id = existing_id;
info->count = 1; /* initial reference count*/
info->app_count = !!app_ref;
info->object = object;
info->u.object = object;
/* This API call is only used by the native VOL connector, which is
* not asynchronous.
*/
@ -677,12 +675,10 @@ H5I_subst(hid_t id, const void *new_object)
HGOTO_ERROR(H5E_ID, H5E_NOTFOUND, NULL, "can't get ID ref count");
/* Get the old object pointer to return */
H5_GCC_CLANG_DIAG_OFF("cast-qual")
ret_value = (void *)info->object;
H5_GCC_CLANG_DIAG_ON("cast-qual")
ret_value = info->u.object;
/* Set the new object pointer for the ID */
info->object = new_object;
info->u.c_object = new_object;
done:
FUNC_LEAVE_NOAPI(ret_value)
@ -709,12 +705,9 @@ H5I_object(hid_t id)
FUNC_ENTER_NOAPI_NOERR
/* General lookup of the ID */
if (NULL != (info = H5I__find_id(id))) {
if (NULL != (info = H5I__find_id(id)))
/* Get the object pointer to return */
H5_GCC_CLANG_DIAG_OFF("cast-qual")
ret_value = (void *)info->object;
H5_GCC_CLANG_DIAG_ON("cast-qual")
}
ret_value = info->u.object;
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5I_object() */
@ -742,12 +735,9 @@ H5I_object_verify(hid_t id, H5I_type_t type)
assert(type >= 1 && (int)type < H5I_next_type_g);
/* Verify that the type of the ID is correct & lookup the ID */
if (type == H5I_TYPE(id) && NULL != (info = H5I__find_id(id))) {
if (type == H5I_TYPE(id) && NULL != (info = H5I__find_id(id)))
/* Get the object pointer to return */
H5_GCC_CLANG_DIAG_OFF("cast-qual")
ret_value = (void *)info->object;
H5_GCC_CLANG_DIAG_ON("cast-qual")
}
ret_value = info->u.object;
FUNC_LEAVE_NOAPI(ret_value)
} /* H5I_object_verify() */
@ -898,9 +888,7 @@ H5I__remove_common(H5I_type_info_t *type_info, hid_t id)
if (type_info->last_id_info == info)
type_info->last_id_info = NULL;
H5_GCC_CLANG_DIAG_OFF("cast-qual")
ret_value = (void *)info->object;
H5_GCC_CLANG_DIAG_ON("cast-qual")
ret_value = info->u.object;
if (!H5I_marking_s)
info = H5FL_FREE(H5I_id_info_t, info);
@ -1000,8 +988,7 @@ H5I__dec_ref(hid_t id, void **request)
/* Get the ID's type */
type_info = H5I_type_info_array_g[H5I_TYPE(id)];
H5_GCC_CLANG_DIAG_OFF("cast-qual")
if (!type_info->cls->free_func || (type_info->cls->free_func)((void *)info->object, request) >= 0) {
if (!type_info->cls->free_func || (type_info->cls->free_func)(info->u.object, request) >= 0) {
/* Remove the node from the type */
if (NULL == H5I__remove_common(type_info, id))
HGOTO_ERROR(H5E_ID, H5E_CANTDELETE, (-1), "can't remove ID node");
@ -1009,7 +996,6 @@ H5I__dec_ref(hid_t id, void **request)
} /* end if */
else
ret_value = -1;
H5_GCC_CLANG_DIAG_ON("cast-qual")
} /* end if */
else {
--(info->count);
@ -1482,9 +1468,7 @@ H5I__iterate_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
/* The stored object pointer might be an H5VL_object_t, in which
* case we'll need to get the wrapped object struct (H5F_t *, etc.).
*/
H5_GCC_CLANG_DIAG_OFF("cast-qual")
object = H5I__unwrap((void *)info->object, type);
H5_GCC_CLANG_DIAG_ON("cast-qual")
object = H5I__unwrap(info->u.object, type);
/* Invoke callback function */
cb_ret_val = (*udata->user_func)((void *)object, info->id, udata->user_udata);
@ -1607,14 +1591,13 @@ H5I__find_id(hid_t id)
}
/* Check if this is a future ID */
H5_GCC_CLANG_DIAG_OFF("cast-qual")
if (id_info && id_info->is_future) {
hid_t actual_id = H5I_INVALID_HID; /* ID for actual object */
void *future_object; /* Pointer to the future object */
void *actual_object; /* Pointer to the actual object */
/* Invoke the realize callback, to get the actual object */
if ((id_info->realize_cb)((void *)id_info->object, &actual_id) < 0)
if ((id_info->realize_cb)(id_info->u.object, &actual_id) < 0)
HGOTO_DONE(NULL);
/* Verify that we received a valid ID, of the same type */
@ -1624,10 +1607,10 @@ H5I__find_id(hid_t id)
HGOTO_DONE(NULL);
/* Swap the actual object in for the future object */
future_object = (void *)id_info->object;
future_object = id_info->u.object;
actual_object = H5I__remove_common(type_info, actual_id);
assert(actual_object);
id_info->object = actual_object;
id_info->u.object = actual_object;
/* Discard the future object */
if ((id_info->discard_cb)(future_object) < 0)
@ -1639,7 +1622,6 @@ H5I__find_id(hid_t id)
id_info->realize_cb = NULL;
id_info->discard_cb = NULL;
}
H5_GCC_CLANG_DIAG_ON("cast-qual")
/* Set return value */
ret_value = id_info;
@ -1674,9 +1656,7 @@ H5I__find_id_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
assert(udata);
/* Get a pointer to the VOL connector's data */
H5_GCC_CLANG_DIAG_OFF("cast-qual")
object = H5I__unwrap((void *)info->object, type);
H5_GCC_CLANG_DIAG_ON("cast-qual")
object = H5I__unwrap(info->u.object, type);
/* Check for a match */
if (object == udata->object) {

View File

@ -56,10 +56,13 @@
/* ID information structure used */
typedef struct H5I_id_info_t {
hid_t id; /* ID for this info */
unsigned count; /* Ref. count for this ID */
unsigned app_count; /* Ref. count of application visible IDs */
const void *object; /* Pointer associated with the ID */
hid_t id; /* ID for this info */
unsigned count; /* Ref. count for this ID */
unsigned app_count; /* Ref. count of application visible IDs */
union {
const void *c_object; /* Const pointer associated with the ID */
void *object; /* Pointer associated with the ID */
} u;
/* Future ID info */
bool is_future; /* Whether this ID represents a future object */

View File

@ -175,7 +175,7 @@ H5_DLL herr_t H5P_insert(H5P_genplist_t *plist, const char *name, size_t size, v
H5_DLL herr_t H5P_remove(H5P_genplist_t *plist, const char *name);
H5_DLL htri_t H5P_exist_plist(const H5P_genplist_t *plist, const char *name);
H5_DLL htri_t H5P_class_isa(const H5P_genclass_t *pclass1, const H5P_genclass_t *pclass2);
H5_DLL char *H5P_get_class_name(H5P_genclass_t *pclass);
H5_DLL char *H5P_get_class_name(H5P_genclass_t *pclass) H5_ATTR_MALLOC;
/* Internal helper routines */
H5_DLL herr_t H5P_get_nprops_pclass(const H5P_genclass_t *pclass, size_t *nprops, bool recurse);

View File

@ -870,7 +870,7 @@ H5_DLL herr_t H5T__enum_insert(const H5T_t *dt, const char *name, const void *va
H5_DLL herr_t H5T__get_member_value(const H5T_t *dt, unsigned membno, void *value);
/* Field functions (for both compound & enumerated types) */
H5_DLL char *H5T__get_member_name(H5T_t const *dt, unsigned membno);
H5_DLL char *H5T__get_member_name(H5T_t const *dt, unsigned membno) H5_ATTR_MALLOC;
H5_DLL herr_t H5T__sort_value(const H5T_t *dt, int *map);
H5_DLL herr_t H5T__sort_name(const H5T_t *dt, int *map);

View File

@ -497,8 +497,16 @@
#define H5_DIAG_DO_PRAGMA(x) _Pragma(#x)
#define H5_DIAG_PRAGMA(x) H5_DIAG_DO_PRAGMA(GCC diagnostic x)
/* Allow suppression of compiler diagnostics unless H5_SHOW_ALL_WARNINGS is
* defined (enabled with '--enable-show-all-warnings' configure option).
*/
#ifndef H5_SHOW_ALL_WARNINGS
#define H5_DIAG_OFF(x) H5_DIAG_PRAGMA(push) H5_DIAG_PRAGMA(ignored H5_DIAG_JOINSTR("-W", x))
#define H5_DIAG_ON(x) H5_DIAG_PRAGMA(pop)
#else
#define H5_DIAG_OFF(x)
#define H5_DIAG_ON(x)
#endif
/* Macros for enabling/disabling particular GCC-only warnings.
* These pragmas are only implemented usefully in gcc 4.6+

View File

@ -22,8 +22,8 @@ static const char *FILENAME[] = {"event_set_1", NULL};
static hid_t connector_ids_g[EVENT_SET_NUM_CONNECTOR_IDS];
herr_t fake_wait_request_wait(void *req, uint64_t timeout, H5VL_request_status_t *status);
herr_t fake_wait_request_free(void *req);
herr_t fake_wait_request_wait(void *req, uint64_t timeout, H5VL_request_status_t *status);
H5_ATTR_CONST herr_t fake_wait_request_free(void *req);
/* A VOL class struct that describes a VOL class with no
* functionality, other than a wait that returns success.

View File

@ -26,48 +26,48 @@
#endif
/* Local function declarations */
static int gtoken(char *s);
static int process(struct Options *opt);
static int processConfigurationFile(char *infile, struct Input *in);
static int mapKeywordToIndex(char *key);
static int parsePathInfo(struct path_info *path, char *strm);
static int parseDimensions(struct Input *in, char *strm);
static int getInputSize(struct Input *in, int ival);
static int getInputClass(struct Input *in, char *strm);
static int getInputClassType(struct Input *in, char *strm);
static int getInputByteOrder(struct Input *in, FILE *strm);
static int InputClassStrToInt(char *temp);
static int getRank(struct Input *in, FILE *strm);
static int getDimensionSizes(struct Input *in, FILE *strm);
static int getOutputSize(struct Input *in, FILE *strm);
static int getOutputClass(struct Input *in, FILE *strm);
static int OutputClassStrToInt(char *temp);
static int getOutputArchitecture(struct Input *in, FILE *strm);
static int OutputArchStrToInt(const char *temp);
static int getOutputByteOrder(struct Input *in, FILE *strm);
static int OutputByteOrderStrToInt(const char *temp);
static int getChunkedDimensionSizes(struct Input *in, FILE *strm);
static int getCompressionType(struct Input *in, FILE *strm);
static int CompressionTypeStrToInt(char *temp);
static int getCompressionParameter(struct Input *in, FILE *strm);
static int getExternalFilename(struct Input *in, FILE *strm);
static int getMaximumDimensionSizes(struct Input *in, FILE *strm);
static int processDataFile(char *infile, struct Input *in, hid_t file_id);
static int readIntegerData(FILE *strm, struct Input *in);
static int readFloatData(FILE *strm, struct Input *in);
static int allocateIntegerStorage(struct Input *in);
static int allocateFloatStorage(struct Input *in);
static int readUIntegerData(FILE *strm, struct Input *in);
static int allocateUIntegerStorage(struct Input *in);
static int validateConfigurationParameters(struct Input *in);
static int processStrData(FILE *strm, struct Input *in, hid_t file_id);
static int processStrHDFData(FILE *strm, struct Input *in, hid_t file_id);
uint16_t swap_uint16(uint16_t val);
int16_t swap_int16(int16_t val);
uint32_t swap_uint32(uint32_t val);
int32_t swap_int32(int32_t val);
int64_t swap_int64(int64_t val);
uint64_t swap_uint64(uint64_t val);
static int gtoken(char *s);
static int process(struct Options *opt);
static int processConfigurationFile(char *infile, struct Input *in);
static int mapKeywordToIndex(char *key);
static int parsePathInfo(struct path_info *path, char *strm);
static int parseDimensions(struct Input *in, char *strm);
static int getInputSize(struct Input *in, int ival);
static int getInputClass(struct Input *in, char *strm);
static int getInputClassType(struct Input *in, char *strm);
static int getInputByteOrder(struct Input *in, FILE *strm);
static int InputClassStrToInt(char *temp);
static int getRank(struct Input *in, FILE *strm);
static int getDimensionSizes(struct Input *in, FILE *strm);
static int getOutputSize(struct Input *in, FILE *strm);
static int getOutputClass(struct Input *in, FILE *strm);
static int OutputClassStrToInt(char *temp);
static int getOutputArchitecture(struct Input *in, FILE *strm);
static int OutputArchStrToInt(const char *temp);
static int getOutputByteOrder(struct Input *in, FILE *strm);
static int OutputByteOrderStrToInt(const char *temp);
static int getChunkedDimensionSizes(struct Input *in, FILE *strm);
static int getCompressionType(struct Input *in, FILE *strm);
static int CompressionTypeStrToInt(char *temp);
static int getCompressionParameter(struct Input *in, FILE *strm);
static int getExternalFilename(struct Input *in, FILE *strm);
static int getMaximumDimensionSizes(struct Input *in, FILE *strm);
static int processDataFile(char *infile, struct Input *in, hid_t file_id);
static int readIntegerData(FILE *strm, struct Input *in);
static int readFloatData(FILE *strm, struct Input *in);
static int allocateIntegerStorage(struct Input *in);
static int allocateFloatStorage(struct Input *in);
static int readUIntegerData(FILE *strm, struct Input *in);
static int allocateUIntegerStorage(struct Input *in);
static int validateConfigurationParameters(struct Input *in);
static int processStrData(FILE *strm, struct Input *in, hid_t file_id);
static int processStrHDFData(FILE *strm, struct Input *in, hid_t file_id);
H5_ATTR_CONST uint16_t swap_uint16(uint16_t val);
H5_ATTR_CONST int16_t swap_int16(int16_t val);
H5_ATTR_CONST uint32_t swap_uint32(uint32_t val);
H5_ATTR_CONST int32_t swap_int32(int32_t val);
H5_ATTR_CONST int64_t swap_int64(int64_t val);
H5_ATTR_CONST uint64_t swap_uint64(uint64_t val);
int
main(int argc, char *argv[])

View File

@ -29,7 +29,6 @@
/* in detailed logging */
#define HEXDUMP_WRITEDATA 0 /* Toggle whether to print bytes to write */
/* in detailed logging */
#define LISTENQ 80 /* max pending Driver requests */
#define MW_SESSION_MAGIC 0x88F36B32u
#define MW_SOCK_COMM_MAGIC 0xDF10A157u