Bug 428117 - Debugger does not report sources file after stopped at main
diff --git a/agent/tcf/services/dwarfcache.c b/agent/tcf/services/dwarfcache.c
index 23adbba..1932621 100644
--- a/agent/tcf/services/dwarfcache.c
+++ b/agent/tcf/services/dwarfcache.c
@@ -851,6 +851,10 @@
 
 static void add_addr_range(ELF_Section * sec, CompUnit * unit, ContextAddress addr, ContextAddress size) {
     UnitAddressRange * range = NULL;
+    if (addr + size <= addr) {
+        if (size == 0) return;
+        size = 0 - addr;
+    }
     if (sCache->mAddrRangesCnt >= sCache->mAddrRangesMax) {
         sCache->mAddrRangesMax = sCache->mAddrRangesMax == 0 ? 64 : sCache->mAddrRangesMax * 2;
         sCache->mAddrRanges = (UnitAddressRange *)loc_realloc(sCache->mAddrRanges, sizeof(UnitAddressRange) * sCache->mAddrRangesMax);
@@ -981,9 +985,18 @@
         for (i = 0; i < sCache->mAddrRangesCnt - 1; i++) {
             UnitAddressRange * x = sCache->mAddrRanges + i;
             UnitAddressRange * y = x + 1;
+            ContextAddress x_end = x->mAddr + x->mSize;
             if (x->mSection == y->mSection && x->mUnit == y->mUnit &&
-                    x->mAddr == y->mAddr && x->mSize == y->mSize) {
+                    (x_end == 0 || x_end >= y->mAddr)) {
                 /* Skip duplicate entry */
+                ContextAddress y_end = y->mAddr + y->mSize;
+                y->mAddr = x->mAddr;
+                if (x_end == 0 || (y_end != 0 && x_end > y_end)) {
+                    y->mSize = x->mSize;
+                }
+                else {
+                    y->mSize = y_end - x->mAddr;
+                }
                 continue;
             }
             if (j < i) memcpy(sCache->mAddrRanges + j, x, sizeof(UnitAddressRange));