summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-06-02 22:33:21 -0700
committerRuss Cox <rsc@golang.org>2009-06-02 22:33:21 -0700
commit3c5a27e8189158acc07003c14cfb160bedf7ad19 (patch)
treed1c05120af52521ce7178f67fcd08e40a7d18561
parent92424be483a5fc0223c5e27e95a8e4696f203fa4 (diff)
downloadgolang-3c5a27e8189158acc07003c14cfb160bedf7ad19.tar.gz
8l fixes, cut and paste from 6l.
move PtrSize value into 6l/8l files. R=r DELTA=78 (47 added, 15 deleted, 16 changed) OCL=29729 CL=29798
-rw-r--r--src/cmd/6l/go.c4
-rw-r--r--src/cmd/6l/obj.c6
-rw-r--r--src/cmd/8l/asm.c16
-rw-r--r--src/cmd/8l/go.c10
-rw-r--r--src/cmd/8l/l.h1
-rw-r--r--src/cmd/8l/obj.c62
-rw-r--r--src/cmd/ld/go.c1
7 files changed, 68 insertions, 32 deletions
diff --git a/src/cmd/6l/go.c b/src/cmd/6l/go.c
index 82a216520..08c3c8c36 100644
--- a/src/cmd/6l/go.c
+++ b/src/cmd/6l/go.c
@@ -3,4 +3,8 @@
// license that can be found in the LICENSE file.
#include "l.h"
+enum
+{
+ PtrSize = 8
+};
#include "../ld/go.c"
diff --git a/src/cmd/6l/obj.c b/src/cmd/6l/obj.c
index 31fb978e1..5ab1c561c 100644
--- a/src/cmd/6l/obj.c
+++ b/src/cmd/6l/obj.c
@@ -137,10 +137,8 @@ main(int argc, char *argv[])
break;
} ARGEND
USED(argc);
- if(*argv == 0) {
- diag("usage: 6l [-options] objects");
- errorexit();
- }
+ if(*argv == 0)
+ usage();
mywhatsys(); // get goroot, goarch, goos
if(strcmp(goarch, thestring) != 0)
diff --git a/src/cmd/8l/asm.c b/src/cmd/8l/asm.c
index 8dd444afa..e65d48def 100644
--- a/src/cmd/8l/asm.c
+++ b/src/cmd/8l/asm.c
@@ -416,7 +416,7 @@ asmb(void)
wputl(0x003E); /* reloc table offset */
wputl(0x0000); /* overlay number */
break;
-
+
case 6:
/* apple MACH */
va = 4096;
@@ -766,6 +766,20 @@ datblk(int32 s, int32 n)
l++;
}
break;
+
+ case D_SBIG:
+ if(debug['a'] && i == 0) {
+ Bprint(&bso, pcstr, l+s+INITDAT);
+ for(j=0; j<c; j++)
+ Bprint(&bso, "%.2ux", p->to.scon[j] & 0xff);
+ Bprint(&bso, "\t%P\n", curp);
+ }
+ for(; i<c; i++) {
+ buf.dbuf[l] = p->to.sbig[i];
+ l++;
+ }
+ break;
+
default:
fl = p->to.offset;
if(p->to.type == D_ADDR) {
diff --git a/src/cmd/8l/go.c b/src/cmd/8l/go.c
new file mode 100644
index 000000000..a295fa5b4
--- /dev/null
+++ b/src/cmd/8l/go.c
@@ -0,0 +1,10 @@
+// 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.
+
+#include "l.h"
+enum
+{
+ PtrSize = 4
+};
+#include "../ld/go.c"
diff --git a/src/cmd/8l/l.h b/src/cmd/8l/l.h
index 9afd78faa..d06d050de 100644
--- a/src/cmd/8l/l.h
+++ b/src/cmd/8l/l.h
@@ -248,6 +248,7 @@ EXTERN int32 INITDAT;
EXTERN int32 INITRND;
EXTERN int32 INITTEXT;
EXTERN char* INITENTRY; /* entry point */
+EXTERN char* LIBDIR;
EXTERN Biobuf bso;
EXTERN int32 bsssize;
EXTERN int32 casepc;
diff --git a/src/cmd/8l/obj.c b/src/cmd/8l/obj.c
index a14f52d6f..14dba3e15 100644
--- a/src/cmd/8l/obj.c
+++ b/src/cmd/8l/obj.c
@@ -72,6 +72,13 @@ isobjfile(char *f)
}
void
+usage(void)
+{
+ fprint(2, "usage: 8l [-options] [-E entry] [-H head] [-L dir] [-T text] [-R rnd] [-o out] files...\n");
+ exits("usage");
+}
+
+void
main(int argc, char *argv[])
{
int i, c;
@@ -95,32 +102,26 @@ main(int argc, char *argv[])
debug[c]++;
break;
case 'o': /* output to (next arg) */
- outfile = ARGF();
+ outfile = EARGF(usage());
break;
case 'E':
- a = ARGF();
- if(a)
- INITENTRY = a;
+ INITENTRY = EARGF(usage());
break;
case 'H':
- a = ARGF();
- if(a)
- HEADTYPE = atolwhex(a);
+ HEADTYPE = atolwhex(EARGF(usage()));
+ break;
+ case 'L':
+ LIBDIR = EARGF(usage());
break;
case 'T':
- a = ARGF();
- if(a)
- INITTEXT = atolwhex(a);
+ INITTEXT = atolwhex(EARGF(usage()));
break;
case 'D':
- a = ARGF();
- if(a)
- INITDAT = atolwhex(a);
+ INITDAT = atolwhex(EARGF(usage()));
break;
case 'R':
- a = ARGF();
- if(a)
- INITRND = atolwhex(a);
+ INITRND = atolwhex(EARGF(usage()));
+ break;
break;
case 'x': /* produce export table */
doexp = 1;
@@ -135,10 +136,8 @@ main(int argc, char *argv[])
break;
} ARGEND
USED(argc);
- if(*argv == 0) {
- diag("usage: 8l [-options] objects");
- errorexit();
- }
+ if(*argv == 0)
+ usage();
whatsys(); // get goroot, goarch, goos
if(strcmp(goarch, thestring) != 0)
@@ -602,12 +601,13 @@ zaddr(Biobuf *f, Adr *a, Sym *h[])
void
addlib(char *src, char *obj)
{
- char name[1024], comp[256], *p, *q;
- int i;
+ char name[1024], pname[1024], comp[256], *p, *q;
+ int i, search;
if(histfrogp <= 0)
return;
+ search = 0;
if(histfrog[0]->name[1] == '/') {
sprint(name, "");
i = 1;
@@ -616,11 +616,9 @@ addlib(char *src, char *obj)
sprint(name, ".");
i = 0;
} else {
- if(debug['9'])
- sprint(name, "/%s/lib", thestring);
- else
- sprint(name, "/usr/%clib", thechar);
+ sprint(name, "");
i = 0;
+ search = 1;
}
for(; i<histfrogp; i++) {
@@ -650,6 +648,16 @@ addlib(char *src, char *obj)
strcat(name, "/");
strcat(name, comp);
}
+
+ if(search) {
+ // try dot, -L "libdir", and then goroot.
+ snprint(pname, sizeof pname, "./%s", name);
+ if(access(pname, AEXIST) < 0 && LIBDIR != nil)
+ snprint(pname, sizeof pname, "%s/%s", LIBDIR, name);
+ if(access(pname, AEXIST) < 0)
+ snprint(pname, sizeof pname, "%s/pkg/%s", goroot, name);
+ strcpy(name, pname);
+ }
if(debug['v'])
Bprint(&bso, "%5.2f addlib: %s %s pulls in %s\n", cputime(), obj, src, name);
@@ -976,6 +984,8 @@ loop:
}
if(p->to.offset > s->value)
s->value = p->to.offset;
+ if(p->from.scale & DUPOK)
+ s->dupok = 1;
goto loop;
case ADYNT:
diff --git a/src/cmd/ld/go.c b/src/cmd/ld/go.c
index d10d89b12..8ba7d12ce 100644
--- a/src/cmd/ld/go.c
+++ b/src/cmd/ld/go.c
@@ -465,7 +465,6 @@ definetypesigs(void)
qsort(all, n, sizeof all[0], symcmp);
// emit array as sequence of references.
- enum { PtrSize = 8 };
for(i=0; i<n; i++) {
prog = newdata(s, PtrSize*i, PtrSize, D_EXTERN);
prog->to.type = D_ADDR;