summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Backman <kaib@golang.org>2009-10-06 19:00:30 -0700
committerKai Backman <kaib@golang.org>2009-10-06 19:00:30 -0700
commit8ab2c7dcea85c6d4b9b7b89af78d05296a3791af (patch)
treef0b966e703fefc9e0fd43eba678feb41e8210d08
parent946391183d470bf28ca97e2f5815dbf4eb12eec2 (diff)
downloadgolang-8ab2c7dcea85c6d4b9b7b89af78d05296a3791af.tar.gz
5l library loading, 64 bit entry points
R=rsc APPROVED=rsc DELTA=58 (52 added, 3 deleted, 3 changed) OCL=35417 CL=35417
-rw-r--r--src/cmd/5l/obj.c37
-rwxr-xr-xsrc/pkg/runtime/arm/vlrt.c24
2 files changed, 55 insertions, 6 deletions
diff --git a/src/cmd/5l/obj.c b/src/cmd/5l/obj.c
index ff9e66770..f1747fc93 100644
--- a/src/cmd/5l/obj.c
+++ b/src/cmd/5l/obj.c
@@ -41,6 +41,8 @@ char *noname = "<none>";
char symname[] = SYMDEF;
char thechar = '5';
char *thestring = "arm";
+char* libdir[16]; // contains "." first, goroot last
+int nlibdir = 0;
/*
* -H1 -T0x10005000 -R4 is aif for risc os
@@ -89,6 +91,7 @@ main(int argc, char *argv[])
INITDAT = -1;
INITRND = -1;
INITENTRY = 0;
+ libdir[nlibdir++] = "."; // look in dot first
ARGBEGIN {
default:
@@ -104,6 +107,12 @@ main(int argc, char *argv[])
if(a)
INITENTRY = a;
break;
+ case 'L':
+ if(nlibdir >= nelem(libdir)-1) {
+ print("too many -L's: %d\n", nlibdir);
+ }
+ libdir[nlibdir++] = ARGF();
+ break;
case 'T':
a = ARGF();
if(a)
@@ -148,6 +157,9 @@ main(int argc, char *argv[])
if(strcmp(goarch, thestring) != 0)
print("goarch is not known: %s\n", goarch);
+ // put goroot in the libdir list.
+ libdir[nlibdir++] = smprint("%s/pkg/%s_%s", goroot, goos, goarch);
+
if(!debug['9'] && !debug['U'] && !debug['B'])
debug[DEFAULT] = 1;
if(HEADTYPE == -1) {
@@ -593,12 +605,13 @@ zaddr(Biobuf *f, Adr *a, Sym *h[])
void
addlib(char *obj)
{
- char name[1024], comp[256], *p;
- int i;
+ char name[1024], pname[1024], comp[256], *p;
+ int i, search;
if(histfrogp <= 0)
return;
+ search = 0;
if(histfrog[0]->name[1] == '/') {
sprint(name, "");
i = 1;
@@ -607,11 +620,9 @@ addlib(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++) {
@@ -641,6 +652,20 @@ addlib(char *obj)
strcat(name, "/");
strcat(name, comp);
}
+
+ if(search) {
+ // try dot, -L "libdir", and then goroot.
+ for(i=0; i<nlibdir; i++) {
+ snprint(pname, sizeof pname, "%s/%s", libdir[i], name);
+ if(access(pname, AEXIST) >= 0)
+ break;
+ }
+ strcpy(name, pname);
+ }
+ cleanname(name);
+ if(debug['v'])
+ Bprint(&bso, "%5.2f addlib: %s pulls in %s\n", cputime(), obj, name);
+
for(i=0; i<libraryp; i++)
if(strcmp(name, library[i]) == 0)
return;
diff --git a/src/pkg/runtime/arm/vlrt.c b/src/pkg/runtime/arm/vlrt.c
index 6f695b3eb..03840f1f6 100755
--- a/src/pkg/runtime/arm/vlrt.c
+++ b/src/pkg/runtime/arm/vlrt.c
@@ -237,6 +237,12 @@ _divvu(Vlong *q, Vlong n, Vlong d)
}
void
+sys·uint64div(Vlong n, Vlong d, Vlong q)
+{
+ _divvu(&q, n, d);
+}
+
+void
_modvu(Vlong *r, Vlong n, Vlong d)
{
@@ -248,6 +254,12 @@ _modvu(Vlong *r, Vlong n, Vlong d)
dodiv(n, d, 0, r);
}
+void
+sys·uint64mod(Vlong n, Vlong d, Vlong q)
+{
+ _modvu(&q, n, d);
+}
+
static void
vneg(Vlong *v)
{
@@ -282,6 +294,12 @@ _divv(Vlong *q, Vlong n, Vlong d)
}
void
+sys·int64div(Vlong n, Vlong d, Vlong q)
+{
+ _divv(&q, n, d);
+}
+
+void
_modv(Vlong *r, Vlong n, Vlong d)
{
long nneg, dneg;
@@ -303,6 +321,12 @@ _modv(Vlong *r, Vlong n, Vlong d)
}
void
+sys·int64mod(Vlong n, Vlong d, Vlong q)
+{
+ _modv(&q, n, d);
+}
+
+void
_rshav(Vlong *r, Vlong a, int b)
{
long t;