Can this be committed?
This patch fixes a bug where a non-native x86 process fails to unwind due to not having a local address space and local access mem callback function. (For reading memory mmaped from the inferior process into the unwinding process).
--- libunwind-0.99-alpha/src/ptrace/_UPT_find_proc_info.c	2006-07-26 23:13:14.000000000 -0400
+++ mainworkspace/frysk/frysk-imports/libunwind/src/ptrace/_UPT_find_proc_info.c	2007-04-24 16:42:20.000000000 -0400
@@ -1,6 +1,7 @@
 /* libunwind - a platform-independent unwind library
    Copyright (C) 2003-2004 Hewlett-Packard Co
 	Contributed by David Mosberger-Tang <[EMAIL PROTECTED]>
+   Copyright Red Hat 2007
 
 This file is part of libunwind.
 
@@ -170,7 +171,6 @@
   unw_word_t addr, eh_frame_start, fde_count, load_base;
   struct dwarf_eh_frame_hdr *hdr;
   unw_proc_info_t pi;
-  unw_accessors_t *a;
   Elf_W(Ehdr) *ehdr;
   int i, ret;
 
@@ -236,8 +236,7 @@
 	     path, hdr->version);
       return 0;
     }
-
-  a = unw_get_accessors (unw_local_addr_space);
+ 
   addr = (unw_word_t) (hdr + 1);
 
   /* Fill in a dummy proc_info structure.  We just need to fill in
@@ -247,14 +246,37 @@
   memset (&pi, 0, sizeof (pi));
   pi.gp = ui->di_cache.gp;
 
+//The following is a dummy local address space used by dwarf_read_encoded_pointer.
+  int 
+  local_access_mem (unw_addr_space_t as, unw_word_t addr,
+		unw_word_t *val, int write, void *arg) 
+  {	
+	if (write)
+    	{
+     	  Debug (16, "mem[%x] <- %x\n", addr, *val);
+          *(unw_word_t *) addr = *val;
+    	}
+  	else
+    	{
+          *val = *(unw_word_t *) addr;
+          Debug (16, "mem[%x] -> %x\n", addr, *val);
+    	}
+    	return 0;
+  }
+  
+  unw_accessors_t temp_local_accessors = {NULL, NULL, NULL, local_access_mem, 
+  					  NULL, NULL,	NULL, NULL, NULL};
+  unw_addr_space_t temp_local_addr_space 
+  	= unw_create_addr_space(&temp_local_accessors, 0);
+
   /* (Optionally) read eh_frame_ptr: */
-  if ((ret = dwarf_read_encoded_pointer (unw_local_addr_space, a,
+  if ((ret = dwarf_read_encoded_pointer (temp_local_addr_space, &temp_local_accessors,
 					 &addr, hdr->eh_frame_ptr_enc, &pi,
 					 &eh_frame_start, NULL)) < 0)
     return NULL;
 
   /* (Optionally) read fde_count: */
-  if ((ret = dwarf_read_encoded_pointer (unw_local_addr_space, a,
+  if ((ret = dwarf_read_encoded_pointer (temp_local_addr_space, &temp_local_accessors,
 					 &addr, hdr->fde_count_enc, &pi,
 					 &fde_count, NULL)) < 0)
     return NULL;
_______________________________________________
Libunwind-devel mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/libunwind-devel

Reply via email to