mirror of
https://github.com/golang/go
synced 2024-10-14 03:43:28 +00:00
liblink: support big-endian properly
LGTM=rsc R=rsc, iant CC=golang-codereviews https://golang.org/cl/115300044
This commit is contained in:
parent
2c181f0355
commit
08ee2661f2
|
@ -431,11 +431,17 @@ struct Link
|
|||
LSym* filesyms;
|
||||
};
|
||||
|
||||
enum {
|
||||
LittleEndian = 0x04030201,
|
||||
BigEndian = 0x01020304,
|
||||
};
|
||||
|
||||
// LinkArch is the definition of a single architecture.
|
||||
struct LinkArch
|
||||
{
|
||||
char* name; // "arm", "amd64", and so on
|
||||
int thechar; // '5', '6', and so on
|
||||
int32 endian; // LittleEndian or BigEndian
|
||||
|
||||
void (*addstacksplit)(Link*, LSym*);
|
||||
void (*assemble)(Link*, LSym*);
|
||||
|
@ -560,7 +566,7 @@ int find1(int32 l, int c);
|
|||
void linkgetline(Link *ctxt, int32 line, LSym **f, int32 *l);
|
||||
void histtoauto(Link *ctxt);
|
||||
void mkfwd(LSym*);
|
||||
void nuxiinit(void);
|
||||
void nuxiinit(LinkArch*);
|
||||
void savehist(Link *ctxt, int32 line, int32 off);
|
||||
Prog* copyp(Link*, Prog*);
|
||||
Prog* appendp(Link*, Prog*);
|
||||
|
|
|
@ -130,16 +130,26 @@ find1(int32 l, int c)
|
|||
}
|
||||
|
||||
void
|
||||
nuxiinit(void)
|
||||
nuxiinit(LinkArch *arch)
|
||||
{
|
||||
int i, c;
|
||||
|
||||
if(arch->endian != BigEndian && arch->endian != LittleEndian)
|
||||
sysfatal("unknown endian (%#x) for arch %s", arch->endian, arch->name);
|
||||
|
||||
for(i=0; i<4; i++) {
|
||||
c = find1(0x04030201L, i+1);
|
||||
if(i < 2)
|
||||
inuxi2[i] = c;
|
||||
if(i < 1)
|
||||
inuxi1[i] = c;
|
||||
c = find1(arch->endian, i+1);
|
||||
if(arch->endian == LittleEndian) {
|
||||
if(i < 2)
|
||||
inuxi2[i] = c;
|
||||
if(i < 1)
|
||||
inuxi1[i] = c;
|
||||
} else {
|
||||
if(i >= 2)
|
||||
inuxi2[i-2] = c;
|
||||
if(i >= 3)
|
||||
inuxi1[i-3] = c;
|
||||
}
|
||||
inuxi4[i] = c;
|
||||
if(c == i) {
|
||||
inuxi8[i] = c;
|
||||
|
@ -149,8 +159,13 @@ nuxiinit(void)
|
|||
inuxi8[i+4] = c;
|
||||
}
|
||||
fnuxi4[i] = c;
|
||||
fnuxi8[i] = c;
|
||||
fnuxi8[i+4] = c+4;
|
||||
if(c == i) {
|
||||
fnuxi8[i] = c;
|
||||
fnuxi8[i+4] = c+4;
|
||||
} else {
|
||||
fnuxi8[i] = c+4;
|
||||
fnuxi8[i+4] = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1033,6 +1033,7 @@ loop:
|
|||
LinkArch linkarm = {
|
||||
.name = "arm",
|
||||
.thechar = '5',
|
||||
.endian = LittleEndian,
|
||||
|
||||
.addstacksplit = addstacksplit,
|
||||
.assemble = span5,
|
||||
|
|
|
@ -1087,6 +1087,7 @@ prg(void)
|
|||
LinkArch linkamd64 = {
|
||||
.name = "amd64",
|
||||
.thechar = '6',
|
||||
.endian = LittleEndian,
|
||||
|
||||
.addstacksplit = addstacksplit,
|
||||
.assemble = span6,
|
||||
|
@ -1132,6 +1133,7 @@ LinkArch linkamd64 = {
|
|||
LinkArch linkamd64p32 = {
|
||||
.name = "amd64p32",
|
||||
.thechar = '6',
|
||||
.endian = LittleEndian,
|
||||
|
||||
.addstacksplit = addstacksplit,
|
||||
.assemble = span6,
|
||||
|
|
|
@ -816,6 +816,7 @@ loop:
|
|||
LinkArch link386 = {
|
||||
.name = "386",
|
||||
.thechar = '8',
|
||||
.endian = LittleEndian,
|
||||
|
||||
.addstacksplit = addstacksplit,
|
||||
.assemble = span8,
|
||||
|
|
|
@ -91,7 +91,7 @@ linknew(LinkArch *arch)
|
|||
char *p;
|
||||
char buf[1024];
|
||||
|
||||
nuxiinit();
|
||||
nuxiinit(arch);
|
||||
|
||||
ctxt = emallocz(sizeof *ctxt);
|
||||
ctxt->arch = arch;
|
||||
|
|
Loading…
Reference in a new issue