Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/cddl/osnet/dist/tools/ctf/cvt Handle assembly code ...



details:   https://anonhg.NetBSD.org/src/rev/4e60f02f28cc
branches:  trunk
changeset: 328524:4e60f02f28cc
user:      christos <christos%NetBSD.org@localhost>
date:      Sat Apr 05 23:33:15 2014 +0000

description:
Handle assembly code built with -g

diffstat:

 external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c |  32 +++++++++++++++++++------
 1 files changed, 24 insertions(+), 8 deletions(-)

diffs (55 lines):

diff -r 00defcf229c7 -r 4e60f02f28cc external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c
--- a/external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c    Sat Apr 05 22:41:50 2014 +0000
+++ b/external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c    Sat Apr 05 23:33:15 2014 +0000
@@ -1924,7 +1924,6 @@
                        char *name;
 
                        name = elf_strptr(elf, shdr.sh_link, sym.st_name);
-fprintf(stderr, "name = %s\n", name);
 
                        /* Studio emits these local symbols regardless */
                        if ((strcmp(name, "Bbss.bss") != 0) &&
@@ -1995,14 +1994,28 @@
            &addrsz, &offsz, NULL, &nxthdr, &dw.dw_err)) != DW_DLV_OK)
                terminate("rc = %d %s\n", rc, dwarf_errmsg(dw.dw_err));
 
-       if ((cu = die_sibling(&dw, NULL)) == NULL ||
-           (((child = die_child(&dw, cu)) == NULL) &&
-           should_have_dwarf(elf))) {
-               terminate("file does not contain dwarf type data "
-                   "(try compiling with -g)\n");
-       } else if (child == NULL) {
+       if ((cu = die_sibling(&dw, NULL)) == NULL)
+               goto out;
+
+       if ((child = die_child(&dw, cu)) == NULL) {
+               Dwarf_Unsigned lang;
+               if (die_unsigned(&dw, cu, DW_AT_language, &lang, 0)) {
+                       debug(1, "DWARF language: %u\n", lang);
+                       /*
+                        * Assembly languages are typically that.
+                        * They have some dwarf info, but not what
+                        * we expect. They have local symbols for
+                        * example, but they are missing the child info.
+                        */
+                       if (lang >= DW_LANG_lo_user)
+                               return 0;
+               }
+               if (should_have_dwarf(elf))
+                       goto out;
+       }
+
+       if (child == NULL)
                return (0);
-       }
 
        dw.dw_maxoff = nxthdr - 1;
 
@@ -2044,4 +2057,7 @@
        /* leak the dwarf_t */
 
        return (0);
+out:
+       terminate("file does not contain dwarf type data "
+           "(try compiling with -g)\n");
 }



Home | Main Index | Thread Index | Old Index