diff options
author | Marc Aldorasi <marc@groundctl.com> | 2019-02-04 18:36:59 (GMT) |
---|---|---|
committer | Marc Aldorasi <marc@groundctl.com> | 2019-02-04 18:36:59 (GMT) |
commit | d212e047054d92cd71bf326ab5d01b28b29a6c5a (patch) | |
tree | 8677dadea3462d446fe8fe83df48545317027852 /src/dwarf2pdb.cpp | |
parent | 14641495119635e26aabad1dbccc79a6dd1fc94c (diff) | |
download | cv2pdb-d212e047054d92cd71bf326ab5d01b28b29a6c5a.zip cv2pdb-d212e047054d92cd71bf326ab5d01b28b29a6c5a.tar.gz cv2pdb-d212e047054d92cd71bf326ab5d01b28b29a6c5a.tar.bz2 |
Try harder to get function entry points
Diffstat (limited to 'src/dwarf2pdb.cpp')
-rw-r--r-- | src/dwarf2pdb.cpp | 47 |
1 files changed, 44 insertions, 3 deletions
diff --git a/src/dwarf2pdb.cpp b/src/dwarf2pdb.cpp index 962c880..2e2d13a 100644 --- a/src/dwarf2pdb.cpp +++ b/src/dwarf2pdb.cpp @@ -1476,10 +1476,51 @@ bool CV2PDB::createTypes() break;
case DW_TAG_subprogram:
- if (id.name && id.pclo && id.pchi)
+ if (id.name)
{
- addDWARFProc(id, cu, cursor.getSubtreeCursor());
- int rc = mod->AddPublic2(id.name, img.codeSegment + 1, id.pclo - codeSegOff, 0);
+ unsigned long entry_point = 0;
+ if (id.pcentry)
+ {
+ entry_point = id.pcentry;
+ }
+ else if (id.pclo)
+ {
+ entry_point = id.pclo;
+ }
+ else if (id.ranges != ~0)
+ {
+ entry_point = ~0;
+ byte* r = (byte*)img.debug_ranges + id.ranges;
+ byte* rend = (byte*)img.debug_ranges + img.debug_ranges_length;
+ while (r < rend)
+ {
+ uint64_t pclo, pchi;
+
+ if (img.isX64())
+ {
+ pclo = RD8(r);
+ pchi = RD8(r);
+ }
+ else
+ {
+ pclo = RD4(r);
+ pchi = RD4(r);
+ }
+ if (pclo == 0 && pchi == 0)
+ break;
+ if (pclo >= pchi)
+ continue;
+ entry_point = min(entry_point, pclo + currentBaseAddress);
+ }
+ if (entry_point == ~0)
+ entry_point = 0;
+ }
+
+ if (entry_point)
+ mod->AddPublic2(id.name, img.codeSegment + 1, entry_point - codeSegOff, 0);
+
+ if (id.pclo && id.pchi)
+ addDWARFProc(id, cu, cursor.getSubtreeCursor());
}
break;
|