diff options
author | Lukas Larsson <[email protected]> | 2013-08-13 17:14:11 +0200 |
---|---|---|
committer | Lukas Larsson <[email protected]> | 2013-08-21 15:20:04 +0200 |
commit | 20e0509d4e04fada3019639bc82d78b89f06b0fc (patch) | |
tree | d780872721c18782e4bdb7d9fc0f340363acbe38 /erts/emulator/utils | |
parent | a27e9776c839aa9fed9e71e3d06a33720377e293 (diff) | |
download | otp-20e0509d4e04fada3019639bc82d78b89f06b0fc.tar.gz otp-20e0509d4e04fada3019639bc82d78b89f06b0fc.tar.bz2 otp-20e0509d4e04fada3019639bc82d78b89f06b0fc.zip |
erts: Add option to include nifs statically
Both crypto and asn1 are supported.
Diffstat (limited to 'erts/emulator/utils')
-rwxr-xr-x | erts/emulator/utils/make_driver_tab | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/erts/emulator/utils/make_driver_tab b/erts/emulator/utils/make_driver_tab index fbbfa3e49e..06928a3a4a 100755 --- a/erts/emulator/utils/make_driver_tab +++ b/erts/emulator/utils/make_driver_tab @@ -27,7 +27,9 @@ use File::Basename; # usage: make_driver_tab [-o filename] drivers... my $file = ""; +my $nif = ""; my @drivers = (); +my @nifs = (); while (@ARGV) { my $d = shift; @@ -35,6 +37,12 @@ while (@ARGV) { $file = shift or die("-o requires argument"); next; } + if ( $d =~ /^.*\.a$/ ) { + $d = basename $d; + $d =~ s/\.a$//; # strip .a + push(@nifs, $d); + next; + } $d = basename $d; $d =~ s/drv(\..*|)$//; # strip drv.* or just drv push(@drivers, $d); @@ -52,6 +60,7 @@ print <<EOF; #include <stdio.h> #include "global.h" + EOF # "extern" declarations @@ -68,4 +77,50 @@ foreach (@drivers) { print " NULL\n};\n"; +print <<EOF; + +typedef struct ErtsStaticNifEntry_ { + const char *nif_name; + ErtsStaticNifInitFPtr nif_init; +} ErtsStaticNifEntry; + +EOF + +# prototypes +foreach (@nifs) { + my $d = ${_}; + $d =~ s/\.debug//; # strip .debug + print "void *".$d."_nif_init(void);\n"; +} + +# The array itself +print "static ErtsStaticNifEntry static_nif_tab[DRIVER_TAB_SIZE] =\n{\n"; + +foreach (@nifs) { + my $d = ${_}; + $d =~ s/\.debug//; # strip .debug + print "{\"${_}\",&".$d."_nif_init},\n"; +} + +print " {NULL,NULL}\n};\n"; + +print <<EOF; +ErtsStaticNifInitFPtr erts_static_nif_get_nif_init(const char *name) { + int i; + for (i = 0; static_nif_tab[i].nif_name != NULL; i++) + if (strcmp(name,static_nif_tab[i].nif_name) == 0) + return static_nif_tab[i].nif_init; + return NULL; +} + +int erts_is_static_nif(void *handle) { + int i; + for (i = 0; static_nif_tab[i].nif_name != NULL; i++) + if (((void*)static_nif_tab[i].nif_init) == handle) + return 1; + return 0; +} + +EOF + # That's it |