+2005-08-25 Roland McGrath <roland@redhat.com>
+
+ * cu.c (__libdwfl_nextcu): Return success when dwarf_nextcu hits end.
+ * dwfl_nextcu.c (dwfl_nextcu): Skip modules with no dwarf info.
+
2005-08-24 Roland McGrath <roland@redhat.com>
* dwfl_lineinfo.c (dwfl_lineinfo): Add bias, don't subtract it.
{
size_t cuhdrsz;
Dwarf_Off nextoff;
- if (INTUSE(dwarf_nextcu) (mod->dw, cuoff, &nextoff, &cuhdrsz,
- NULL, NULL, NULL) != 0)
+ int end = INTUSE(dwarf_nextcu) (mod->dw, cuoff, &nextoff, &cuhdrsz,
+ NULL, NULL, NULL);
+ if (end < 0)
return DWFL_E_LIBDW;
+ if (end > 0)
+ {
+ *cu = NULL;
+ return DWFL_E_NOERROR;
+ }
Dwfl_Error result = intern_cu (mod, cuoff + cuhdrsz, nextp);
if (result != DWFL_E_NOERROR)
mod = cu->mod;
Dwfl_Error error;
- while ((error = __libdwfl_nextcu (mod, cu, &cu)) == DWFL_E_NOERROR)
+ do
{
+ error = __libdwfl_nextcu (mod, cu, &cu);
+ if (error != DWFL_E_NOERROR)
+ break;
+
if (cu != NULL)
{
*bias = mod->debug.bias;
return &cu->die;
}
- mod = mod->next;
+ do
+ {
+ mod = mod->next;
+
+ nextmod:
+ if (mod == NULL)
+ return NULL;
- nextmod:
- if (mod == NULL || INTUSE(dwfl_module_getdwarf) (mod, bias) == NULL)
- return NULL;
+ error = mod->dwerr;
+ if (error == DWFL_E_NOERROR
+ && (mod->dw != NULL
+ || INTUSE(dwfl_module_getdwarf) (mod, bias) != NULL))
+ break;
+ }
+ while (error == DWFL_E_NO_DWARF);
}
+ while (error == DWFL_E_NOERROR);
__libdwfl_seterrno (error);
return NULL;