From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7453 invoked by alias); 24 May 2008 14:41:01 -0000 Received: (qmail 7426 invoked by uid 367); 24 May 2008 14:41:01 -0000 Date: Sat, 24 May 2008 14:41:00 -0000 Message-ID: <20080524144101.7411.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Move unwind proc-info filling code into ProcInfo from LibunwindAddressSpace. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 91e7054ffd1505588013927d9b3e006676fd09d8 X-Git-Newrev: 55130603149765b7e8e3394cd806b2be65567cba Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q2/txt/msg00280.txt.bz2 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 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 * LibunwindAddressSpace.java (procInfo): Delete. (getElfImage(long)): Delete. (findProcInfo): Use ProcInfo.fillFromElfImage et.al. methods. frysk-sys/lib/unwind/ChangeLog 2008-05-24 Andrew Cagney * 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 + + * LibunwindAddressSpace.java (procInfo): Delete. + (getElfImage(long)): Delete. + (findProcInfo): Use ProcInfo.fillFromElfImage et.al. methods. + 2008-05-23 Andrew Cagney * 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 + + * 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 * 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