]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/5l: dwarf line number support for Linux/ARM
authorShenghou Ma <minux.ma@gmail.com>
Tue, 7 Aug 2012 02:09:24 +0000 (10:09 +0800)
committerShenghou Ma <minux.ma@gmail.com>
Tue, 7 Aug 2012 02:09:24 +0000 (10:09 +0800)
   Part of issue 3747.

R=dave, lvd, rsc
CC=golang-dev
https://golang.org/cl/6084044

src/cmd/5l/asm.c
src/cmd/5l/l.h
src/cmd/5l/noop.c
src/cmd/5l/obj.c
src/cmd/5l/softfloat.c
src/cmd/5l/span.c
src/cmd/dist/build.c

index 9a74c2a35d655a5ec8b787b2b5afc5f99befdc2e..3e51ece462ece386adbb00a6b43c1d03d153a996 100644 (file)
@@ -33,6 +33,7 @@
 #include       "l.h"
 #include       "../ld/lib.h"
 #include       "../ld/elf.h"
+#include       "../ld/dwarf.h"
 
 static Prog *PP;
 
@@ -509,6 +510,7 @@ doelf(void)
        if(!debug['s']) {
                elfstr[ElfStrSymtab] = addstring(shstrtab, ".symtab");
                elfstr[ElfStrStrtab] = addstring(shstrtab, ".strtab");
+               dwarfaddshstrings(shstrtab);
        }
        elfstr[ElfStrShstrtab] = addstring(shstrtab, ".shstrtab");
 
@@ -723,12 +725,11 @@ asmb(void)
                        cflush();
                        cwrite(elfstrdat, elfstrsize);
 
-                       // if(debug['v'])
-                       //      Bprint(&bso, "%5.2f dwarf\n", cputime());
-                       // dwarfemitdebugsections();
+                       if(debug['v'])
+                               Bprint(&bso, "%5.2f dwarf\n", cputime());
+                       dwarfemitdebugsections();
                }
                cflush();
-               
        }
 
        cursym = nil;
@@ -989,7 +990,7 @@ asmb(void)
                        sh->size = elfstrsize;
                        sh->addralign = 1;
 
-                       // dwarfaddelfheaders();
+                       dwarfaddelfheaders();
                }
 
                /* Main header */
@@ -2317,9 +2318,3 @@ genasmsym(void (*put)(Sym*, char*, int, vlong, vlong, int, Sym*))
                Bprint(&bso, "symsize = %ud\n", symsize);
        Bflush(&bso);
 }
-
-void
-setpersrc(Sym *s)
-{
-       USED(s);
-}
index 190bfa9ee19d814795c3564c720158d293b6bed4..e6f2ec3d98fa577034f759746ff0b87c0571a867 100644 (file)
@@ -401,6 +401,9 @@ void        span(void);
 void   strnput(char*, int);
 int32  symaddr(Sym*);
 void   undef(void);
+void   vputb(uint64);
+void   vputl(uint64);
+void   wputb(uint16);
 void   wput(int32);
 void    wputl(ushort w);
 void   xdefine(char*, int, int32);
@@ -428,3 +431,9 @@ vlong               adduintxx(Sym *s, uint64 v, int wid);
 #define        VPUT(a) abort()
 
 #endif
+
+/* Used by ../ld/dwarf.c */
+enum
+{
+       DWARFREGSP = 13
+};
index 004f9f2faabcce678f54e7bb320434309e2a19f3..c50a108f38e2175e9e7dc1fa9927483790dcffc0 100644 (file)
@@ -365,11 +365,7 @@ noops(void)
                                q1 = p;
        
                                /* MOV a,4(SP) */
-                               q = prg();
-                               q->link = p->link;
-                               p->link = q;
-                               p = q;
-       
+                               p = appendp(p);
                                p->as = AMOVW;
                                p->line = q1->line;
                                p->from.type = D_REG;
@@ -379,11 +375,7 @@ noops(void)
                                p->to.offset = 4;
        
                                /* MOV b,REGTMP */
