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: linkBe 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).