aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/cc/dcl.c9
-rw-r--r--src/cmd/cc/lex.c2
-rw-r--r--src/cmd/cgo/out.go13
-rw-r--r--src/cmd/dist/buildruntime.c2
-rw-r--r--src/cmd/ld/data.c1
5 files changed, 24 insertions, 3 deletions
diff --git a/src/cmd/cc/dcl.c b/src/cmd/cc/dcl.c
index 292717d688..117508fd6d 100644
--- a/src/cmd/cc/dcl.c
+++ b/src/cmd/cc/dcl.c
@@ -30,6 +30,9 @@
#include <u.h>
#include "cc.h"
+#include "../ld/textflag.h"
+
+static int haspointers(Type*);
Node*
dodecl(void (*f)(int,Type*,Sym*), int c, Type *t, Node *n)
@@ -123,7 +126,8 @@ loop:
if(dataflag) {
s->dataflag = dataflag;
dataflag = 0;
- }
+ } else if(s->type != T && !haspointers(s->type))
+ s->dataflag = NOPTR;
firstbit = 0;
n->sym = s;
n->type = s->type;
@@ -568,9 +572,8 @@ haspointers(Type *t)
return 0;
case TARRAY:
return haspointers(t->link);
- case TFUNC:
case TIND:
- return 1;
+ return t->link->etype != TFUNC;
default:
return 0;
}
diff --git a/src/cmd/cc/lex.c b/src/cmd/cc/lex.c
index 55fc36b1e0..7c9f718c09 100644
--- a/src/cmd/cc/lex.c
+++ b/src/cmd/cc/lex.c
@@ -31,6 +31,7 @@
#include <u.h>
#include "cc.h"
#include "y.tab.h"
+#include "../ld/textflag.h"
#ifndef CPP
#define CPP "cpp"
@@ -1317,6 +1318,7 @@ cinit(void)
t->width = 0;
symstring = slookup(".string");
symstring->class = CSTATIC;
+ symstring->dataflag = NOPTR;
symstring->type = t;
t = typ(TARRAY, types[TCHAR]);
diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go
index 6586531ada..2d14f766fc 100644
--- a/src/cmd/cgo/out.go
+++ b/src/cmd/cgo/out.go
@@ -129,6 +129,7 @@ func (p *Package) writeDefs() {
fmt.Fprintf(fc, `extern void *%s __asm__("%s.%s");`, n.Mangle, gccgoSymbolPrefix, n.Mangle)
fmt.Fprintf(&gccgoInit, "\t%s = %s%s;\n", n.Mangle, amp, n.C)
} else {
+ fmt.Fprintf(fc, "#pragma dataflag NOPTR /* C pointer, not heap pointer */ \n")
fmt.Fprintf(fc, "void *·%s = %s%s;\n", n.Mangle, amp, n.C)
}
fmt.Fprintf(fc, "\n")
@@ -397,6 +398,7 @@ func (p *Package) writeDefsFunc(fc, fgo2 *os.File, n *Name) {
// C wrapper calls into gcc, passing a pointer to the argument frame.
fmt.Fprintf(fc, "#pragma cgo_import_static %s\n", cname)
fmt.Fprintf(fc, "void %s(void*);\n", cname)
+ fmt.Fprintf(fc, "#pragma dataflag NOPTR\n")
fmt.Fprintf(fc, "void *·%s = %s;\n", cname, cname)
nret := 0
@@ -1151,20 +1153,31 @@ void *_CMalloc(size_t);
const cProlog = `
#include "runtime.h"
#include "cgocall.h"
+#include "textflag.h"
+#pragma dataflag NOPTR
static void *cgocall_errno = runtime·cgocall_errno;
+#pragma dataflag NOPTR
void *·_cgo_runtime_cgocall_errno = &cgocall_errno;
+#pragma dataflag NOPTR
static void *runtime_gostring = runtime·gostring;
+#pragma dataflag NOPTR
void *·_cgo_runtime_gostring = &runtime_gostring;
+#pragma dataflag NOPTR
static void *runtime_gostringn = runtime·gostringn;
+#pragma dataflag NOPTR
void *·_cgo_runtime_gostringn = &runtime_gostringn;
+#pragma dataflag NOPTR
static void *runtime_gobytes = runtime·gobytes;
+#pragma dataflag NOPTR
void *·_cgo_runtime_gobytes = &runtime_gobytes;
+#pragma dataflag NOPTR
static void *runtime_cmalloc = runtime·cmalloc;
+#pragma dataflag NOPTR
void *·_cgo_runtime_cmalloc = &runtime_cmalloc;
void ·_Cerrno(void*, int32);
diff --git a/src/cmd/dist/buildruntime.c b/src/cmd/dist/buildruntime.c
index 1257d5b811..bb774e05fc 100644
--- a/src/cmd/dist/buildruntime.c
+++ b/src/cmd/dist/buildruntime.c
@@ -330,9 +330,11 @@ mkzsys(char *dir, char *file)
static char *runtimedefs[] = {
"defs.c",
"malloc.c",
+ "mcache.c",
"mgc0.c",
"proc.c",
"parfor.c",
+ "stack.c",
};
// mkzruntimedefs writes zruntime_defs_$GOOS_$GOARCH.h,
diff --git a/src/cmd/ld/data.c b/src/cmd/ld/data.c
index 71624c3304..9d224d9eb9 100644
--- a/src/cmd/ld/data.c
+++ b/src/cmd/ld/data.c
@@ -818,6 +818,7 @@ proggenaddsym(ProgGen *g, LSym *s)
if(s->gotype == nil && s->size >= PtrSize) {
// conservative scan
+ diag("missing Go type information for global symbol: %s", s->name);
if((s->size%PtrSize) || (g->pos%PtrSize))
diag("proggenaddsym: unaligned conservative symbol %s: size=%lld pos=%lld",
s->name, s->size, g->pos);