aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-09-19 23:28:45 -0400
committerRuss Cox <rsc@golang.org>2010-09-19 23:28:45 -0400
commit950ee183661ce8dd1dfe1bc0e85f384c849ab1a4 (patch)
tree62dc18890499f52e8c49d70914fb40cb2a86131a
parent33c4ff06693cc7b12e1b4f6a1250aa3d01016bfc (diff)
downloadgo-950ee183661ce8dd1dfe1bc0e85f384c849ab1a4.tar.gz
go-950ee183661ce8dd1dfe1bc0e85f384c849ab1a4.zip
syscall: fix NaCl
missing from last CL, sorry R=r CC=golang-dev https://golang.org/cl/2214043
-rwxr-xr-xsrc/pkg/syscall/mksyscall.sh17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/pkg/syscall/mksyscall.sh b/src/pkg/syscall/mksyscall.sh
index d63d9e69fa..d785823b14 100755
--- a/src/pkg/syscall/mksyscall.sh
+++ b/src/pkg/syscall/mksyscall.sh
@@ -16,6 +16,7 @@
$cmdline = "mksyscall.sh " . join(' ', @ARGV);
$errors = 0;
$_32bit = "";
+$nacl = 0;
if($ARGV[0] eq "-b32") {
$_32bit = "big-endian";
@@ -24,6 +25,10 @@ if($ARGV[0] eq "-b32") {
$_32bit = "little-endian";
shift;
}
+if($ARGV[0] eq "-nacl") {
+ $nacl = 1;
+ shift;
+}
if($ARGV[0] =~ /^-/) {
print STDERR "usage: mksyscall.sh [-b32 | -l32] [file ...]\n";
@@ -89,9 +94,15 @@ while(<>) {
# Convert slice into pointer, length.
# Have to be careful not to take address of &a[0] if len == 0:
# pass nil in that case.
- $text .= "\tvar _p$n *$1\n";
- $text .= "\tif len($name) > 0 {\n\t\t_p$n = \&${name}[0]\n\t}\n";
- push @args, "uintptr(unsafe.Pointer(_p$n))", "uintptr(len($name))";
+ $text .= "\tvar _p$n unsafe.Pointer\n";
+ $text .= "\tif len($name) > 0 {\n\t\t_p$n = unsafe.Pointer(\&${name}[0])\n\t}";
+ if($nacl) {
+ # NaCl rejects zero length write with nil pointer,
+ # so use non-nil pointer.
+ $text .= " else {\n\t\t_p$n = unsafe.Pointer(&_zero[0])\n\t}";
+ }
+ $text .= "\n";
+ push @args, "uintptr(_p$n)", "uintptr(len($name))";
$n++;
} elsif($type eq "int64" && $_32bit ne "") {
if($_32bit eq "big-endian") {