]> granicus.if.org Git - strace/commitdiff
mpers.awk: add support for DWARF files generated by clang
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 13 Jan 2016 02:31:12 +0000 (02:31 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 13 Jan 2016 02:38:59 +0000 (02:38 +0000)
* mpers.awk: Define default_pointer_size.  Initialize byte_size
for DW_TAG_pointer_type to default_pointer_size.  Set parent
for DW_TAG_member only.  Handle DW_AT_count as an alternative
to DW_AT_upper_bound.

mpers.awk

index 73bf0b03a06250c5844a2361a400627199ed9071..99248c57038625babd90e8247bc4686254dd426d 100644 (file)
--- a/mpers.awk
+++ b/mpers.awk
@@ -1,7 +1,7 @@
 #!/bin/gawk
 #
 # Copyright (c) 2015 Elvira Khabirova <lineprinter0@gmail.com>
-# Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
+# Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org>
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -173,6 +173,8 @@ function what_is(what_idx, type_idx, special, item, \
        return leave(what_idx, "")
 }
 BEGIN {
+       match(ARCH_FLAG, /[[:digit:]]+/, temparray)
+       default_pointer_size = temparray[0] / 8
        print "#include <inttypes.h>"
 }
 /^<[[:xdigit:]]+>/ {
@@ -181,9 +183,6 @@ BEGIN {
        idx = "0x" matches[2]
        array[idx]["idx"] = idx
        parent[level] = idx
-       if (level > 1) {
-               array[idx]["parent"] = parent[level-1]
-       }
 }
 /^DW_AT_data_member_location/ {
        if (!match($0, /\(DW_OP_plus_uconst:[[:space:]]+([[:digit:]]+)\)/, temparray))
@@ -211,10 +210,18 @@ BEGIN {
        match($0, /[[:digit:]]+/, temparray)
        array[parent[level-1]]["upper_bound"] = temparray[0] + 1
 }
+/^DW_AT_count/ {
+       match($0, /[[:digit:]]+/, temparray)
+       array[parent[level-1]]["upper_bound"] = temparray[0]
+}
 /^Abbrev Number:[^(]+\(DW_TAG_/ {
        if (match($0, /typedef|union_type|structure_type|pointer_type\
 |enumeration_type|array_type|base_type|member/, temparray)) {
                array[idx]["special"] = temparray[0]
+               if ("pointer_type" == temparray[0])
+                       array[idx]["byte_size"] = default_pointer_size
+               if (level > 1 && "member" == temparray[0])
+                       array[idx]["parent"] = parent[level-1]
        }
 }
 END {