diff options
Diffstat (limited to 'src/cmd/5l')
-rw-r--r-- | src/cmd/5l/Makefile | 1 | ||||
-rw-r--r-- | src/cmd/5l/asm.c | 13 | ||||
-rw-r--r-- | src/cmd/5l/doc.go | 5 | ||||
-rw-r--r-- | src/cmd/5l/l.h | 2 | ||||
-rw-r--r-- | src/cmd/5l/noop.c | 14 | ||||
-rw-r--r-- | src/cmd/5l/obj.c | 10 | ||||
-rw-r--r-- | src/cmd/5l/optab.c | 4 | ||||
-rw-r--r-- | src/cmd/5l/span.c | 2 |
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; } } |