From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30575 invoked by alias); 30 Apr 2008 14:31:44 -0000 Received: (qmail 30540 invoked by uid 440); 30 Apr 2008 14:31:42 -0000 Date: Wed, 30 Apr 2008 14:31:00 -0000 Message-ID: <20080430143142.30524.qmail@sourceware.org> From: scox@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Allow for "this" return and parameter values. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 3bb4b28cd96c352cb0a082348952649e00a94c01 X-Git-Newrev: a59ea0b8b7085297913ab65143244b6226ed5530 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/msg00164.txt.bz2 The branch, master has been updated via a59ea0b8b7085297913ab65143244b6226ed5530 (commit) from 3bb4b28cd96c352cb0a082348952649e00a94c01 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit a59ea0b8b7085297913ab65143244b6226ed5530 Author: Stan Cox Date: Wed Apr 30 10:25:50 2008 -0400 Allow for "this" return and parameter values. * TypeFactory.java (getGccStructOrClassType): Set dieHash. (getClassType): Likewise. (getUnionType): Likewise. (getType): Set "this" reference from dieHash. * Type.java (toPrintBrief): New. * PointerType.java (toPrintBrief): New. * CompositeType.java (toPrintBrief): New. * TypeDecorator.java (toPrintBrief): New. * FunctionType.java (toPrint): Use toPrintBrief. * DebugInfo.java (what): Check type value. * funit-type-class.cxx (class_nested_class): New. (class_ref_method): New. ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/debuginfo/ChangeLog | 8 +++++ frysk-core/frysk/debuginfo/DebugInfo.java | 3 +- frysk-core/frysk/debuginfo/TypeFactory.java | 14 +++++---- frysk-core/frysk/pkglibdir/ChangeLog | 5 +++ frysk-core/frysk/pkglibdir/funit-type-class.cxx | 36 +++++++++++++++++++++- frysk-core/frysk/value/ChangeLog | 8 +++++ frysk-core/frysk/value/CompositeType.java | 4 ++ frysk-core/frysk/value/FunctionType.java | 4 +- frysk-core/frysk/value/PointerType.java | 6 ++++ frysk-core/frysk/value/Type.java | 8 +++++ frysk-core/frysk/value/TypeDecorator.java | 14 +++++++++ 11 files changed, 99 insertions(+), 11 deletions(-) First 500 lines of diff: diff --git a/frysk-core/frysk/debuginfo/ChangeLog b/frysk-core/frysk/debuginfo/ChangeLog index 8223710..9b5432c 100644 --- a/frysk-core/frysk/debuginfo/ChangeLog +++ b/frysk-core/frysk/debuginfo/ChangeLog @@ -1,3 +1,11 @@ +2008-04-30 Stan Cox + + * TypeFactory.java (getGccStructOrClassType): Set dieHash. + (getClassType): Likewise. + (getUnionType): Likewise. + (getType): Set "this" reference from dieHash. + * DebugInfo.java (what): Check type value. + 2008-04-25 Sami Wagiaalla * TestObjectDeclarationSearchEngineTopDown.java: New file. diff --git a/frysk-core/frysk/debuginfo/DebugInfo.java b/frysk-core/frysk/debuginfo/DebugInfo.java index a64ebfa..b9fa982 100644 --- a/frysk-core/frysk/debuginfo/DebugInfo.java +++ b/frysk-core/frysk/debuginfo/DebugInfo.java @@ -108,7 +108,8 @@ public class DebugInfo { case DwTag.TYPEDEF_: case DwTag.STRUCTURE_TYPE_: { Type type = typeFactory.getType(varDie.getType()); - result.append(type.toPrint()); + if (type != null) + result.append(type.toPrint()); break; } default: diff --git a/frysk-core/frysk/debuginfo/TypeFactory.java b/frysk-core/frysk/debuginfo/TypeFactory.java index f59d4e6..c0a4f69 100644 --- a/frysk-core/frysk/debuginfo/TypeFactory.java +++ b/frysk-core/frysk/debuginfo/TypeFactory.java @@ -170,7 +170,7 @@ public class TypeFactory { if (member.getTag() == DwTag.SUBPROGRAM) { Value v = getSubprogramValue(member); - if (hasArtifitialParameter(member)) { + if (hasArtificialParameter(member)) { classType.addMember(member.getName(), sourceLocation, v .getType(), offset, access); } else { @@ -255,6 +255,7 @@ public class TypeFactory { else type = new GccStructOrClassType(name, getByteSize(classDie)); + dieHash.put(new Long(classDie.getOffset()), type); addMembers(classDie, type); return type; @@ -272,6 +273,7 @@ public class TypeFactory { dumpDie("classDie=", classDie); ClassType classType = new ClassType(name, getByteSize(classDie)); + dieHash.put(new Long(classDie.getOffset()), classType); addMembers(classDie, classType); return classType; } @@ -295,7 +297,7 @@ public class TypeFactory { * @param die * @return */ - private boolean hasArtifitialParameter(DwarfDie die) { + private boolean hasArtificialParameter(DwarfDie die) { if (die == null || !(die.getTag().equals(DwTag.SUBPROGRAM) || die.getTag() .equals(DwTag.INLINED_SUBROUTINE))) { @@ -319,6 +321,8 @@ public class TypeFactory { dumpDie("unionDie=", classDie); UnionType classType = new UnionType(name, getByteSize(classDie)); + dieHash.put(new Long(classDie.getOffset()), classType); + for (DwarfDie member = classDie.getChild(); member != null; member = member.getSibling()) { @@ -435,10 +439,8 @@ public class TypeFactory { if (mappedType != null) return mappedType; else if (dieHash.containsKey(new Long(type.getOffset()))) { - // ??? will this always be a pointer to ourselves? - // Instead of VoidType, we need a way to reference ourselves - return new PointerType("", byteorder, getByteSize(type), - new VoidType()); + // This is a self reference + return (Type)dieHash.get(new Long(type.getOffset())); } dieHash.put(new Long(type.getOffset()), null); Type returnType = null; diff --git a/frysk-core/frysk/pkglibdir/ChangeLog b/frysk-core/frysk/pkglibdir/ChangeLog index 7cda937..85a7a4d 100644 --- a/frysk-core/frysk/pkglibdir/ChangeLog +++ b/frysk-core/frysk/pkglibdir/ChangeLog @@ -1,3 +1,8 @@ +2008-04-30 Stan Cox + + * funit-type-class.cxx (class_nested_class): New. + (class_ref_method): New. + 2008-04-25 Sami Wagiaalla * funit-scopes-multi-file-a.c: New file. diff --git a/frysk-core/frysk/pkglibdir/funit-type-class.cxx b/frysk-core/frysk/pkglibdir/funit-type-class.cxx index 25b1154..9898aa4 100644 --- a/frysk-core/frysk/pkglibdir/funit-type-class.cxx +++ b/frysk-core/frysk/pkglibdir/funit-type-class.cxx @@ -180,7 +180,7 @@ Type class_inherited_new = Type ("new base", "main", "new_base"); // Type: class Derived { // Type: struct Base3 { // Type: int (**_vptr.Base3) (); -// Type: void Base3 (void * const &); +// Type: void Base3 (const Base3 &); // Type: void Base3 (); // Type: char do_this (char); // Type: short int do_this (short int); @@ -188,7 +188,7 @@ Type class_inherited_new = Type ("new base", "main", "new_base"); // Type: float do_this (float); // Type: void ~Base3 (); // Type: } ; -// Type: void Derived (void * const &); +// Type: void Derived (const Derived &); // Type: void Derived (); // Type: char do_this (char); // Type: short int do_this (short int); @@ -216,6 +216,38 @@ func () crash(); } +class class_nested_class +{ +public: + class nested + { + public: + nested (int i) : z(i) {} + int z; + }; +} class_nested_class_v; + +// Name: class_nested_class_v +// Type: struct class_nested_class { +// Type: } + +class class_ref_method +{ + int z; + int get_z () {return z;} + class class_ref_method & get_this () {return *this;} + class class_ref_method * also_get_this () {return this;} +} class_ref_method_v; + +// Name: class_ref_method_v +// Type: class class_ref_method { +// Type: private: +// Type: int z; +// Type: int get_z (); +// Type: class_ref_method & get_this (); +// Type: class_ref_method * also_get_this (); +// Type: } + int main (int argc, char **argv) { diff --git a/frysk-core/frysk/value/ChangeLog b/frysk-core/frysk/value/ChangeLog index f174024..fdf4a5e 100644 --- a/frysk-core/frysk/value/ChangeLog +++ b/frysk-core/frysk/value/ChangeLog @@ -1,3 +1,11 @@ +2008-04-30 Stan Cox + + * Type.java (toPrintBrief): New. + * PointerType.java (toPrintBrief): New. + * CompositeType.java (toPrintBrief): New. + * TypeDecorator.java (toPrintBrief): New. + * FunctionType.java (toPrint): Use toPrintBrief. + 2008-04-24 Stan Cox * package.html: New file. diff --git a/frysk-core/frysk/value/CompositeType.java b/frysk-core/frysk/value/CompositeType.java index 269da18..846bd16 100644 --- a/frysk-core/frysk/value/CompositeType.java +++ b/frysk-core/frysk/value/CompositeType.java @@ -395,6 +395,10 @@ public abstract class CompositeType stringBuilderParm.insert(0, stringBuilder); } + public void toPrintBrief(StringBuilder stringBuilder, int indent) { + stringBuilder.insert(0, getName()); + } + public Value member(Value var1, String member) { DynamicMember mem = (DynamicMember)nameToMember.get(member); if (mem == null) diff --git a/frysk-core/frysk/value/FunctionType.java b/frysk-core/frysk/value/FunctionType.java index f504033..380c173 100644 --- a/frysk-core/frysk/value/FunctionType.java +++ b/frysk-core/frysk/value/FunctionType.java @@ -72,13 +72,13 @@ public class FunctionType if (returnType == null) parmStringBuilder.insert(0, "void"); else - returnType.toPrint(parmStringBuilder, 0); + returnType.toPrintBrief(parmStringBuilder, 0); parmStringBuilder.append(" "); stringBuilder.insert(0, parmStringBuilder); stringBuilder.append(" ("); for (int i = 0; i < this.parmTypes.size(); i++) { parmStringBuilder.delete(0, parmStringBuilder.length()); - ((Type)this.parmTypes.get(i)).toPrint(parmStringBuilder, 0); + ((Type)this.parmTypes.get(i)).toPrintBrief(parmStringBuilder, 0); parmStringBuilder.append((String)this.parmNames.get(i)); stringBuilder.append(parmStringBuilder); if (i < this.parmTypes.size() - 1) diff --git a/frysk-core/frysk/value/PointerType.java b/frysk-core/frysk/value/PointerType.java index 88dce56..bbf507a 100644 --- a/frysk-core/frysk/value/PointerType.java +++ b/frysk-core/frysk/value/PointerType.java @@ -137,6 +137,12 @@ public class PointerType } } + public void toPrintBrief(StringBuilder stringBuilder, int indent) { + stringBuilder.insert(0, getName()); + stringBuilder.insert(0, " "); + type.toPrintBrief(stringBuilder, indent); +} + protected Type clone(IntegerType accessor) { return new PointerType(getName(), order(), getSize(), type, accessor); } diff --git a/frysk-core/frysk/value/Type.java b/frysk-core/frysk/value/Type.java index 84f01a9..5ff9812 100644 --- a/frysk-core/frysk/value/Type.java +++ b/frysk-core/frysk/value/Type.java @@ -117,6 +117,14 @@ public abstract class Type { public abstract void toPrint(StringBuilder stringBuilder, int indent); /** + * Print this Type, possibly briefly, after indenting INDENT spaces. + * @param stringBuilder TODO + */ + public void toPrintBrief(StringBuilder stringBuilder, int indent) { + toPrint(stringBuilder, indent); + } + + /** * Print this Type to a StringBuffer and return the String. */ public final String toPrint() { diff --git a/frysk-core/frysk/value/TypeDecorator.java b/frysk-core/frysk/value/TypeDecorator.java index f151b09..176ee2a 100644 --- a/frysk-core/frysk/value/TypeDecorator.java +++ b/frysk-core/frysk/value/TypeDecorator.java @@ -90,6 +90,20 @@ abstract class TypeDecorator extends Type { } } + public void toPrintBrief(StringBuilder stringBuilder, int indent) { + if (getUltimateType() instanceof PointerType + || this instanceof ReferenceType) { + decorated.toPrintBrief(stringBuilder, 0); + stringBuilder.append(" "); + stringBuilder.append(getName()); + } + else { + decorated.toPrintBrief(stringBuilder, 0); + stringBuilder.insert(0, " "); + stringBuilder.insert(0, getName()); + } + } + void assign(Location location, Value value) { decorated.assign(location, value); } hooks/post-receive -- frysk system monitor/debugger