public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Move unwind proc-info filling code into ProcInfo from LibunwindAddressSpace.
@ 2008-05-24 14:41 cagney
  0 siblings, 0 replies; only message in thread
From: cagney @ 2008-05-24 14:41 UTC (permalink / raw)
  To: frysk-cvs

The branch, master has been updated
       via  55130603149765b7e8e3394cd806b2be65567cba (commit)
      from  91e7054ffd1505588013927d9b3e006676fd09d8 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 55130603149765b7e8e3394cd806b2be65567cba
Author: Andrew Cagney <cagney@redhat.com>
Date:   Sat May 24 10:39:13 2008 -0400

    Move unwind proc-info filling code into ProcInfo from LibunwindAddressSpace.
    
    frysk-core/frysk/stack/ChangeLog
    2008-05-24  Andrew Cagney  <cagney@redhat.com>
    
    	* LibunwindAddressSpace.java (procInfo): Delete.
    	(getElfImage(long)): Delete.
    	(findProcInfo): Use ProcInfo.fillFromElfImage et.al. methods.
    
    frysk-sys/lib/unwind/ChangeLog
    2008-05-24  Andrew Cagney  <cagney@redhat.com>
    
    	* ProcInfo.java (ProcInfo(int)): Delete.
    	(error, getError()): Delete.
    	(fillFromElfImage, fillFromVDSO): New.
    	* Unwind.java (getProcInfo): Return a long.
    	* Cursor.java (getProcInfo()): Update.
    	* AddressSpace.java (findProcInfo): Add ProcInfo parameter.
    	* Unwind.java (createProcInfoFromElfImage): Ditto.
    	* TestUnwind.java: Update.
    	* cni/UnwindH.hxx (find_proc_info): Update.
    	(TARGET::createProcInfoFromElfImage): Update.

-----------------------------------------------------------------------

Summary of changes:
 frysk-core/frysk/stack/ChangeLog                  |    6 ++
 frysk-core/frysk/stack/LibunwindAddressSpace.java |   47 +++++------------
 frysk-sys/lib/unwind/AddressSpace.java            |    3 +-
 frysk-sys/lib/unwind/ChangeLog                    |   13 +++++
 frysk-sys/lib/unwind/Cursor.java                  |    2 +-
 frysk-sys/lib/unwind/ProcInfo.java                |   41 +++++++++-----
 frysk-sys/lib/unwind/TestUnwind.java              |    5 +-
 frysk-sys/lib/unwind/Unwind.java                  |   11 ++--
 frysk-sys/lib/unwind/cni/UnwindH.hxx              |   59 +++++++++-----------
 9 files changed, 98 insertions(+), 89 deletions(-)

First 500 lines of diff:
diff --git a/frysk-core/frysk/stack/ChangeLog b/frysk-core/frysk/stack/ChangeLog
index 142db12..913c26f 100644
--- a/frysk-core/frysk/stack/ChangeLog
+++ b/frysk-core/frysk/stack/ChangeLog
@@ -1,3 +1,9 @@
+2008-05-24  Andrew Cagney  <cagney@redhat.com>
+
+	* LibunwindAddressSpace.java (procInfo): Delete.
+	(getElfImage(long)): Delete.
+	(findProcInfo): Use ProcInfo.fillFromElfImage et.al. methods.
+
 2008-05-23  Andrew Cagney  <cagney@redhat.com>
 
 	* LibunwindAddressSpace.java: Use AddressSpace.unwinder (fixme);
diff --git a/frysk-core/frysk/stack/LibunwindAddressSpace.java b/frysk-core/frysk/stack/LibunwindAddressSpace.java
index bc2ac0c..d4b2dc3 100644
--- a/frysk-core/frysk/stack/LibunwindAddressSpace.java
+++ b/frysk-core/frysk/stack/LibunwindAddressSpace.java
@@ -52,7 +52,6 @@ import frysk.proc.Task;
 import frysk.rsl.Log;
 import lib.unwind.AddressSpace;
 import lib.unwind.ByteOrder;
