public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Move unwind proc-info filling code into ProcInfo from LibunwindAddressSpace.
Date: Sat, 24 May 2008 14:41:00 -0000	[thread overview]
Message-ID: <20080524144101.7411.qmail@sourceware.org> (raw)

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


                 reply	other threads:[~2008-05-24 14:41 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080524144101.7411.qmail@sourceware.org \
    --to=cagney@sourceware.org \
    --cc=frysk-cvs@sourceware.org \
    --cc=frysk@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).