diff options
| author | Kai Backman <kaib@golang.org> | 2009-12-17 16:08:42 -0800 |
|---|---|---|
| committer | Kai Backman <kaib@golang.org> | 2009-12-17 16:08:42 -0800 |
| commit | d85bb81878c06867e1bc7130ffa3db129b32f0f2 (patch) | |
| tree | d273c4b57a73dc3ace6b68a47038e315b3a1a9a6 /src/cmd | |
| parent | 4ddcb0ea738c181070039db8d9fed9f81958424c (diff) | |
| download | go-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/Makefile | 1 | ||||
| -rw-r--r-- | src/cmd/5l/l.h | 1 | ||||
| -rw-r--r-- | src/cmd/5l/obj.c | 13 | ||||
| -rw-r--r-- | src/cmd/5l/softfloat.c | 70 | ||||
| -rw-r--r-- | src/cmd/ld/go.c | 3 | ||||
| -rw-r--r-- | src/cmd/ld/lib.h | 2 |
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); |