-                               q = prg();
-                               q->link = p->link;
-                               p->link = q;
-                               p = q;
-       
+                               p = appendp(p);
                                p->as = AMOVW;
                                p->line = q1->line;
                                p->from.type = D_REG;
@@ -395,11 +387,7 @@ noops(void)
                                p->to.offset = 0;
        
                                /* CALL appropriate */
-                               q = prg();
-                               q->link = p->link;
-                               p->link = q;
-                               p = q;
-       
+                               p = appendp(p);
                                p->as = ABL;
                                p->line = q1->line;
                                p->to.type = D_BRANCH;
@@ -424,11 +412,7 @@ noops(void)
                                }
        
                                /* MOV REGTMP, b */
-                               q = prg();
-                               q->link = p->link;
-                               p->link = q;
-                               p = q;
-       
+                               p = appendp(p);
                                p->as = AMOVW;
                                p->line = q1->line;
                                p->from.type = D_REG;
@@ -438,12 +422,9 @@ noops(void)
                                p->to.reg = q1->to.reg;
        
                                /* ADD $8,SP */
-                               q = prg();
-                               q->link = p->link;
-                               p->link = q;
-                               p = q;
-       
+                               p = appendp(p);
                                p->as = AADD;
+                               p->line = q1->line;
                                p->from.type = D_CONST;
                                p->from.reg = NREG;
                                p->from.offset = 8;
index 3c345de2ab6986e051099437d6d5c58a2c563a85..05967ac9c01dcf70f2c98df423b779f8b79fa07c 100644 (file)
@@ -34,6 +34,7 @@
 #include       "l.h"
 #include       "../ld/lib.h"
 #include       "../ld/elf.h"
+#include       "../ld/dwarf.h"
 #include       <ar.h>
 
 #ifndef        DEFAULT
@@ -481,6 +482,7 @@ loop:
                                histfrogp++;
                        } else
                                collapsefrog(s);
+                       dwarfaddfrag(s->value, s->name);
                }
                goto loop;
        }
index 8be5b7585c1e63e5142f18961eaebf2893e97355..de6481c7102d503f0141f25f99227c536e06749a 100644 (file)
@@ -76,6 +76,7 @@ softfloat(void)
                                        p->to.type = D_BRANCH;
                                        p->to.sym = symsfloat;
                                        p->cond = psfloat;
+                                       p->line = next->line;
        
                                        p = next;
                                        wasfloat = 1;
index 3787740e283c4f44e627f9757621f7600f8e0a1b..7614c40185eff5d304639461e23b89e040dac36b 100644 (file)
@@ -288,12 +288,20 @@ flushpool(Prog *p, int skip, int force)
                        q->to.type = D_BRANCH;
                        q->cond = p->link;
                        q->link = blitrl;
+                       q->line = p->line;
                        blitrl = q;
                }
                else if(!force && (p->pc+pool.size-pool.start < 2048))
                        return 0;
                elitrl->link = p->link;
                p->link = blitrl;
+               // BUG(minux): how to correctly handle line number for constant pool entries?
+               // for now, we set line number to the last instruction preceding them at least
+               // this won't bloat the .debug_line tables
+               while(blitrl) {
+                       blitrl->line = p->line;
+                       blitrl = blitrl->link;
+               }
                blitrl = 0;     /* BUG: should refer back to values until out-of-range */
                elitrl = 0;
                pool.size = 0;
index 440fc5d0bd8dd46ff5cdc6ac3c6d89f4de169ff3..f21b5afda310d2476acf7638e3944c6ab7320eba 100644 (file)
@@ -474,14 +474,7 @@ static struct {
                "$GOROOT/pkg/obj/$GOOS_$GOARCH/libgc.a",
        }},
        {"cmd/5l", {
-               "../ld/data.c",
-               "../ld/elf.c",
-               "../ld/go.c",
-               "../ld/ldelf.c",
-               "../ld/ldmacho.c",
-               "../ld/ldpe.c",
-               "../ld/lib.c",
-               "../ld/symtab.c",
+               "../ld/*",
                "enam.c",
        }},
        {"cmd/6l", {