aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/utils
diff options
context:
space:
mode:
authorLukas Larsson <[email protected]>2013-08-13 17:14:11 +0200
committerLukas Larsson <[email protected]>2013-08-21 15:20:04 +0200
commit20e0509d4e04fada3019639bc82d78b89f06b0fc (patch)
treed780872721c18782e4bdb7d9fc0f340363acbe38 /erts/emulator/utils
parenta27e9776c839aa9fed9e71e3d06a33720377e293 (diff)
downloadotp-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-xerts/emulator/utils/make_driver_tab55
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