diff perl-5.22.2/makedef.pl @ 8045:a16537d2fe07

<xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
author HackBot
date Sat, 14 May 2016 14:54:38 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/perl-5.22.2/makedef.pl	Sat May 14 14:54:38 2016 +0000
@@ -0,0 +1,1348 @@
+#./perl -w
+#
+# Create the export list for perl.
+#
+# Needed by WIN32 and OS/2 for creating perl.dll,
+# and by AIX for creating libperl.a when -Duseshrplib is in effect,
+# and by VMS for creating perlshr.exe.
+#
+# Reads from information stored in
+#
+#    %Config::Config (ie config.sh)
+#    config.h
+#    embed.fnc
+#    globvar.sym
+#    intrpvar.h
+#    miniperl.map (on OS/2)
+#    perl5.def    (on OS/2; this is the old version of the file being made)
+#    perlio.sym
+#    perlvars.h
+#    regen/opcodes
+#
+# plus long lists of function names hard-coded directly in this script.
+#
+# Writes the result to STDOUT.
+#
+# Normally this script is invoked from a makefile (e.g. win32/Makefile),
+# which redirects STDOUT to a suitable file, such as:
+#
+#    perl5.def   OS/2
+#    perldll.def Windows
+#    perl.exp    AIX
+#    perl.imp    NetWare
+#    makedef.lis VMS
+
+my $fold;
+my %ARGS;
+my %define;
+
+BEGIN {
+    BEGIN { unshift @INC, "lib" }
+    use Config;
+    use strict;
+
+    %ARGS = (CCTYPE => 'MSVC', TARG_DIR => '');
+
+    sub process_cc_flags {
+	foreach (map {split /\s+/, $_} @_) {
+	    $define{$1} = $2 // 1 if /^-D(\w+)(?:=(.+))?/;
+	}
+    }
+
+    while (@ARGV) {
+	my $flag = shift;
+	if ($flag =~ /^(?:CC_FLAGS=)?(-D\w.*)/) {
+	    process_cc_flags($1);
+	} elsif ($flag =~ /^(CCTYPE|FILETYPE|PLATFORM|TARG_DIR)=(.+)$/) {
+	    $ARGS{$1} = $2;
+	} elsif ($flag eq '--sort-fold') {
+	    ++$fold;
+	}
+    }
+    my @PLATFORM = qw(aix win32 wince os2 netware vms test);
+    my %PLATFORM;
+    @PLATFORM{@PLATFORM} = ();
+
+    die "PLATFORM undefined, must be one of: @PLATFORM\n"
+	unless defined $ARGS{PLATFORM};
+    die "PLATFORM must be one of: @PLATFORM\n"
+	unless exists $PLATFORM{$ARGS{PLATFORM}};
+}
+use constant PLATFORM => $ARGS{PLATFORM};
+
+require "$ARGS{TARG_DIR}regen/embed_lib.pl";
+
+# Is the following guard strictly necessary? Added during refactoring
+# to keep the same behaviour when merging other code into here.
+process_cc_flags(@Config{qw(ccflags optimize)})
+    if $ARGS{PLATFORM} ne 'win32' && $ARGS{PLATFORM} ne 'wince'
+    && $ARGS{PLATFORM} ne 'netware';
+
+# Add the compile-time options that miniperl was built with to %define.
+# On Win32 these are not the same options as perl itself will be built
+# with since miniperl is built with a canned config (one of the win32/
+# config_H.*) and none of the BUILDOPT's that are set in the makefiles,
+# but they do include some #define's that are hard-coded in various
+# source files and header files and don't include any BUILDOPT's that
+# the user might have chosen to disable because the canned configs are
+# minimal configs that don't include any of those options.
+
+#don't use the host Perl's -V defines for the WinCE Perl
+if($ARGS{PLATFORM} ne 'wince') {
+    my @options = sort(Config::bincompat_options(), Config::non_bincompat_options());
+    print STDERR "Options: (@options)\n" unless $ARGS{PLATFORM} eq 'test';
+    $define{$_} = 1 foreach @options;
+}
+
+my %exportperlmalloc =
+    (
+       Perl_malloc		=>	"malloc",
+       Perl_mfree		=>	"free",
+       Perl_realloc		=>	"realloc",
+       Perl_calloc		=>	"calloc",
+    );
+
+my $exportperlmalloc = $ARGS{PLATFORM} eq 'os2';
+
+my $config_h = 'config.h';
+open(CFG, '<', $config_h) || die "Cannot open $config_h: $!\n";
+while (<CFG>) {
+    $define{$1} = 1 if /^\s*\#\s*define\s+(MYMALLOC|MULTIPLICITY
+                                           |SPRINTF_RETURNS_STRLEN
+                                           |KILL_BY_SIGPRC
+                                           |(?:PERL|USE|HAS)_\w+)\b/x;
+}
+close(CFG);
+
+# perl.h logic duplication begins
+
+if ($define{USE_ITHREADS}) {
+    if (!$define{MULTIPLICITY}) {
+        $define{MULTIPLICITY} = 1;
+    }
+}
+
+$define{PERL_IMPLICIT_CONTEXT} ||=
+    $define{USE_ITHREADS} ||
+    $define{MULTIPLICITY} ;
+
+if ($define{USE_ITHREADS} && $ARGS{PLATFORM} ne 'win32' && $^O ne 'darwin') {
+    $define{USE_REENTRANT_API} = 1;
+}
+
+# perl.h logic duplication ends
+
+print STDERR "Defines: (" . join(' ', sort keys %define) . ")\n"
+     unless $ARGS{PLATFORM} eq 'test';
+
+my $sym_ord = 0;
+my %ordinal;
+
+if ($ARGS{PLATFORM} eq 'os2') {
+    if (open my $fh, '<', 'perl5.def') {
+      while (<$fh>) {
+	last if /^\s*EXPORTS\b/;
+      }
+      while (<$fh>) {
+	$ordinal{$1} = $2 if /^\s*"(\w+)"\s*(?:=\s*"\w+"\s*)?\@(\d+)\s*$/;
+	# This allows skipping ordinals which were used in older versions
+	$sym_ord = $1 if /^\s*;\s*LAST_ORDINAL\s*=\s*(\d+)\s*$/;
+      }
+      $sym_ord < $_ and $sym_ord = $_ for values %ordinal; # Take the max
+    }
+}
+
+my %skip;
+# All platforms export boot_DynaLoader unconditionally.
+my %export = ( boot_DynaLoader => 1 );
+
+sub try_symbols {
+    foreach my $symbol (@_) {
+	++$export{$symbol} unless exists $skip{$symbol};
+    }
+}
+
+sub readvar {
+    # $hash is the hash that we're adding to. For one of our callers, it will
+    # actually be the skip hash but that doesn't affect the intent of what
+    # we're doing, as in that case we skip adding something to the skip hash
+    # for the second time.
+
+    my $file = $ARGS{TARG_DIR} . shift;
+    my $hash = shift;
+    my $proc = shift;
+    open my $vars, '<', $file or die die "Cannot open $file: $!\n";
+
+    while (<$vars>) {
+	# All symbols have a Perl_ prefix because that's what embed.h sticks
+	# in front of them.  The A?I?S?C? is strictly speaking wrong.
+	next unless /\bPERLVAR(A?I?S?C?)\(([IGT]),\s*(\w+)/;
+
+	my $var = "PL_$3";
+	my $symbol = $proc ? &$proc($1,$2,$3) : $var;
+	++$hash->{$symbol} unless exists $skip{$var};
+    }
+}
+
+if ($ARGS{PLATFORM} ne 'os2') {
+    ++$skip{$_} foreach qw(
+		     PL_cryptseen
+		     PL_opsave
+		     Perl_GetVars
+		     Perl_dump_fds
+		     Perl_my_bcopy
+		     Perl_my_bzero
+		     Perl_my_chsize
+		     Perl_my_htonl
+		     Perl_my_memcmp
+		     Perl_my_memset
+		     Perl_my_ntohl
+		     Perl_my_swap
+			 );
+    if ($ARGS{PLATFORM} eq 'vms') {
+	++$skip{PL_statusvalue_posix};
+        # This is a wrapper if we have symlink, not a replacement
+        # if we don't.
+        ++$skip{Perl_my_symlink} unless $Config{d_symlink};
+    } else {
+	++$skip{PL_statusvalue_vms};
+	if ($ARGS{PLATFORM} ne 'aix') {
+	    ++$skip{$_} foreach qw(
+				PL_DBcv
+				PL_generation
+				PL_lastgotoprobe
+				PL_modcount
+				PL_timesbuf
+				main
+				 );
+	}
+    }
+}
+
+if ($ARGS{PLATFORM} ne 'vms') {
+    # VMS does its own thing for these symbols.
+    ++$skip{$_} foreach qw(
+			PL_sig_handlers_initted
+			PL_sig_ignoring
+			PL_sig_defaulting
+			 );
+    if ($ARGS{PLATFORM} ne 'win32') {
+	++$skip{$_} foreach qw(
+			    Perl_do_spawn
+			    Perl_do_spawn_nowait
+			    Perl_do_aspawn
+			     );
+    }
+}
+
+if ($ARGS{PLATFORM} ne 'win32') {
+    ++$skip{$_} foreach qw(
+		    Perl_my_setlocale
+			 );
+}
+
+unless ($define{UNLINK_ALL_VERSIONS}) {
+    ++$skip{Perl_unlnk};
+}
+
+unless ($define{'DEBUGGING'}) {
+    ++$skip{$_} foreach qw(
+		    Perl_debop
+		    Perl_debprofdump
+		    Perl_debstack
+		    Perl_debstackptrs
+		    Perl_pad_sv
+		    Perl_pad_setsv
+		    Perl_set_padlist
+		    Perl_hv_assert
+		    PL_watchaddr
+		    PL_watchok
+		    PL_watch_pvx
+			 );
+}
+
+if ($define{'PERL_IMPLICIT_SYS'}) {
+    ++$skip{$_} foreach qw(
+		    Perl_my_popen
+		    Perl_my_pclose
+			 );
+    ++$export{$_} foreach qw(perl_get_host_info perl_alloc_override);
+    ++$export{perl_clone_host} if $define{USE_ITHREADS};
+}
+else {
+    ++$skip{$_} foreach qw(
+		    PL_Mem
+		    PL_MemShared
+		    PL_MemParse
+		    PL_Env
+		    PL_StdIO
+		    PL_LIO
+		    PL_Dir
+		    PL_Sock
+		    PL_Proc
+		    perl_alloc_using
+		    perl_clone_using
+			 );
+}
+
+unless ($define{'PERL_OLD_COPY_ON_WRITE'}
+     || $define{'PERL_NEW_COPY_ON_WRITE'}) {
+    ++$skip{Perl_sv_setsv_cow};
+}
+
+unless ($define{PERL_SAWAMPERSAND}) {
+    ++$skip{PL_sawampersand};
+}
+
+unless ($define{'USE_REENTRANT_API'}) {
+    ++$skip{PL_reentrant_buffer};
+}
+
+if ($define{'MYMALLOC'}) {
+    try_symbols(qw(
+		    Perl_dump_mstats
+		    Perl_get_mstats
+		    Perl_strdup
+		    Perl_putenv
+		    MallocCfg_ptr
+		    MallocCfgP_ptr
+		    ));
+    unless ($define{USE_ITHREADS}) {
+	++$skip{PL_malloc_mutex}
+    }
+}
+else {
+    ++$skip{$_} foreach qw(
+		    PL_malloc_mutex
+		    Perl_dump_mstats
+		    Perl_get_mstats
+		    MallocCfg_ptr
+		    MallocCfgP_ptr
+			 );
+}
+
+if ($define{'PERL_USE_SAFE_PUTENV'}) {
+    ++$skip{PL_use_safe_putenv};
+}
+
+unless ($define{'USE_ITHREADS'}) {
+    ++$skip{PL_thr_key};
+}
+
+# USE_5005THREADS symbols. Kept as reference for easier removal
+++$skip{$_} foreach qw(
+		    PL_sv_mutex
+		    PL_strtab_mutex
+		    PL_svref_mutex
+		    PL_cred_mutex
+		    PL_eval_mutex
+		    PL_fdpid_mutex
+		    PL_sv_lock_mutex
+		    PL_eval_cond
+		    PL_eval_owner
+		    PL_threads_mutex
+		    PL_nthreads
+		    PL_nthreads_cond
+		    PL_threadnum
+		    PL_threadsv_names
+		    PL_thrsv
+		    PL_vtbl_mutex
+		    Perl_condpair_magic
+		    Perl_new_struct_thread
+		    Perl_per_thread_magicals
+		    Perl_thread_create
+		    Perl_find_threadsv
+		    Perl_unlock_condpair
+		    Perl_magic_mutexfree
+		    Perl_sv_lock
+		     );
+
+unless ($define{'USE_ITHREADS'}) {
+    ++$skip{$_} foreach qw(
+		    PL_check_mutex
+		    PL_op_mutex
+		    PL_regex_pad
+		    PL_regex_padav
+		    PL_dollarzero_mutex
+		    PL_hints_mutex
+		    PL_my_ctx_mutex
+		    PL_perlio_mutex
+		    PL_stashpad
+		    PL_stashpadix
+		    PL_stashpadmax
+		    Perl_alloccopstash
+		    Perl_allocfilegv
+		    Perl_clone_params_del
+		    Perl_clone_params_new
+		    Perl_parser_dup
+		    Perl_dirp_dup
+		    Perl_cx_dup
+		    Perl_si_dup
+		    Perl_any_dup
+		    Perl_ss_dup
+		    Perl_fp_dup
+		    Perl_gp_dup
+		    Perl_he_dup
+		    Perl_mg_dup
+		    Perl_re_dup_guts
+		    Perl_sv_dup
+		    Perl_sv_dup_inc
+		    Perl_rvpv_dup
+		    Perl_hek_dup
+		    Perl_sys_intern_dup
+		    perl_clone
+		    perl_clone_using
+		    Perl_stashpv_hvname_match
+		    Perl_regdupe_internal
+		    Perl_newPADOP
+			 );
+}
+
+unless ($define{'PERL_IMPLICIT_CONTEXT'}) {
+    ++$skip{$_} foreach qw(
+		    PL_my_cxt_index
+		    PL_my_cxt_list
+		    PL_my_cxt_size
+		    PL_my_cxt_keys
+		    Perl_croak_nocontext
+		    Perl_die_nocontext
+		    Perl_deb_nocontext
+		    Perl_form_nocontext
+		    Perl_load_module_nocontext
+		    Perl_mess_nocontext
+		    Perl_warn_nocontext
+		    Perl_warner_nocontext
+		    Perl_newSVpvf_nocontext
+		    Perl_sv_catpvf_nocontext
+		    Perl_sv_setpvf_nocontext
+		    Perl_sv_catpvf_mg_nocontext
+		    Perl_sv_setpvf_mg_nocontext
+		    Perl_my_cxt_init
+		    Perl_my_cxt_index
+			 );
+}
+
+unless ($define{'PERL_OP_PARENT'}) {
+    ++$skip{$_} foreach qw(
+		    Perl_op_parent
+                );
+}
+
+if ($define{'NO_MATHOMS'}) {
+    # win32 builds happen in the win32/ subdirectory, but vms builds happen
+    # at the top level, so we need to look in two candidate locations for
+    # the mathoms.c file.
+    my ($file) = grep { -f } qw( mathoms.c ../mathoms.c )
+        or die "No mathoms.c file found in . or ..\n";
+    open my $mathoms, '<', $file
+        or die "Cannot open $file: $!\n";
+    while (<$mathoms>) {
+        ++$skip{$1} if /\A ( NATIVE_TO_NEED
+                           | ASCII_TO_NEED
+                           | Perl_\w+ ) \s* \( /axms;
+    }
+}
+
+unless ($define{'PERL_NEED_APPCTX'}) {
+    ++$skip{PL_appctx};
+}
+
+unless ($define{'PERL_NEED_TIMESBASE'}) {
+    ++$skip{PL_timesbase};
+}
+
+unless ($define{'DEBUG_LEAKING_SCALARS'}) {
+    ++$skip{PL_sv_serial};
+}
+
+unless ($define{'DEBUG_LEAKING_SCALARS_FORK_DUMP'}) {
+    ++$skip{PL_dumper_fd};
+}
+
+unless ($define{'PERL_DONT_CREATE_GVSV'}) {
+    ++$skip{Perl_gv_SVadd};
+}
+
+if ($define{'SPRINTF_RETURNS_STRLEN'}) {
+    ++$skip{Perl_my_sprintf};
+}
+
+unless ($define{'PERL_USES_PL_PIDSTATUS'}) {
+    ++$skip{PL_pidstatus};
+}
+
+unless ($define{'PERL_TRACK_MEMPOOL'}) {
+    ++$skip{PL_memory_debug_header};
+}
+
+unless ($define{'MULTIPLICITY'}) {
+    ++$skip{$_} foreach qw(
+		    PL_interp_size
+		    PL_interp_size_5_18_0
+			 );
+}
+
+unless ($define{'PERL_GLOBAL_STRUCT'}) {
+    ++$skip{PL_global_struct_size};
+}
+
+unless ($define{'PERL_GLOBAL_STRUCT_PRIVATE'}) {
+    ++$skip{$_} foreach qw(
+		    PL_my_cxt_keys
+		    Perl_my_cxt_index
+			 );
+}
+
+unless ($define{HAS_MMAP}) {
+    ++$skip{PL_mmap_page_size};
+}
+
+if ($define{HAS_SIGACTION}) {
+    ++$skip{PL_sig_trapped};
+
+    if ($ARGS{PLATFORM} eq 'vms') {
+        # FAKE_PERSISTENT_SIGNAL_HANDLERS defined as !defined(HAS_SIGACTION)
+        ++$skip{PL_sig_ignoring};
+        ++$skip{PL_sig_handlers_initted} unless $define{KILL_BY_SIGPRC};
+    }
+}
+
+if ($ARGS{PLATFORM} eq 'vms' && !$define{KILL_BY_SIGPRC}) {
+    # FAKE_DEFAULT_SIGNAL_HANDLERS defined as KILL_BY_SIGPRC
+    ++$skip{Perl_csighandler_init};
+    ++$skip{Perl_my_kill};
+    ++$skip{Perl_sig_to_vmscondition};
+    ++$skip{PL_sig_defaulting};
+    ++$skip{PL_sig_handlers_initted} unless !$define{HAS_SIGACTION};
+}
+
+unless ($define{USE_LOCALE_COLLATE}) {
+    ++$skip{$_} foreach qw(
+		    PL_collation_ix
+		    PL_collation_name
+		    PL_collation_standard
+		    PL_collxfrm_base
+		    PL_collxfrm_mult
+		    Perl_sv_collxfrm
+		    Perl_sv_collxfrm_flags
+			 );
+}
+
+unless ($define{USE_LOCALE_NUMERIC}) {
+    ++$skip{$_} foreach qw(
+		    PL_numeric_local
+		    PL_numeric_name
+		    PL_numeric_radix_sv
+		    PL_numeric_standard
+			 );
+}
+
+unless ($define{'USE_C_BACKTRACE'}) {
+    ++$skip{Perl_get_c_backtrace_dump};
+    ++$skip{Perl_dump_c_backtrace};
+}
+
+unless ($define{HAVE_INTERP_INTERN}) {
+    ++$skip{$_} foreach qw(
+		    Perl_sys_intern_clear
+		    Perl_sys_intern_dup
+		    Perl_sys_intern_init
+		    PL_sys_intern
+			 );
+}
+
+if ($define{HAS_SIGNBIT}) {
+    ++$skip{Perl_signbit};
+}
+
+if ($define{'PERL_GLOBAL_STRUCT'}) {
+    readvar('perlvars.h', \%skip);
+    # This seems like the least ugly way to cope with the fact that PL_sh_path
+    # is mentioned in perlvar.h and globvar.sym, and always exported.
+    delete $skip{PL_sh_path};
+    ++$export{Perl_GetVars};
+    try_symbols(qw(PL_Vars PL_VarsPtr))
+      unless $ARGS{CCTYPE} eq 'GCC' || $define{PERL_GLOBAL_STRUCT_PRIVATE};
+} else {
+    ++$skip{$_} foreach qw(Perl_init_global_struct Perl_free_global_struct);
+}
+
+++$skip{PL_op_exec_cnt}
+    unless $define{PERL_TRACE_OPS};
+
+# functions from *.sym files
+
+my @syms = qw(globvar.sym);
+
+# Symbols that are the public face of the PerlIO layers implementation
+# These are in _addition to_ the public face of the abstraction
+# and need to be exported to allow XS modules to implement layers
+my @layer_syms = qw(
+		    PerlIOBase_binmode
+		    PerlIOBase_clearerr
+		    PerlIOBase_close
+		    PerlIOBase_dup
+		    PerlIOBase_eof
+		    PerlIOBase_error
+		    PerlIOBase_fileno
+		    PerlIOBase_open
+		    PerlIOBase_noop_fail
+		    PerlIOBase_noop_ok
+		    PerlIOBase_popped
+		    PerlIOBase_pushed
+		    PerlIOBase_read
+		    PerlIOBase_setlinebuf
+		    PerlIOBase_unread
+		    PerlIOBuf_bufsiz
+		    PerlIOBuf_close
+		    PerlIOBuf_dup
+		    PerlIOBuf_fill
+		    PerlIOBuf_flush
+		    PerlIOBuf_get_base
+		    PerlIOBuf_get_cnt
+		    PerlIOBuf_get_ptr
+		    PerlIOBuf_open
+		    PerlIOBuf_popped
+		    PerlIOBuf_pushed
+		    PerlIOBuf_read
+		    PerlIOBuf_seek
+		    PerlIOBuf_set_ptrcnt
+		    PerlIOBuf_tell
+		    PerlIOBuf_unread
+		    PerlIOBuf_write
+		    PerlIO_allocate
+		    PerlIO_apply_layera
+		    PerlIO_apply_layers
+		    PerlIO_arg_fetch
+		    PerlIO_debug
+		    PerlIO_define_layer
+		    PerlIO_find_layer
+		    PerlIO_isutf8
+		    PerlIO_layer_fetch
+		    PerlIO_list_alloc
+		    PerlIO_list_free
+		    PerlIO_modestr
+		    PerlIO_parse_layers
+		    PerlIO_pending
+		    PerlIO_perlio
+		    PerlIO_pop
+		    PerlIO_push
+		    PerlIO_sv_dup
+		    Perl_PerlIO_clearerr
+		    Perl_PerlIO_close
+		    Perl_PerlIO_context_layers
+		    Perl_PerlIO_eof
+		    Perl_PerlIO_error
+		    Perl_PerlIO_fileno
+		    Perl_PerlIO_fill
+		    Perl_PerlIO_flush
+		    Perl_PerlIO_get_base
+		    Perl_PerlIO_get_bufsiz
+		    Perl_PerlIO_get_cnt
+		    Perl_PerlIO_get_ptr
+		    Perl_PerlIO_read
+		    Perl_PerlIO_restore_errno
+		    Perl_PerlIO_save_errno
+		    Perl_PerlIO_seek
+		    Perl_PerlIO_set_cnt
+		    Perl_PerlIO_set_ptrcnt
+		    Perl_PerlIO_setlinebuf
+		    Perl_PerlIO_stderr
+		    Perl_PerlIO_stdin
+		    Perl_PerlIO_stdout
+		    Perl_PerlIO_tell
+		    Perl_PerlIO_unread
+		    Perl_PerlIO_write
+);
+if ($ARGS{PLATFORM} eq 'netware') {
+    push(@layer_syms,'PL_def_layerlist','PL_known_layers','PL_perlio');
+}
+
+if ($define{'USE_PERLIO'}) {
+    # Export the symbols that make up the PerlIO abstraction, regardless
+    # of its implementation - read from a file
+    push @syms, 'perlio.sym';
+
+    # PerlIO with layers - export implementation
+    try_symbols(@layer_syms, 'perlsio_binmode');
+} else {
+	# -Uuseperlio
+	# Skip the PerlIO layer symbols - although
+	# nothing should have exported them anyway.
+	++$skip{$_} foreach @layer_syms;
+	++$skip{$_} foreach qw(
+			perlsio_binmode
+			PL_def_layerlist
+			PL_known_layers
+			PL_perlio
+			PL_perlio_debug_fd
+			PL_perlio_fd_refcnt
+			PL_perlio_fd_refcnt_size
+			PL_perlio_mutex
+			     );
+
+	# Also do NOT add abstraction symbols from $perlio_sym
+	# abstraction is done as #define to stdio
+	# Remaining remnants that _may_ be functions are handled below.
+}
+
+unless ($define{'USE_QUADMATH'}) {
+  ++$skip{Perl_quadmath_format_needed};
+  ++$skip{Perl_quadmath_format_single};
+}
+
+###############################################################################
+
+# At this point all skip lists should be completed, as we are about to test
+# many symbols against them.
+
+{
+    my %seen;
+    my ($embed) = setup_embed($ARGS{TARG_DIR});
+
+    foreach (@$embed) {
+	my ($flags, $retval, $func, @args) = @$_;
+	next unless $func;
+	if ($flags =~ /[AX]/ && $flags !~ /[xmi]/ || $flags =~ /b/) {
+	    # public API, so export
+
+	    # If a function is defined twice, for example before and after
+	    # an #else, only export its name once. Important to do this test
+	    # within the block, as the *first* definition may have flags which
+	    # mean "don't export"
+	    next if $seen{$func}++;
+	    # Should we also skip adding the Perl_ prefix if $flags =~ /o/ ?
+	    $func = "Perl_$func" if ($flags =~ /[pbX]/ && $func !~ /^Perl_/); 
+	    ++$export{$func} unless exists $skip{$func};
+	}
+    }
+}
+
+foreach (@syms) {
+    my $syms = $ARGS{TARG_DIR} . $_;
+    open my $global, '<', $syms or die "failed to open $syms: $!\n";
+    while (<$global>) {
+	next unless /^([A-Za-z].*)/;
+	my $symbol = "$1";
+	++$export{$symbol} unless exists $skip{$symbol};
+    }
+}
+
+# variables
+
+if ($define{'MULTIPLICITY'} && $define{PERL_GLOBAL_STRUCT}) {
+    readvar('perlvars.h', \%export, sub { "Perl_" . $_[1] . $_[2] . "_ptr" });
+    # XXX AIX seems to want the perlvars.h symbols, for some reason
+    if ($ARGS{PLATFORM} eq 'aix' or $ARGS{PLATFORM} eq 'os2') {	# OS/2 needs PL_thr_key
+	readvar('perlvars.h', \%export);
+    }
+}
+else {
+    unless ($define{'PERL_GLOBAL_STRUCT'}) {
+	readvar('perlvars.h', \%export);
+    }
+    unless ($define{MULTIPLICITY}) {
+	readvar('intrpvar.h', \%export);
+    }
+}
+
+# Oddities from PerlIO
+# All have alternate implementations in perlio.c, so always exist.
+# Should they be considered to be part of the API?
+try_symbols(qw(
+		    PerlIO_binmode
+		    PerlIO_getpos
+		    PerlIO_init
+		    PerlIO_setpos
+		    PerlIO_tmpfile
+	     ));
+
+if ($ARGS{PLATFORM} eq 'win32') {
+    try_symbols(qw(
+				 win32_free_childdir
+				 win32_free_childenv
+				 win32_get_childdir
+				 win32_get_childenv
+				 win32_spawnvp
+		 ));
+}
+
+if ($ARGS{PLATFORM} eq 'wince') {
+    ++$skip{'win32_isatty'}; # commit 4342f4d6df is win32-only
+}
+
+if ($ARGS{PLATFORM} =~ /^win(?:32|ce)$/) {
+    try_symbols(qw(
+			    Perl_init_os_extras
+			    Perl_thread_create
+			    Perl_win32_init
+			    Perl_win32_term
+			    RunPerl
+			    win32_async_check
+			    win32_errno
+			    win32_environ
+			    win32_abort
+			    win32_fstat
+			    win32_stat
+			    win32_pipe
+			    win32_popen
+			    win32_pclose
+			    win32_rename
+			    win32_setmode
+			    win32_chsize
+			    win32_lseek
+			    win32_tell
+			    win32_dup
+			    win32_dup2
+			    win32_open
+			    win32_close
+			    win32_eof
+			    win32_isatty
+			    win32_read
+			    win32_write
+			    win32_mkdir
+			    win32_rmdir
+			    win32_chdir
+			    win32_flock
+			    win32_execv
+			    win32_execvp
+			    win32_htons
+			    win32_ntohs
+			    win32_htonl
+			    win32_ntohl
+			    win32_inet_addr
+			    win32_inet_ntoa
+			    win32_socket
+			    win32_bind
+			    win32_listen
+			    win32_accept
+			    win32_connect
+			    win32_send
+			    win32_sendto
+			    win32_recv
+			    win32_recvfrom
+			    win32_shutdown
+			    win32_closesocket
+			    win32_ioctlsocket
+			    win32_setsockopt
+			    win32_getsockopt
+			    win32_getpeername
+			    win32_getsockname
+			    win32_gethostname
+			    win32_gethostbyname
+			    win32_gethostbyaddr
+			    win32_getprotobyname
+			    win32_getprotobynumber
+			    win32_getservbyname
+			    win32_getservbyport
+			    win32_select
+			    win32_endhostent
+			    win32_endnetent
+			    win32_endprotoent
+			    win32_endservent
+			    win32_getnetent
+			    win32_getnetbyname
+			    win32_getnetbyaddr
+			    win32_getprotoent
+			    win32_getservent
+			    win32_sethostent
+			    win32_setnetent
+			    win32_setprotoent
+			    win32_setservent
+			    win32_getenv
+			    win32_putenv
+			    win32_perror
+			    win32_malloc
+			    win32_calloc
+			    win32_realloc
+			    win32_free
+			    win32_sleep
+			    win32_times
+			    win32_access
+			    win32_alarm
+			    win32_chmod
+			    win32_open_osfhandle
+			    win32_get_osfhandle
+			    win32_ioctl
+			    win32_link
+			    win32_unlink
+			    win32_utime
+			    win32_gettimeofday
+			    win32_uname
+			    win32_wait
+			    win32_waitpid
+			    win32_kill
+			    win32_str_os_error
+			    win32_opendir
+			    win32_readdir
+			    win32_telldir
+			    win32_seekdir
+			    win32_rewinddir
+			    win32_closedir
+			    win32_longpath
+			    win32_ansipath
+			    win32_os_id
+			    win32_getpid
+			    win32_crypt
+			    win32_dynaload
+			    win32_clearenv
+			    win32_stdin
+			    win32_stdout
+			    win32_stderr
+			    win32_ferror
+			    win32_feof
+			    win32_strerror
+			    win32_fprintf
+			    win32_printf
+			    win32_vfprintf
+			    win32_vprintf
+			    win32_fread
+			    win32_fwrite
+			    win32_fopen
+			    win32_fdopen
+			    win32_freopen
+			    win32_fclose
+			    win32_fputs
+			    win32_fputc
+			    win32_ungetc
+			    win32_getc
+			    win32_fileno
+			    win32_clearerr
+			    win32_fflush
+			    win32_ftell
+			    win32_fseek
+			    win32_fgetpos
+			    win32_fsetpos
+			    win32_rewind
+			    win32_tmpfile
+			    win32_setbuf
+			    win32_setvbuf
+			    win32_flushall
+			    win32_fcloseall
+			    win32_fgets
+			    win32_gets
+			    win32_fgetc
+			    win32_putc
+			    win32_puts
+			    win32_getchar
+			    win32_putchar
+		 ));
+}
+elsif ($ARGS{PLATFORM} eq 'vms') {
+    try_symbols(qw(
+		      Perl_cando
+		      Perl_cando_by_name
+		      Perl_closedir
+		      Perl_csighandler_init
+		      Perl_do_rmdir
+		      Perl_fileify_dirspec
+		      Perl_fileify_dirspec_ts
+		      Perl_fileify_dirspec_utf8
+		      Perl_fileify_dirspec_utf8_ts
+		      Perl_flex_fstat
+		      Perl_flex_lstat
+		      Perl_flex_stat
+		      Perl_kill_file
+		      Perl_my_chdir
+		      Perl_my_chmod
+		      Perl_my_crypt
+		      Perl_my_endpwent
+		      Perl_my_fclose
+		      Perl_my_fdopen
+		      Perl_my_fgetname
+		      Perl_my_flush
+		      Perl_my_fwrite
+		      Perl_my_gconvert
+		      Perl_my_getenv
+		      Perl_my_getenv_len
+		      Perl_my_getlogin
+		      Perl_my_getpwnam
+		      Perl_my_getpwuid
+		      Perl_my_gmtime
+		      Perl_my_kill
+		      Perl_my_localtime
+		      Perl_my_mkdir
+		      Perl_my_sigaction
+		      Perl_my_symlink
+		      Perl_my_time
+		      Perl_my_tmpfile
+		      Perl_my_trnlnm
+		      Perl_my_utime
+		      Perl_my_waitpid
+		      Perl_opendir
+		      Perl_pathify_dirspec
+		      Perl_pathify_dirspec_ts
+		      Perl_pathify_dirspec_utf8
+		      Perl_pathify_dirspec_utf8_ts
+		      Perl_readdir
+		      Perl_readdir_r
+		      Perl_rename
+		      Perl_rmscopy
+		      Perl_rmsexpand
+		      Perl_rmsexpand_ts
+		      Perl_rmsexpand_utf8
+		      Perl_rmsexpand_utf8_ts
+		      Perl_seekdir
+		      Perl_sig_to_vmscondition
+		      Perl_telldir
+		      Perl_tounixpath
+		      Perl_tounixpath_ts
+		      Perl_tounixpath_utf8
+		      Perl_tounixpath_utf8_ts
+		      Perl_tounixspec
+		      Perl_tounixspec_ts
+		      Perl_tounixspec_utf8
+		      Perl_tounixspec_utf8_ts
+		      Perl_tovmspath
+		      Perl_tovmspath_ts
+		      Perl_tovmspath_utf8
+		      Perl_tovmspath_utf8_ts
+		      Perl_tovmsspec
+		      Perl_tovmsspec_ts
+		      Perl_tovmsspec_utf8
+		      Perl_tovmsspec_utf8_ts
+		      Perl_trim_unixpath
+		      Perl_vms_case_tolerant
+		      Perl_vms_do_aexec
+		      Perl_vms_do_exec
+		      Perl_vms_image_init
+		      Perl_vms_realpath
+		      Perl_vmssetenv
+		      Perl_vmssetuserlnm
+		      Perl_vmstrnenv
+		      PerlIO_openn
+		 ));
+}
+elsif ($ARGS{PLATFORM} eq 'os2') {
+    try_symbols(qw(
+		      ctermid
+		      get_sysinfo
+		      Perl_OS2_init
+		      Perl_OS2_init3
+		      Perl_OS2_term
+		      OS2_Perl_data
+		      dlopen
+		      dlsym
+		      dlerror
+		      dlclose
+		      dup2
+		      dup
+		      my_tmpfile
+		      my_tmpnam
+		      my_flock
+		      my_rmdir
+		      my_mkdir
+		      my_getpwuid
+		      my_getpwnam
+		      my_getpwent
+		      my_setpwent
+		      my_endpwent
+		      fork_with_resources
+		      croak_with_os2error
+		      setgrent
+		      endgrent
+		      getgrent
+		      malloc_mutex
+		      threads_mutex
+		      nthreads
+		      nthreads_cond
+		      os2_cond_wait
+		      os2_stat
+		      os2_execname
+		      async_mssleep
+		      msCounter
+		      InfoTable
+		      pthread_join
+		      pthread_create
+		      pthread_detach
+		      XS_Cwd_change_drive
+		      XS_Cwd_current_drive
+		      XS_Cwd_extLibpath
+		      XS_Cwd_extLibpath_set
+		      XS_Cwd_sys_abspath
+		      XS_Cwd_sys_chdir
+		      XS_Cwd_sys_cwd
+		      XS_Cwd_sys_is_absolute
+		      XS_Cwd_sys_is_relative
+		      XS_Cwd_sys_is_rooted
+		      XS_DynaLoader_mod2fname
+		      XS_File__Copy_syscopy
+		      Perl_Register_MQ
+		      Perl_Deregister_MQ
+		      Perl_Serve_Messages
+		      Perl_Process_Messages
+		      init_PMWIN_entries
+		      PMWIN_entries
+		      Perl_hab_GET
+		      loadByOrdinal
+		      pExtFCN
+		      os2error
+		      ResetWinError
+		      CroakWinError
+		      PL_do_undump
+		 ));
+}
+elsif ($ARGS{PLATFORM} eq 'netware') {
+    try_symbols(qw(
+			Perl_init_os_extras
+			Perl_thread_create
+			Perl_nw5_init
+			RunPerl
+			AllocStdPerl
+			FreeStdPerl
+			do_spawn2
+			do_aspawn
+			nw_uname
+			nw_stdin
+			nw_stdout
+			nw_stderr
+			nw_feof
+			nw_ferror
+			nw_fopen
+			nw_fclose
+			nw_clearerr
+			nw_getc
+			nw_fgets
+			nw_fputc
+			nw_fputs
+			nw_fflush
+			nw_ungetc
+			nw_fileno
+			nw_fdopen
+			nw_freopen
+			nw_fread
+			nw_fwrite
+			nw_setbuf
+			nw_setvbuf
+			nw_vfprintf
+			nw_ftell
+			nw_fseek
+			nw_rewind
+			nw_tmpfile
+			nw_fgetpos
+			nw_fsetpos
+			nw_dup
+			nw_access
+			nw_chmod
+			nw_chsize
+			nw_close
+			nw_dup2
+			nw_flock
+			nw_isatty
+			nw_link
+			nw_lseek
+			nw_stat
+			nw_mktemp
+			nw_open
+			nw_read
+			nw_rename
+			nw_setmode
+			nw_unlink
+			nw_utime
+			nw_write
+			nw_chdir
+			nw_rmdir
+			nw_closedir
+			nw_opendir
+			nw_readdir
+			nw_rewinddir
+			nw_seekdir
+			nw_telldir
+			nw_htonl
+			nw_htons
+			nw_ntohl
+			nw_ntohs
+			nw_accept
+			nw_bind
+			nw_connect
+			nw_endhostent
+			nw_endnetent
+			nw_endprotoent
+			nw_endservent
+			nw_gethostbyaddr
+			nw_gethostbyname
+			nw_gethostent
+			nw_gethostname
+			nw_getnetbyaddr
+			nw_getnetbyname
+			nw_getnetent
+			nw_getpeername
+			nw_getprotobyname
+			nw_getprotobynumber
+			nw_getprotoent
+			nw_getservbyname
+			nw_getservbyport
+			nw_getservent
+			nw_getsockname
+			nw_getsockopt
+			nw_inet_addr
+			nw_listen
+			nw_socket
+			nw_recv
+			nw_recvfrom
+			nw_select
+			nw_send
+			nw_sendto
+			nw_sethostent
+			nw_setnetent
+			nw_setprotoent
+			nw_setservent
+			nw_setsockopt
+			nw_inet_ntoa
+			nw_shutdown
+			nw_crypt
+			nw_execvp
+			nw_kill
+			nw_Popen
+			nw_Pclose
+			nw_Pipe
+			nw_times
+			nw_waitpid
+			nw_getpid
+			nw_spawnvp
+			nw_os_id
+			nw_open_osfhandle
+			nw_get_osfhandle
+			nw_abort
+			nw_sleep
+			nw_wait
+			nw_dynaload
+			nw_strerror
+			fnFpSetMode
+			fnInsertHashListAddrs
+			fnGetHashListAddrs
+			Perl_deb
+			Perl_sv_setsv
+			Perl_sv_catsv
+			Perl_sv_catpvn
+			Perl_sv_2pv
+			nw_freeenviron
+			Remove_Thread_Ctx
+		 ));
+}
+
+# When added this code was only run for Win32 and WinCE
+# Currently only Win32 links static extensions into the shared library.
+# The WinCE makefile doesn't appear to support static extensions, so this code
+# can't have any effect there.
+# The NetWare Makefile doesn't support static extensions (and hardcodes the
+# list of dynamic extensions, and the rules to build them)
+# For *nix (and presumably OS/2) with a shared libperl, Makefile.SH compiles
+# static extensions with -fPIC, but links them to perl, not libperl.so
+# The VMS build scripts don't yet implement static extensions at all.
+
+if ($ARGS{PLATFORM} =~ /^win(?:32|ce)$/) {
+    # records of type boot_module for statically linked modules (except Dynaloader)
+    my $static_ext = $Config{static_ext} // "";
+    $static_ext =~ s/\//__/g;
+    $static_ext =~ s/\bDynaLoader\b//;
+    try_symbols(map {"boot_$_"} grep {/\S/} split /\s+/, $static_ext);
+    try_symbols("init_Win32CORE") if $static_ext =~ /\bWin32CORE\b/;
+}
+
+if ($ARGS{PLATFORM} eq 'os2') {
+    my (%mapped, @missing);
+    open MAP, 'miniperl.map' or die 'Cannot read miniperl.map';
+    /^\s*[\da-f:]+\s+(\w+)/i and $mapped{$1}++ foreach <MAP>;
+    close MAP or die 'Cannot close miniperl.map';
+
+    @missing = grep { !exists $mapped{$_} }
+		    keys %export;
+    @missing = grep { !exists $exportperlmalloc{$_} } @missing;
+    delete $export{$_} foreach @missing;
+}
+
+###############################################################################
+
+# Now all symbols should be defined because next we are going to output them.
+
+# Start with platform specific headers:
+
+if ($ARGS{PLATFORM} =~ /^win(?:32|ce)$/) {
+    my $dll = $define{PERL_DLL} ? $define{PERL_DLL} =~ s/\.dll$//ir
+	: "perl$Config{api_revision}$Config{api_version}";
+    print "LIBRARY $dll\n";
+    # The DESCRIPTION module definition file statement is not supported
+    # by VC7 onwards.
+    if ($ARGS{CCTYPE} =~ /^(?:MSVC60|GCC)$/) {
+	print "DESCRIPTION 'Perl interpreter'\n";
+    }
+    print "EXPORTS\n";
+}
+elsif ($ARGS{PLATFORM} eq 'os2') {
+    (my $v = $]) =~ s/(\d\.\d\d\d)(\d\d)$/$1_$2/;
+    $v .= '-thread' if $Config{archname} =~ /-thread/;
+    (my $dll = $define{PERL_DLL}) =~ s/\.dll$//i;
+    $v .= "\@$Config{perl_patchlevel}" if $Config{perl_patchlevel};
+    my $d = "DESCRIPTION '\@#perl5-porters\@perl.org:$v#\@ Perl interpreter, configured as $Config{config_args}'";
+    $d = substr($d, 0, 249) . "...'" if length $d > 253;
+    print <<"---EOP---";
+LIBRARY '$dll' INITINSTANCE TERMINSTANCE
+$d
+STACKSIZE 32768
+CODE LOADONCALL
+DATA LOADONCALL NONSHARED MULTIPLE
+EXPORTS
+---EOP---
+}
+elsif ($ARGS{PLATFORM} eq 'aix') {
+    my $OSVER = `uname -v`;
+    chop $OSVER;
+    my $OSREL = `uname -r`;
+    chop $OSREL;
+    if ($OSVER > 4 || ($OSVER == 4 && $OSREL >= 3)) {
+	print "#! ..\n";
+    } else {
+	print "#!\n";
+    }
+}
+elsif ($ARGS{PLATFORM} eq 'netware') {
+	if ($ARGS{FILETYPE} eq 'def') {
+	print "LIBRARY perl$Config{api_revision}$Config{api_version}\n";
+	print "DESCRIPTION 'Perl interpreter for NetWare'\n";
+	print "EXPORTS\n";
+	}
+}
+
+# Then the symbols
+
+my @symbols = $fold ? sort {lc $a cmp lc $b} keys %export : sort keys %export;
+foreach my $symbol (@symbols) {
+    if (PLATFORM eq 'win32' || PLATFORM eq 'wince') {
+	# Remembering the origin file of each symbol is an alternative to PL_ matching
+	if (substr($symbol, 0, 3) eq 'PL_') {
+	    print "\t$symbol DATA\n";
+	}
+	else {
+	    print "\t$symbol\n";
+	}
+    }
+    elsif (PLATFORM eq 'os2') {
+	printf qq(    %-31s \@%s\n),
+	  qq("$symbol"), $ordinal{$symbol} || ++$sym_ord;
+	printf qq(    %-31s \@%s\n),
+	  qq("$exportperlmalloc{$symbol}" = "$symbol"),
+	  $ordinal{$exportperlmalloc{$symbol}} || ++$sym_ord
+	  if $exportperlmalloc and exists $exportperlmalloc{$symbol};
+    }
+    elsif (PLATFORM eq 'netware') {
+	print "\t$symbol,\n";
+    } else {
+	print "$symbol\n";
+    }
+}
+
+# Then platform specific footers.
+
+if ($ARGS{PLATFORM} eq 'os2') {
+    print <<EOP;
+    dll_perlmain=main
+    fill_extLibpath
+    dir_subst
+    Perl_OS2_handler_install
+
+; LAST_ORDINAL=$sym_ord
+EOP
+}
+
+1;