summaryrefslogtreecommitdiff
path: root/src/cmd/5l
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/5l')
-rw-r--r--src/cmd/5l/Makefile1
-rw-r--r--src/cmd/5l/asm.c13
-rw-r--r--src/cmd/5l/doc.go5
-rw-r--r--src/cmd/5l/l.h2
-rw-r--r--src/cmd/5l/noop.c14
-rw-r--r--src/cmd/5l/obj.c10
-rw-r--r--src/cmd/5l/optab.c4
-rw-r--r--src/cmd/5l/span.c2
8 files changed, 38 insertions, 13 deletions
diff --git a/src/cmd/5l/Makefile b/src/cmd/5l/Makefile
index 71798724b..c11ebe990 100644
--- a/src/cmd/5l/Makefile
+++ b/src/cmd/5l/Makefile
@@ -14,6 +14,7 @@ OFILES=\
enam.$O\
ldelf.$O\
ldmacho.$O\
+ ldpe.$O\
lib.$O\
list.$O\
noop.$O\
diff --git a/src/cmd/5l/asm.c b/src/cmd/5l/asm.c
index 7ceea59b6..34565629f 100644
--- a/src/cmd/5l/asm.c
+++ b/src/cmd/5l/asm.c
@@ -448,7 +448,9 @@ asmb(void)
sh->type = SHT_PROGBITS;
sh->flags = SHF_ALLOC;
sh->addralign = 1;
- elfinterp(sh, startva, linuxdynld);
+ if(interpreter == nil)
+ interpreter = linuxdynld;
+ elfinterp(sh, startva, interpreter);
ph = newElfPhdr();
ph->type = PT_INTERP;
@@ -793,7 +795,8 @@ if(debug['G']) print("%ux: %s: arm %d %d %d\n", (uint32)(p->pc), p->from.sym->na
rt = 0;
if(p->as == AMOVW || p->as == AMVN)
r = 0;
- else if(r == NREG)
+ else
+ if(r == NREG)
r = rt;
o1 |= rf | (r<<16) | (rt<<12);
break;
@@ -1558,6 +1561,10 @@ if(debug['G']) print("%ux: %s: arm %d %d %d\n", (uint32)(p->pc), p->from.sym->na
o1 |= (p->from.reg<<16);
o1 |= (p->to.reg<<12);
break;
+ case 90: /* tst reg */
+ o1 = oprrr(ACMP+AEND, p->scond);
+ o1 |= p->from.reg<<16;
+ break;
}
out[0] = o1;
@@ -1709,6 +1716,8 @@ oprrr(int a, int sc)
return o | (0xe<<24) | (0x0<<20) | (0xb<<8) | (1<<4);
case AMOVFW+AEND: // copy FtoW
return o | (0xe<<24) | (0x1<<20) | (0xb<<8) | (1<<4);
+ case ACMP+AEND: // cmp imm
+ return o | (0x3<<24) | (0x5<<20);
}
diag("bad rrr %d", a);
prasm(curp);
diff --git a/src/cmd/5l/doc.go b/src/cmd/5l/doc.go
index 6f7408116..d266b9233 100644
--- a/src/cmd/5l/doc.go
+++ b/src/cmd/5l/doc.go
@@ -20,6 +20,11 @@ Original options are listed in the link above.
Options new in this version:
+-F
+ Force use of software floating point.
+ Also implied by setting GOARM=5 in the environment.
+-I interpreter
+ Set the ELF dynamic linker to use.
-L dir1 -L dir2
Search for libraries (package files) in dir1, dir2, etc.
The default is the single location $GOROOT/pkg/$GOOS_arm.
diff --git a/src/cmd/5l/l.h b/src/cmd/5l/l.h
index 4e7ccea88..c31028416 100644
--- a/src/cmd/5l/l.h
+++ b/src/cmd/5l/l.h
@@ -276,7 +276,6 @@ enum
STRINGSZ = 200,
NHASH = 10007,
- NHUNK = 100000,
MINSIZ = 64,
NENT = 100,
MAXIO = 8192,
@@ -333,6 +332,7 @@ EXTERN Oprang thumboprange[ALAST];
EXTERN char* outfile;
EXTERN int32 pc;
EXTERN uchar repop[ALAST];
+EXTERN char* interpreter;
EXTERN char* rpath;
EXTERN uint32 stroffset;
EXTERN int32 symsize;
diff --git a/src/cmd/5l/noop.c b/src/cmd/5l/noop.c
index 5def0d3f1..a9439c27a 100644
--- a/src/cmd/5l/noop.c
+++ b/src/cmd/5l/noop.c
@@ -330,23 +330,23 @@ noops(void)
p->from.reg = 1;
p->reg = 2;
}
-
+
// MOVW.LO $autosize, R1
p = appendp(p);
p->as = AMOVW;
p->scond = C_SCOND_LO;
p->from.type = D_CONST;
- p->from.offset = 0;
+ /* 160 comes from 3 calls (3*8) 4 safes (4*8) and 104 guard */
+ p->from.offset = autosize+160;
p->to.type = D_REG;
p->to.reg = 1;
- // MOVW.LO $args +4, R2
- // also need to store the extra 4 bytes.
+ // MOVW.LO $args, R2
p = appendp(p);
p->as = AMOVW;
p->scond = C_SCOND_LO;
p->from.type = D_CONST;
- p->from.offset = ((cursym->text->to.offset2 + 3) & ~3) + 4;
+ p->from.offset = (cursym->text->to.offset2 + 3) & ~3;
p->to.type = D_REG;
p->to.reg = 2;
@@ -391,12 +391,12 @@ noops(void)
p->to.type = D_REG;
p->to.reg = 1;
- // MOVW $args +4, R2
+ // MOVW $args, R2
// also need to store the extra 4 bytes.
p = appendp(p);
p->as = AMOVW;
p->from.type = D_CONST;
- p->from.offset = ((cursym->text->to.offset2 + 3) & ~3) + 4;
+ p->from.offset = (cursym->text->to.offset2 + 3) & ~3;
p->to.type = D_REG;
p->to.reg = 2;
diff --git a/src/cmd/5l/obj.c b/src/cmd/5l/obj.c
index cb9ad9805..5b778d777 100644
--- a/src/cmd/5l/obj.c
+++ b/src/cmd/5l/obj.c
@@ -61,7 +61,7 @@ linkername[] =
void
usage(void)
{
- fprint(2, "usage: 5l [-E entry] [-H head] [-L dir] [-T text] [-D data] [-R rnd] [-r path] [-o out] main.5\n");
+ fprint(2, "usage: 5l [-E entry] [-H head] [-I interpreter] [-L dir] [-T text] [-D data] [-R rnd] [-r path] [-o out] main.5\n");
errorexit();
}
@@ -69,6 +69,7 @@ void
main(int argc, char *argv[])
{
int c, i;
+ char *p;
Binit(&bso, 1, OWRITE);
cout = -1;
@@ -80,6 +81,10 @@ main(int argc, char *argv[])
INITDAT = -1;
INITRND = -1;
INITENTRY = 0;
+
+ p = getenv("GOARM");
+ if(p != nil && strcmp(p, "5") == 0)
+ debug['F'] = 1;
ARGBEGIN {
default:
@@ -95,6 +100,9 @@ main(int argc, char *argv[])
case 'E':
INITENTRY = EARGF(usage());
break;
+ case 'I':
+ interpreter = EARGF(usage());
+ break;
case 'L':
Lflag(EARGF(usage()));
break;
diff --git a/src/cmd/5l/optab.c b/src/cmd/5l/optab.c
index 96b216837..9ad0193ac 100644
--- a/src/cmd/5l/optab.c
+++ b/src/cmd/5l/optab.c
@@ -64,7 +64,7 @@ Optab optab[] =
{ AB, C_NONE, C_NONE, C_ROREG, 6, 4, 0, LPOOL },
{ ABL, C_NONE, C_NONE, C_ROREG, 7, 8, 0 },
{ ABX, C_NONE, C_NONE, C_ROREG, 75, 12, 0 },
- { ABXRET, C_NONE, C_NONE, C_ROREG, 76, 4, 0 },
+ { ABXRET, C_NONE, C_NONE, C_ROREG, 76, 4, 0 },
{ ASLL, C_RCON, C_REG, C_REG, 8, 4, 0 },
{ ASLL, C_RCON, C_NONE, C_REG, 8, 4, 0 },
@@ -251,5 +251,7 @@ Optab optab[] =
{ AMOVW, C_REG, C_NONE, C_FREG, 88, 4, 0 },
{ AMOVW, C_FREG, C_NONE, C_REG, 89, 4, 0 },
+ { ATST, C_REG, C_NONE, C_NONE, 90, 4, 0 },
+
{ AXXX, C_NONE, C_NONE, C_NONE, 0, 4, 0 },
};
diff --git a/src/cmd/5l/span.c b/src/cmd/5l/span.c
index be0f5e8b3..220140f43 100644
--- a/src/cmd/5l/span.c
+++ b/src/cmd/5l/span.c
@@ -962,7 +962,6 @@ buildop(void)
oprange[ABIC] = oprange[r];
break;
case ACMP:
- oprange[ATST] = oprange[r];
oprange[ATEQ] = oprange[r];
oprange[ACMN] = oprange[r];
break;
@@ -1055,6 +1054,7 @@ buildop(void)
case ALDREX:
case ASTREX:
+ case ATST:
break;
}
}