]> Cypherpunks repositories - gostls13.git/commitdiff
liblink: require DATA lines to be ordered by offset, with no overlap
authorRuss Cox <rsc@golang.org>
Wed, 15 Oct 2014 03:25:12 +0000 (23:25 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 15 Oct 2014 03:25:12 +0000 (23:25 -0400)
The assembler could give a better error, but this one
is good enough for now.

Fixes #8880.

LGTM=r
R=r
CC=golang-codereviews
https://golang.org/cl/153610043

include/link.h
src/cmd/5a/lex.c
src/cmd/6a/lex.c
src/cmd/8a/lex.c
src/liblink/data.c

index 845f9338d931c5426674d35bbab62a321a424c73..05e117c87ee0310a994aaf47d753161454ad7795 100644 (file)
@@ -373,6 +373,7 @@ struct      Link
        char*   trimpath;
        char*   goroot;
        char*   goroot_final;
+       int32   enforce_data_order;     // for use by assembler
 
        // hash table of all symbols
        LSym*   hash[LINKHASH];
@@ -542,6 +543,7 @@ vlong       adduint8(Link *ctxt, LSym *s, uint8 v);
 vlong  adduintxx(Link *ctxt, LSym *s, uint64 v, int wid);
 void   mangle(char *file);
 void   savedata(Link *ctxt, LSym *s, Prog *p, char *pn);
+void   savedata1(Link *ctxt, LSym *s, Prog *p, char *pn, int enforce_order);
 vlong  setaddr(Link *ctxt, LSym *s, vlong off, LSym *t);
 vlong  setaddrplus(Link *ctxt, LSym *s, vlong off, LSym *t, vlong add);
 vlong  setuint16(Link *ctxt, LSym *s, vlong r, uint16 v);
index 84a17d1557f28f3ee7afb6c97f0e736c313af256..9c69709479b16873f63cecb92277d58dcf61bd2b 100644 (file)
@@ -85,6 +85,7 @@ main(int argc, char *argv[])
        ctxt = linknew(&linkarm);
        ctxt->diag = yyerror;
        ctxt->bso = &bstdout;
+       ctxt->enforce_data_order = 1;
        Binit(&bstdout, 1, OWRITE);
        listinit5();
        fmtinstall('L', Lconv);
index b50e1622e28354a5de8f78d13c91c4d802e7bce6..8973d697430310c5875d92437e60292f32297e28 100644 (file)
@@ -101,6 +101,7 @@ main(int argc, char *argv[])
        ctxt = linknew(thelinkarch);
        ctxt->diag = yyerror;
        ctxt->bso = &bstdout;
+       ctxt->enforce_data_order = 1;
        Binit(&bstdout, 1, OWRITE);
        listinit6();
        fmtinstall('L', Lconv);
index 807e48cb50ca7e98db2a11f61e57330482d67e06..6ce6a18abe441d36bce1dbd6850afac0fe996f8e 100644 (file)
@@ -90,6 +90,7 @@ main(int argc, char *argv[])
        ctxt = linknew(&link386);
        ctxt->diag = yyerror;
        ctxt->bso = &bstdout;
+       ctxt->enforce_data_order = 1;
        Binit(&bstdout, 1, OWRITE);
        listinit8();
        fmtinstall('L', Lconv);
index 4504f4171e156ca2850e1cd0839d321a87b40db5..e5efa2eb2da8ac42ccc51d66fc4d004f541d5b39 100644 (file)
@@ -83,6 +83,8 @@ savedata(Link *ctxt, LSym *s, Prog *p, char *pn)
        siz = ctxt->arch->datasize(p);
        if(off < 0 || siz < 0 || off >= 1<<30 || siz >= 100)
                mangle(pn);
+       if(ctxt->enforce_data_order && off < s->np)
+               ctxt->diag("data out of order (already have %d)\n%P", p);
        symgrow(ctxt, s, off+siz);
 
        if(p->to.type == ctxt->arch->D_FCONST) {