From c3e6bf0d81927a00de51e44fe4e006a46a52ef8c Mon Sep 17 00:00:00 2001 From: Tristan Partin Date: Wed, 13 Dec 2023 12:13:13 -0600 Subject: [PATCH] Call find_typedefs.pl in the Postgres repo The previous subroutine code has moved to the Postgres repo to have one source of truth for finding typedefs instead of the previous shell script and this buildfarm code, which didn't have the same features. --- run_build.pl | 198 ++------------------------------------------------- 1 file changed, 7 insertions(+), 191 deletions(-) diff --git a/run_build.pl b/run_build.pl index 107c135..157bfee 100755 --- a/run_build.pl +++ b/run_build.pl @@ -1141,7 +1141,13 @@ END { print time_str(), "running find_typedefs ...\n" if $verbose; - find_typedefs(); + my (@foundsyms); + my $source = $from_source || '../pgsql'; + + @foundsyms = run_log("perl $source/src/tools/find_typedefs.pl"); + + writelog('typedefs', \@foundsyms); + $steps_completed .= " find-typedefs"; } # if we get here everything went fine ... @@ -2577,196 +2583,6 @@ sub make_ecpg_check return; } -# replace previous use of external egrep -A -sub _dump_filter -{ - my ($lines, $tag, $context) = @_; - my @output; - while (@$lines) - { - my $line = shift @$lines; - if (index($line, $tag) > -1) - { - push(@output, splice(@$lines, 0, $context)); - } - } - return @output; -} - -sub find_typedefs -{ - # work around the fact that ucrt/binutils objdump is far slower - # than the one in msys/binutils - local $ENV{PATH} = $ENV{PATH}; - $ENV{PATH} = "/usr/bin:$ENV{PATH}" if $Config{osname} eq 'msys'; - - my ($hostobjdump) = grep { /--host=/ } @$config_opts; - $hostobjdump ||= ""; - $hostobjdump =~ s/--host=(.*)/$1-objdump/; - my $objdump = 'objdump'; - my $sep = $using_msvc ? ';' : ':'; - - # if we have a hostobjdump, find out which of it and objdump is in the path - foreach my $p (split(/$sep/, $ENV{PATH})) - { - last unless $hostobjdump; - last if (-e "$p/objdump" || -e "$p/objdump.exe"); - if (-e "$p/$hostobjdump" || -e "$p/$hostobjdump.exe") - { - $objdump = $hostobjdump; - last; - } - } - my @err = `$objdump -W 2>&1`; - my @readelferr = `readelf -w 2>&1`; - my $using_osx = (`uname` eq "Darwin\n"); - my @testfiles; - my %syms; - my @dumpout; - my @flds; - - if ($using_osx) - { - - # On OS X, we need to examine the .o files - # exclude ecpg/test, which pgindent does too - my $obj_wanted = sub { - /^.*\.o\z/s - && !($File::Find::name =~ m!/ecpg/test/!s) - && push(@testfiles, $File::Find::name); - }; - - File::Find::find($obj_wanted, $pgsql); - } - else - { - - # Elsewhere, look at the installed executables and shared libraries - @testfiles = ( - glob("$installdir/bin/*"), - glob("$installdir/lib/*"), - glob("$installdir/lib/postgresql/*") - ); - } - foreach my $bin (@testfiles) - { - next if $bin =~ m!bin/(ipcclean|pltcl_)!; - next unless -f $bin; - next if -l $bin; # ignore symlinks to plain files - next if $bin =~ m!/postmaster.exe$!; # sometimes a copy not a link - - if ($using_osx) - { - # no run_log due to redirections. - @dumpout = `dwarfdump $bin 2>/dev/null`; - @dumpout = _dump_filter(\@dumpout, 'TAG_typedef', 2); - foreach (@dumpout) - { - ## no critic (RegularExpressions::ProhibitCaptureWithoutTest) - @flds = split; - if (@flds == 3) - { - # old format - next unless ($flds[0] eq "AT_name("); - next unless ($flds[1] =~ m/^"(.*)"$/); - $syms{$1} = 1; - } - elsif (@flds == 2) - { - # new format - next unless ($flds[0] eq "DW_AT_name"); - next unless ($flds[1] =~ m/^\("(.*)"\)$/); - $syms{$1} = 1; - } - } - } - elsif (@err == 1) # Linux and sometimes windows - { - my $cmd = "$objdump -Wi $bin 2>/dev/null"; - @dumpout = `$cmd`; # no run_log because of redirections - @dumpout = _dump_filter(\@dumpout, 'DW_TAG_typedef', 3); - foreach (@dumpout) - { - @flds = split; - next unless (1 < @flds); - next - if (($flds[0] ne 'DW_AT_name' && $flds[1] ne 'DW_AT_name') - || $flds[-1] =~ /^DW_FORM_str/); - $syms{ $flds[-1] } = 1; - } - } - elsif (@readelferr > 10) - { - - # FreeBSD, similar output to Linux - my $cmd = "readelf -w $bin 2>/dev/null"; - @dumpout = ` $cmd`; # no run_log due to redirections - @dumpout = _dump_filter(\@dumpout, 'DW_TAG_typedef', 3); - - foreach (@dumpout) - { - @flds = split; - next unless (1 < @flds); - next if ($flds[0] ne 'DW_AT_name'); - $syms{ $flds[-1] } = 1; - } - } - else - { - # no run_log due to redirections. - @dumpout = `$objdump --stabs $bin 2>/dev/null`; - foreach (@dumpout) - { - @flds = split; - next if (@flds < 7); - next if ($flds[1] ne 'LSYM' || $flds[6] !~ /([^:]+):t/); - ## no critic (RegularExpressions::ProhibitCaptureWithoutTest) - $syms{$1} = 1; - } - } - } - my @badsyms = grep { /\s/ } keys %syms; - push(@badsyms, 'date', 'interval', 'timestamp', 'ANY'); - delete @syms{@badsyms}; - - my @goodsyms = sort keys %syms; - my @foundsyms; - - my %foundwords; - - my $setfound = sub { - - # $_ is the name of the file being examined - # its directory is our current cwd - - return unless (-f $_ && /^.*\.[chly]\z/); - - my $src = file_contents($_); - - # strip C comments - # We used to use the recipe in perlfaq6 but there is actually no point. - # We don't need to keep the quoted string values anyway, and - # on some platforms the complex regex causes perl to barf and crash. - $src =~ s{/\*.*?\*/}{}gs; - - foreach my $word (split(/\W+/, $src)) - { - $foundwords{$word} = 1; - } - }; - - File::Find::find($setfound, "$branch_root/pgsql"); - - foreach my $sym (@goodsyms) - { - push(@foundsyms, "$sym\n") if exists $foundwords{$sym}; - } - - writelog('typedefs', \@foundsyms); - $steps_completed .= " find-typedefs"; - return; -} - # meson setup for all platforms sub meson_setup {