]> Cypherpunks repositories - gostls13.git/commitdiff
liblink: support big-endian properly
authorShenghou Ma <minux@golang.org>
Wed, 6 Aug 2014 04:25:41 +0000 (00:25 -0400)
committerShenghou Ma <minux@golang.org>
Wed, 6 Aug 2014 04:25:41 +0000 (00:25 -0400)
LGTM=rsc
R=rsc, iant
CC=golang-codereviews
https://golang.org/cl/115300044

include/link.h
src/liblink/ld.c
src/liblink/obj5.c
src/liblink/obj6.c
src/liblink/obj8.c
src/liblink/sym.c

index 7cb04ac126f61b2463558ad3b837637096f9586b..c5f4841d32c62def11b28727e24fc960de98aa5b 100644 (file)
@@ -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*);
index a2fdce56bd3e61bf97cf0908b8e5c233f0f2f0d0..6d0fe4a2a4d05d5615329144e1e83aea9826476d 100644 (file)
@@ -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;
+               }
        }
 }
 
index 348401930bead81bf3c8cf0013d9c0a931e4960b..de920b029e233e8b57e3fad32e184e07d1797e0b 100644 (file)
@@ -1033,6 +1033,7 @@ loop:
 LinkArch linkarm = {
        .name = "arm",
        .thechar = '5',
+       .endian = LittleEndian,
 
        .addstacksplit = addstacksplit,
        .assemble = span5,
index 6879e97becde3a071a03dd3d5ced22c312a523fe..eef3b4294a0101b02dd5a58c2176665e3bb263a6 100644 (file)
@@ -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,
index 2fc48d364e414d84c831fac2a321f0b3184f7c01..50e6d8236d6e40efde5e0ee2f2dabbe2f352acbf 100644 (file)
@@ -816,6 +816,7 @@ loop:
 LinkArch link386 = {
        .name = "386",
        .thechar = '8',
+       .endian = LittleEndian,
 
        .addstacksplit = addstacksplit,
        .assemble = span8,
index 6ae9e45c7e35a0f480ced4d142b50213f2b4a71b..ec07957f47ded4a599bd4a4c80f32b7df1627d86 100644 (file)
@@ -91,7 +91,7 @@ linknew(LinkArch *arch)
        char *p;
        char buf[1024];
 
-       nuxiinit();
+       nuxiinit(arch);
        
        ctxt = emallocz(sizeof *ctxt);
        ctxt->arch = arch;