removal and typesigs and strings.
Also added new header support to 5c/5a/5l.
R=rsc
APPROVED=rsc
DELTA=98 (66 added, 10 deleted, 22 changed)
OCL=30103
CL=30123
pass = 1;
pinit(file);
+
+ Bprint(&obuf, "%s\n", thestring);
+
for(i=0; i<nDlist; i++)
dodefine(Dlist[i]);
yyparse();
return nerrors;
}
+ Bprint(&obuf, "\n!\n");
+
pass = 2;
outhist();
pinit(file);
pc++;
}
}
+
+ Bprint(&outbuf, "%s\n", thestring);
+ Bprint(&outbuf, "!\n");
+
outhist(&outbuf);
for(sym=0; sym<NSYM; sym++) {
h[sym].sym = S;
#define D_REGREG (D_NONE+21)
#define D_ADDR (D_NONE+22)
+#define D_SBIG (D_NONE+23)
+
/* name */
#define D_EXTERN (D_NONE+3)
#define D_STATIC (D_NONE+4)
pass.$O\
thumb.$O\
span.$O\
-# go.$O\
+ go.$O\
HFILES=\
l.h\
break;
}
break;
+
+ case D_SBIG:
+ if(debug['a'] && i == 0) {
+ Bprint(&bso, "\t%P\n", curp);
+ }
+ for(; i<c; i++) {
+ buf.dbuf[l] = p->to.sbig[i];
+ l++;
+ }
+ break;
}
}
write(cout, buf.dbuf, n);
o6 |= (1<<6); /* ROL 8 */
break;
-
+
case 34: /* mov $lacon,R */
o1 = omvl(p, &p->from, REGTMP);
if(!o1)
if(r == NREG)
r = o->param;
o1 = oshr(p->from.reg, instoffset, r, p->scond);
- break;
+ break;
case 71: /* movb/movh/movhu O(R),R -> ldrsb/ldrsh/ldrh */
aclass(&p->from);
r = p->from.reg;
if(r == NREG)
r = o->param;
o2 = oshrr(p->from.reg, REGTMP,r, p->scond);
- break;
+ break;
case 73: /* movb/movh/movhu L(R),R -> ldrsb/ldrsh/ldrh */
o1 = omvl(p, &p->from, REGTMP);
if(!o1)
o = olhr(v, b, r, sc) ^ (1<<20);
return o;
}
-
+
int32
osrr(int r, int i, int b, int sc)
int32
omvl(Prog *p, Adr *a, int dr)
-{
+{
int32 v, o1;
if(!p->cond) {
aclass(a);
int32 u0offset;
char* u0sval;
Ieee* u0ieee;
+ char* u0sbig;
} u0;
union
{
Sym* u1sym;
} u1;
char type;
+ uchar index; // not used on arm, required by ld/go.c
char reg;
char name;
char class;
#define offset u0.u0offset
#define sval u0.u0sval
#define ieee u0.u0ieee
+#define sbig u0.u0sbig
#define autom u1.u1autom
#define sym u1.u1sym
} u0;
Prog* cond;
Prog* link;
+ Prog* dlink;
int32 pc;
int32 line;
uchar mark;
short become;
short frame;
uchar subtype;
+ uchar reachable;
ushort file;
int32 value;
int32 sig;
uchar fnptr; // used as fn ptr
Use* use;
Sym* link;
+ Prog* text;
+ Prog* data;
};
#define SIGNINTERN (1729*325*1729)
EXTERN Prog* datap;
EXTERN int32 datsize;
EXTERN char debug[128];
+EXTERN Prog* edatap;
EXTERN Prog* etextp;
EXTERN Prog* firstp;
EXTERN char fnuxi4[4];
void mkfwd(void);
void* mysbrk(uint32);
void names(void);
+Prog* newdata(Sym *s, int o, int w, int t);
void nocache(Prog*);
void nuxiinit(void);
void objfile(char*);
histgen = 0;
textp = P;
datap = P;
+ edatap = P;
pc = 0;
dtype = 4;
if(outfile == 0)
sprint(a, "%s/pkg/%s_%s/runtime.a", goroot, goos, goarch);
objfile(a);
}
- // TODO(kaib): add these go specific extensions
-// definetypestrings();
-// definetypesigs();
-// deadcode();
+ definetypestrings();
+ definetypesigs();
+ deadcode();
firstp = firstp->link;
if(firstp == P)
di = S;
- goto newloop;
-
/* check the header */
start = Boffset(f);
line = Brdline(f, '\n');
if(line)
line[n] = '\0';
diag("file not %s [%s]\n", thestring, line);
- // TODO(kaib): Make not finding the header an error again
-// return;
- Bseek(f, start, 0);
- goto newloop;
+ return;
}
/* skip over exports and other info -- ends with \n!\n */
import1 = Boffset(f);
Bseek(f, import0, 0);
- // TODO(kaib): add in this go specific extension
-// ldpkg(f, import1 - import0 - 2, pn); // -2 for !\n
+ ldpkg(f, import1 - import0 - 2, pn); // -2 for !\n
Bseek(f, import1, 0);
newloop:
o = Bgetc(f);
if(o == Beof)
goto eof;
- // TODO(kaib): I wonder if this is an issue.
-// o |= Bgetc(f) << 8; 6l does this, 5l doesn't. I think 5g outputs 2 byte
-// AXXX's
if(o <= AXXX || o >= ALAST) {
diag("%s:#%lld: opcode out of range: %#ux", pn, Boffset(f), o);
break;
case ADYNT:
+ s = p->from.sym;
if(p->to.sym == S) {
diag("DYNT without a sym\n%P", p);
break;
di->value = dtype;
dtype += 4;
}
- if(p->from.sym == S)
+ if(s == S)
break;
p->from.offset = di->value;
- p->from.sym->type = SDATA;
+ s->type = SDATA;
if(curtext == P) {
diag("DYNT not in text: %P", p);
break;
}
p->to.sym = curtext->from.sym;
p->to.type = D_CONST;
- p->link = datap;
- datap = p;
+ if(s != S) {
+ p->dlink = s->data;
+ s->data = p;
+ }
+ if(edatap == P)
+ datap = p;
+ else
+ edatap->link = p;
+ edatap = p;
break;
case AINIT:
- if(p->from.sym == S) {
+ s = p->from.sym;
+ if(s == S) {
diag("INIT without a sym\n%P", p);
break;
}
break;
}
p->from.offset = di->value;
- p->from.sym->type = SDATA;
- p->link = datap;
- datap = p;
+ s->type = SDATA;
+ if(s != S) {
+ p->dlink = s->data;
+ s->data = p;
+ }
+ if(edatap == P)
+ datap = p;
+ else
+ edatap->link = p;
+ edatap = p;
break;
case ADATA:
- if(p->from.sym == S) {
+ s = p->from.sym;
+ if(s == S) {
diag("DATA without a sym\n%P", p);
break;
}
- p->link = datap;
- datap = p;
+ if(s != S) {
+ p->dlink = s->data;
+ s->data = p;
+ }
+ if(edatap == P)
+ datap = p;
+ else
+ edatap->link = p;
+ edatap = p;
break;
case AGOK:
diag("redefinition: %s\n%P", s->name, p);
}
s->type = STEXT;
+ s->text = p;
s->value = pc;
s->thumb = thumb;
lastp->link = p;
t->from.name = D_EXTERN;
t->reg = 4;
t->to = p->from;
- t->link = datap;
- datap = t;
+ if(edatap == P)
+ datap = t;
+ else
+ edatap->link = t;
+ edatap = t;
+ t->link = P;
}
p->from.type = D_OREG;
p->from.sym = s;
t->from.name = D_EXTERN;
t->reg = 8;
t->to = p->from;
- t->link = datap;
- datap = t;
+ if(edatap == P)
+ datap = t;
+ else
+ edatap->link = t;
+ edatap = t;
+ t->link = P;
}
p->from.type = D_OREG;
p->from.sym = s;
diag("relocation offset %ld for %s out of range", v, s->name);
}
-static Prog*
+Prog*
newdata(Sym *s, int o, int w, int t)
{
Prog *p;
p->from.offset = o;
p->to.type = D_CONST;
p->to.name = D_NONE;
+ s->data = p;
return p;
}