aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorKai Backman <kaib@golang.org>2009-12-17 16:08:42 -0800
committerKai Backman <kaib@golang.org>2009-12-17 16:08:42 -0800
commitd85bb81878c06867e1bc7130ffa3db129b32f0f2 (patch)
treed273c4b57a73dc3ace6b68a47038e315b3a1a9a6 /src/cmd
parent4ddcb0ea738c181070039db8d9fed9f81958424c (diff)
downloadgo-d85bb81878c06867e1bc7130ffa3db129b32f0f2.tar.xz
first stub for softfloats, intercepts float instructions and skips
them in the stream. R=rsc https://golang.org/cl/174052
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/5l/Makefile1
-rw-r--r--src/cmd/5l/l.h1
-rw-r--r--src/cmd/5l/obj.c13
-rw-r--r--src/cmd/5l/softfloat.c70
-rw-r--r--src/cmd/ld/go.c3
-rw-r--r--src/cmd/ld/lib.h2
6 files changed, 87 insertions, 3 deletions
diff --git a/src/cmd/5l/Makefile b/src/cmd/5l/Makefile
index be866b87a4..aa175d14c6 100644
--- a/src/cmd/5l/Makefile
+++ b/src/cmd/5l/Makefile
@@ -17,6 +17,7 @@ OFILES=\
optab.$O\
pass.$O\
thumb.$O\
+ softfloat.$O\
span.$O\
go.$O\
diff --git a/src/cmd/5l/l.h b/src/cmd/5l/l.h
index 05a20bad36..ba2de0a0f2 100644
--- a/src/cmd/5l/l.h
+++ b/src/cmd/5l/l.h
@@ -451,6 +451,7 @@ void putsymb(char*, int, int32, int);
int32 regoff(Adr*);
int relinv(int);
int32 rnd(int32, int32);
+void softfloat(void);
void span(void);
void strnput(char*, int);
void undef(void);
diff --git a/src/cmd/5l/obj.c b/src/cmd/5l/obj.c
index 805d39544e..8fd39c2919 100644
--- a/src/cmd/5l/obj.c
+++ b/src/cmd/5l/obj.c
@@ -71,6 +71,12 @@ isobjfile(char *f)
return v;
}
+static char*
+linkername[] =
+{
+ "runtime·softfloat",
+};
+
void
usage(void)
{
@@ -81,7 +87,7 @@ usage(void)
void
main(int argc, char *argv[])
{
- int c;
+ int c, i;
Binit(&bso, 1, OWRITE);
cout = -1;
@@ -257,6 +263,10 @@ main(int argc, char *argv[])
if(!debug['l'])
loadlib();
+ // mark some functions that are only referenced after linker code editing
+ // TODO(kaib): this doesn't work, the prog can't be found in runtime
+ for(i=0; i<nelem(linkername); i++)
+ mark(lookup(linkername[i], 0));
deadcode();
firstp = firstp->link;
@@ -294,6 +304,7 @@ main(int argc, char *argv[])
follow();
if(firstp == P)
goto out;
+ softfloat();
noops();
span();
asmb();
diff --git a/src/cmd/5l/softfloat.c b/src/cmd/5l/softfloat.c
new file mode 100644
index 0000000000..f5a146feb0
--- /dev/null
+++ b/src/cmd/5l/softfloat.c
@@ -0,0 +1,70 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#define EXTERN
+#include "l.h"
+
+void
+softfloat()
+{
+ Prog *p, *prev, *psfloat;
+ Sym *symsfloat;
+ int wasfloat;
+
+ symsfloat = lookup("_sfloat", 0);
+ psfloat = P;
+ if(symsfloat->type == STEXT)
+ for(p = firstp; p != P; p = p->link) {
+ if(p->as == ATEXT) {
+ if(p->from.sym == symsfloat) {
+ psfloat = p;
+ break;
+ }
+ }
+ }
+
+ wasfloat = 0;
+ p = firstp;
+ prev = P;
+ for(p = firstp; p != P; p = p->link) {
+ switch(p->as) {
+ case AMOVWD:
+ case AMOVWF:
+ case AMOVDW:
+ case AMOVFW:
+ case AMOVFD:
+ case AMOVDF:
+ case AMOVF:
+ case AMOVD:
+ case ACMPF:
+ case ACMPD:
+ case AADDF:
+ case AADDD:
+ case ASUBF:
+ case ASUBD:
+ case AMULF:
+ case AMULD:
+ case ADIVF:
+ case ADIVD:
+ if (psfloat == P)
+ diag("floats used with _sfloat not defined");
+ if (!wasfloat) {
+ if (prev == P)
+ diag("float instruction without predecessor TEXT");
+ // BL _sfloat(SB)
+ prev = appendp(prev);
+ prev->as = ABL;
+ prev->to.type = D_BRANCH;
+ prev->to.sym = symsfloat;
+ prev->cond = psfloat;
+
+ wasfloat = 1;
+ }
+ break;
+ default:
+ wasfloat = 0;
+ }
+ prev = p;
+ }
+}
diff --git a/src/cmd/ld/go.c b/src/cmd/ld/go.c
index 8f0e66d330..9a9346c1f2 100644
--- a/src/cmd/ld/go.c
+++ b/src/cmd/ld/go.c
@@ -364,7 +364,6 @@ err:
nerrors++;
}
-static void mark(Sym*);
static int markdepth;
static void
@@ -408,7 +407,7 @@ marktext(Prog *p)
markdepth--;
}
-static void
+void
mark(Sym *s)
{
if(s == S || s->reachable)
diff --git a/src/cmd/ld/lib.h b/src/cmd/ld/lib.h
index 0ae4106b8a..4a300ac4e9 100644
--- a/src/cmd/ld/lib.h
+++ b/src/cmd/ld/lib.h
@@ -77,6 +77,8 @@ void usage(void);
void ldobj1(Biobuf *f, int64 len, char *pn);
void ldobj(Biobuf*, int64, char*);
void ldpkg(Biobuf*, int64, char*);
+void mark(Sym *s);
+
int pathchar(void);
void* mal(uint32);