-import lib.unwind.ElfImage;
 import lib.unwind.ProcInfo;
 import frysk.isa.registers.RegisterMap;
 
@@ -63,11 +62,6 @@ class LibunwindAddressSpace extends AddressSpace {
     private final ISA isa;
     private final RegisterMap registerMap;
 
-    // procInfo is a wrapper for a RawDataManaged object, keep a reference
-    // to it for as long as needed.
-    ProcInfo procInfo;
-
-
     static private Unwind unwinder(ISA isa) {
 	// FIXME: Call UnwindFactory.singleton(task.getISA())!
 	if (isa == ISA.IA32)
@@ -125,41 +119,28 @@ class LibunwindAddressSpace extends AddressSpace {
 	task.setRegister(register, regval);
     }
 
-    public ProcInfo findProcInfo (long ip, boolean needUnwindInfo) {
+    public int findProcInfo(long ip, boolean needUnwindInfo,
+			    ProcInfo procInfo) {
 	fine.log(this, "findProcInfo ip", ip, "needUnwindInfo", needUnwindInfo);
-	ElfImage elfImage = getElfImage(ip);
-	fine.log(this, "Obtained elfImage", elfImage);
-	procInfo = unwinder
-	    .createProcInfoFromElfImage(this, ip, needUnwindInfo, elfImage);
-	fine.log(this, "post procInfo", procInfo);
-	return procInfo;
-    }
-
-    public void putUnwindInfo (final ProcInfo procInfo) {
-	// No longer need to hold procInfo.
-	this.procInfo = null;
-    }
-
-    private ElfImage getElfImage (long addr) {
-	fine.log(this, "getElfImage addr", addr);
-	ElfImage elfImage = null;
-	MemoryMap map = task.getProc().getMap(addr);
-    
+	MemoryMap map = task.getProc().getMap(ip);
 	if (map == null) {
 	    fine.log(this, "Couldn't find memory map");
-	    return null;
+	    return -1;
 	}
 	if (DwflFactory.isVDSO(task.getProc(), map)) {
 	    fine.log(this, "Handling VDSO map");
-	    elfImage = unwinder
-		.createElfImageFromVDSO(this, map.addressLow, 
-					map.addressHigh, map.offset);
+	    return procInfo.fillFromVDSO(this, map.addressLow,
+					 map.addressHigh, map.offset,
+					 ip, needUnwindInfo);
 	} else {
 	    fine.log(this, "Handling regular map name", map.name);
-	    elfImage = ElfImage.mapElfImage(map.name, map.addressLow, 
-					    map.addressHigh, map.offset);
+	    return procInfo.fillFromElfImage(this, map.name,
+					     map.addressLow,
+					     map.addressHigh, map.offset,
+					     ip, needUnwindInfo);
 	}
-	fine.log(this, "Leaving getElfImage");
-	return elfImage;
+    }
+
+    public void putUnwindInfo (final ProcInfo procInfo) {
     }
 }
diff --git a/frysk-sys/lib/unwind/AddressSpace.java b/frysk-sys/lib/unwind/AddressSpace.java
index 669c8f7..0f69dd2 100644
--- a/frysk-sys/lib/unwind/AddressSpace.java
+++ b/frysk-sys/lib/unwind/AddressSpace.java
@@ -75,7 +75,8 @@ public abstract class AddressSpace {
      *  fields of the returned ProcInfo should be set.
      * @return A ProcInfo object holding the processes info.
      */
-    public abstract ProcInfo findProcInfo (long ip, boolean needUnwindInfo);
+    public abstract int findProcInfo(long ip, boolean needUnwindInfo,
+				     ProcInfo procInfo);
 
     /**
      * Used to free a ProcInfo object created with needUnwindInfo as
diff --git a/frysk-sys/lib/unwind/ChangeLog b/frysk-sys/lib/unwind/ChangeLog
index 4a0d12c..27027ff 100644
--- a/frysk-sys/lib/unwind/ChangeLog
+++ b/frysk-sys/lib/unwind/ChangeLog
@@ -1,3 +1,16 @@
+2008-05-24  Andrew Cagney  <cagney@redhat.com>
+
+	* ProcInfo.java (ProcInfo(int)): Delete.
+	(error, getError()): Delete.
+	(fillFromElfImage, fillFromVDSO): New.
+	* Unwind.java (getProcInfo): Return a long.
+	* Cursor.java (getProcInfo()): Update.
+	* AddressSpace.java (findProcInfo): Add ProcInfo parameter.
+	* Unwind.java (createProcInfoFromElfImage): Ditto.
+	* TestUnwind.java: Update.
+	* cni/UnwindH.hxx (find_proc_info): Update.
+	(TARGET::createProcInfoFromElfImage): Update.
+
 2008-05-23  Andrew Cagney  <cagney@redhat.com>
 
 	* Unwind.java (getContext): Change parameter to long.
diff --git a/frysk-sys/lib/unwind/Cursor.java b/frysk-sys/lib/unwind/Cursor.java
index ef559aa..da977c1 100644
--- a/frysk-sys/lib/unwind/Cursor.java
+++ b/frysk-sys/lib/unwind/Cursor.java
@@ -96,7 +96,7 @@ public class Cursor {
     }
   
     public ProcInfo getProcInfo () {
-	return unwinder.getProcInfo(unwCursor);
+	return new ProcInfo(unwinder, unwinder.getProcInfo(unwCursor));
     }
   
     public Cursor unwind() {
diff --git a/frysk-sys/lib/unwind/ProcInfo.java b/frysk-sys/lib/unwind/ProcInfo.java
index 988db81..77f31fe 100644
--- a/frysk-sys/lib/unwind/ProcInfo.java
+++ b/frysk-sys/lib/unwind/ProcInfo.java
@@ -40,28 +40,42 @@
 package lib.unwind;
 
 public class ProcInfo {
-    final Unwind unwinder;
+    private final Unwind unwinder;
     final long unwProcInfo;
-    final int error;
   
     ProcInfo(Unwind unwinder, long unwProcInfo) {
 	this.unwinder = unwinder;
-	this.error = 0;
 	this.unwProcInfo = unwProcInfo; 
     }
-    ProcInfo(int error) {
-	this.error = error;
-	this.unwinder = null;
-	this.unwProcInfo = 0;
-    }
     protected void finalize() {
 	unwinder.destroyProcInfo(unwProcInfo);
     }
   
-    public int getError() {
-	return error;
+    public int fillFromVDSO(AddressSpace addressSpace,
+			    long addressLow, long addressHigh,
+			    long offset, long ip,
+			    boolean needUnwindInfo) {
+	ElfImage elfImage = unwinder.createElfImageFromVDSO(addressSpace,
+							    addressLow,
+							    addressHigh,
+							    offset);
+	return unwinder.createProcInfoFromElfImage(addressSpace, ip,
+						   needUnwindInfo, elfImage,
+						   this);
     }
-  
+
+    public int fillFromElfImage(AddressSpace addressSpace,
+				String name,
+				long addressLow, long addressHigh,
+				long offset, long ip,
+				boolean needUnwindInfo) {
+	ElfImage elfImage = ElfImage.mapElfImage(name, addressLow, addressHigh,
+						 offset);
+	return unwinder.createProcInfoFromElfImage(addressSpace, ip,
+						   needUnwindInfo, elfImage,
+						   this);
+    }
+
     public long getStartIP() {
 	return unwinder.getStartIP(unwProcInfo);
     }
@@ -99,9 +113,6 @@ public class ProcInfo {
     }
   
     public String toString() {
-	if (error != 0)
-	    return "ProcInfo Error: " + error;
-
 	return "ProcInfo startIP: 0x" + Long.toHexString(getStartIP()) 
 	    + " endIP: 0x" + Long.toHexString(getEndIP())
 	    + " lsda: " + getLSDA()
@@ -110,6 +121,6 @@ public class ProcInfo {
 	    + " flags: " + getFlags()
 	    + " format: " + getFormat()
 	    + " unwindInfoSize: " + getUnwindInfoSize() 
-	    + " hasUnwindInfo: " + getUnwindInfo();
+	    + " unwindInfo: " + getUnwindInfo();
     }
 }
diff --git a/frysk-sys/lib/unwind/TestUnwind.java b/frysk-sys/lib/unwind/TestUnwind.java
index ddd25a7..687f2d9 100644
--- a/frysk-sys/lib/unwind/TestUnwind.java
+++ b/frysk-sys/lib/unwind/TestUnwind.java
@@ -67,8 +67,9 @@ public class TestUnwind
 	}
 	public void setReg(Number regnum, long regval) {
 	}
-	public ProcInfo findProcInfo (long ip, boolean needUnwindInfo) {
-	    return null;
+	public int findProcInfo(long ip, boolean needUnwindInfo,
+				ProcInfo procInfo) {
+	    return -1;
 	}
 	public int getDynInfoListAddr (byte[] dilap) {
 	    return 0;
diff --git a/frysk-sys/lib/unwind/Unwind.java b/frysk-sys/lib/unwind/Unwind.java
index 12db5fe..79afbf7 100644
--- a/frysk-sys/lib/unwind/Unwind.java
+++ b/frysk-sys/lib/unwind/Unwind.java
@@ -73,10 +73,11 @@ public abstract class Unwind {
     abstract int getContext(long context);
  
     // FIXME: shouldn't be public.
-    public abstract ProcInfo createProcInfoFromElfImage(AddressSpace addressSpace,
-							long ip, 
-							boolean needUnwindInfo,
-							ElfImage elfImage);
+    public abstract int createProcInfoFromElfImage(AddressSpace addressSpace,
+						   long ip, 
+						   boolean needUnwindInfo,
+						   ElfImage elfImage,
+						   ProcInfo procInfo);
  
     // FIXME: shouldn't be public.
     public abstract ElfImage createElfImageFromVDSO(AddressSpace addressSpace, 
@@ -84,7 +85,7 @@ public abstract class Unwind {
 						    long mapoff);
 
 
-    abstract ProcInfo getProcInfo(long unwCursor);
+    abstract long getProcInfo(long unwCursor);
     abstract void destroyProcInfo(long unwProcInfo);
 
     abstract long getStartIP(long unwProcInfo);
diff --git a/frysk-sys/lib/unwind/cni/UnwindH.hxx b/frysk-sys/lib/unwind/cni/UnwindH.hxx
index c22b20e..3d24398 100644
--- a/frysk-sys/lib/unwind/cni/UnwindH.hxx
+++ b/frysk-sys/lib/unwind/cni/UnwindH.hxx
@@ -99,10 +99,13 @@ find_proc_info(::unw_addr_space_t as, ::unw_word_t ip,
 	       ::unw_proc_info_t *pip, int need_unwind_info,
 	       void *addressSpace)
 {
-  ProcInfo* procInfo 
-    = vec(addressSpace)->findProcInfo((jlong) ip, (jboolean) need_unwind_info);
-  if (procInfo->error != 0)
-    return procInfo->error;
+  ProcInfo* procInfo = new ProcInfo(vec(addressSpace)->unwinder,
+				    (long) JvMalloc(sizeof(unw_proc_info_t)));
+  int ok = vec(addressSpace)->findProcInfo((jlong)ip,
+					   (jboolean)need_unwind_info,
+					   procInfo);
+  if (ok < 0)
+    return ok;
   // Extract the info.
   memcpy(pip, (void*) procInfo->unwProcInfo, sizeof (unw_proc_info_t));
   return 0;
@@ -419,21 +422,20 @@ TARGET::copyCursor(jlong unwCursor) {
   return (jlong) nativeCursor;
 }
 
-ProcInfo*
+jlong
 TARGET::getProcInfo(jlong unwCursor) {
   logf(fine, this, "getProcInfo cursor: %lx", (long) unwCursor);
   unw_proc_info_t *procInfo
     = (::unw_proc_info_t *) JvMalloc(sizeof (::unw_proc_info_t));
   int ret = unw_get_proc_info((::unw_cursor_t*) (long) unwCursor, procInfo);
 
-  logf(fine, this, "getProcInfo finished get_proc_info");
-  ProcInfo * myInfo;
-  if (ret < 0)
-    myInfo = new ProcInfo((jint) ret);
-  else
-    myInfo = new ProcInfo(this, (jlong) procInfo);
-  log(fine, this, "getProcInfo returned", myInfo);
-  return myInfo;
+  logf(fine, this, "getProcInfo finished get_proc_info %lx", (jlong) procInfo);
+  if (ret < 0) {
+    JvFree(procInfo);
+    return 0;
+  } else {
+    return (jlong)procInfo;
+  }
 }
 
 void
@@ -599,21 +601,20 @@ local_access_mem(unw_addr_space_t as, unw_word_t addr,
 static unw_accessors_t local_accessors
 = {NULL, NULL, NULL, local_access_mem, NULL, NULL, NULL, NULL};
 
-ProcInfo*
+jint
 TARGET::createProcInfoFromElfImage(AddressSpace* addressSpace,
 				   jlong ip,
 				   jboolean needUnwindInfo,
-				   ElfImage* elfImage) {
+				   ElfImage* elfImage,
+				   ProcInfo* procInfo) {
   if (elfImage == NULL || elfImage->ret != 0)
-    return new ProcInfo(-UNW_ENOINFO);
-
-  unw_proc_info_t *procInfo
-    = (::unw_proc_info_t *) JvMalloc(sizeof (::unw_proc_info_t));
+    return -UNW_ENOINFO;
 
+  unw_proc_info_t* unwProcInfo = (unw_proc_info_t*) procInfo->unwProcInfo;
   logf(fine, this, "Pre unw_get_unwind_table");
   
   unw_word_t peh_vaddr = 0;
-  char *eh_table_hdr = get_eh_frame_hdr_addr(procInfo,
+  char *eh_table_hdr = get_eh_frame_hdr_addr(unwProcInfo,
 					     (char *) elfImage->elfImage,
 					     elfImage->size,
 					     elfImage->segbase,
@@ -626,12 +627,12 @@ TARGET::createProcInfoFromElfImage(AddressSpace* addressSpace,
   //fprintf(stderr, "%s: %p\n", buffer, eh_table_hdr);
 
   if (eh_table_hdr == NULL)
-    return new ProcInfo(-UNW_ENOINFO);
+    return -UNW_ENOINFO;
 
   int ret;
-  if (procInfo->format == UNW_INFO_FORMAT_REMOTE_TABLE)
+  if (unwProcInfo->format == UNW_INFO_FORMAT_REMOTE_TABLE)
     ret = unw_get_unwind_table((unw_word_t) ip,
-			       procInfo,
+			       unwProcInfo,
 			       (int) needUnwindInfo,
 			       &local_accessors,
 			       // virtual address
@@ -640,7 +641,7 @@ TARGET::createProcInfoFromElfImage(AddressSpace* addressSpace,
 			       eh_table_hdr - peh_vaddr);
   else
     ret = unw_get_unwind_table((unw_word_t) ip,
-                               procInfo,
+                               unwProcInfo,
                                (int) needUnwindInfo,
                                &local_accessors,
                                // virtual address
@@ -649,14 +650,8 @@ TARGET::createProcInfoFromElfImage(AddressSpace* addressSpace,
                                eh_table_hdr);
   
   
-  logf(fine, this, "Post unw_get_unwind_table");
-  ProcInfo *myInfo;
-  if (ret < 0)
-    myInfo = new ProcInfo((jint) ret);
-  else
-    myInfo = new ProcInfo(this, (jlong) procInfo);
-
-  return myInfo;
+  logf(fine, this, "Post unw_get_unwind_table %d", ret);
+  return ret;
 }
 
 ElfImage*


hooks/post-receive
--
frysk system monitor/debugger


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-05-24 14:41 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-05-24 14:41 [SCM] master: Move unwind proc-info filling code into ProcInfo from LibunwindAddressSpace cagney

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).