From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 22477 invoked by alias); 8 Jan 2008 00:10:53 -0000 Received: (qmail 22435 invoked by uid 9629); 8 Jan 2008 00:10:47 -0000 Date: Tue, 08 Jan 2008 00:10:00 -0000 Message-ID: <20080108001047.22418.qmail@sourceware.org> From: npremji@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Added (C) to frysk-sys/frysk/CompilerVersion.java and wrapped CompilerVersion.cxx methods with "#ifdef ... #else return -1" for non gnu compiler support. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: a0deee775fc738e37ff3ccf5ecb1c774c8016c9c X-Git-Newrev: 8ef752b059d5ef9aab05f147a729452efea6afbe 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-q1/txt/msg00025.txt.bz2 The branch, master has been updated via 8ef752b059d5ef9aab05f147a729452efea6afbe (commit) via d4254717bf0c43cbeeda8a57794d5882a7eca924 (commit) via 22c8ac06d2ee31a28bdceb57e81e78de194f3337 (commit) via c9151b8cf38a6a3d558ea119d4cf1fad180a4518 (commit) via 0ac6ddd2b5e8d1a23b9e867de0f6408cc927646e (commit) via dcc3d7c8a382c04bd95f9e42e2687f8ea8ec2b56 (commit) from a0deee775fc738e37ff3ccf5ecb1c774c8016c9c (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 8ef752b059d5ef9aab05f147a729452efea6afbe Author: Nurdin Premji Date: Mon Jan 7 19:09:46 2008 -0500 Added (C) to frysk-sys/frysk/CompilerVersion.java and wrapped CompilerVersion.cxx methods with "#ifdef ... #else return -1" for non gnu compiler support. commit d4254717bf0c43cbeeda8a57794d5882a7eca924 Author: Nurdin Premji Date: Mon Jan 7 18:57:07 2008 -0500 Updated frysk.value.TestClass commit 22c8ac06d2ee31a28bdceb57e81e78de194f3337 Author: Nurdin Premji Date: Mon Jan 7 18:54:43 2008 -0500 Update logger, added CompilerVersionFactory to decode compiler versions. commit c9151b8cf38a6a3d558ea119d4cf1fad180a4518 Author: Nurdin Premji Date: Mon Jan 7 17:00:51 2008 -0500 Update ChangeLog, added finest logs to Log.java commit 0ac6ddd2b5e8d1a23b9e867de0f6408cc927646e Author: Nurdin Premji Date: Mon Jan 7 16:59:58 2008 -0500 Clean up logs, variable names for compiler class type support. commit dcc3d7c8a382c04bd95f9e42e2687f8ea8ec2b56 Author: Nurdin Premji Date: Fri Jan 4 20:41:04 2008 -0500 For Bugzilla 5518 Compiler support DWTag.CLASS_TYPE ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/debuginfo/ChangeLog | 18 ++ .../CompilerVersion.java} | 28 ++-- .../frysk/debuginfo/CompilerVersionFactory.java | 48 ++++ ...nfoFrame.java => GNURedHatCompilerVersion.java} | 32 ++-- frysk-core/frysk/debuginfo/TypeEntry.java | 226 ++++++++++++-------- frysk-core/frysk/pkglibdir/ChangeLog | 12 +- frysk-core/frysk/pkglibdir/funit-complex-class.cxx | 20 ++ .../frysk/pkglibdir/funit-complex-struct.cxx | 16 ++ .../frysk/pkglibdir/funit-inherited-struct.cxx | 21 ++ frysk-core/frysk/pkglibdir/funit-simple-class.cxx | 16 ++ frysk-core/frysk/pkglibdir/funit-simple-struct.cxx | 15 ++ frysk-core/frysk/value/ChangeLog | 14 ++ frysk-core/frysk/value/ClassType.java | 2 +- frysk-core/frysk/value/TestClass.java | 80 +++++++ frysk-sys/frysk/ChangeLog | 14 +- .../frysk/CompilerVersion.java | 15 +- .../cni/CompilerVersion.cxx} | 49 +++-- frysk-sys/frysk/junit/ChangeLog | 4 +- frysk-sys/frysk/junit/TestCase.java | 15 ++ frysk-sys/frysk/rsl/ChangeLog | 9 + frysk-sys/frysk/rsl/Log.java | 17 ++ frysk-sys/lib/dwfl/ChangeLog | 7 +- frysk-sys/lib/dwfl/DwarfDie.java | 11 + frysk-sys/lib/dwfl/cni/DwarfDie.cxx | 19 ++ 24 files changed, 554 insertions(+), 154 deletions(-) copy frysk-core/frysk/{proc/live/LinuxPPC32.java => debuginfo/CompilerVersion.java} (84%) create mode 100644 frysk-core/frysk/debuginfo/CompilerVersionFactory.java copy frysk-core/frysk/debuginfo/{VirtualDebugInfoFrame.java => GNURedHatCompilerVersion.java} (78%) create mode 100644 frysk-core/frysk/pkglibdir/funit-complex-class.cxx create mode 100644 frysk-core/frysk/pkglibdir/funit-complex-struct.cxx create mode 100644 frysk-core/frysk/pkglibdir/funit-inherited-struct.cxx create mode 100644 frysk-core/frysk/pkglibdir/funit-simple-class.cxx create mode 100644 frysk-core/frysk/pkglibdir/funit-simple-struct.cxx create mode 100644 frysk-core/frysk/value/TestClass.java copy frysk-core/frysk/debuginfo/ValueUavailableException.java => frysk-sys/frysk/CompilerVersion.java (89%) copy frysk-sys/{lib/dwfl/cni/ElfArchiveSymbol.cxx => frysk/cni/CompilerVersion.cxx} (79%) First 500 lines of diff: diff --git a/frysk-core/frysk/debuginfo/ChangeLog b/frysk-core/frysk/debuginfo/ChangeLog index c38d9f8..4730e4f 100644 --- a/frysk-core/frysk/debuginfo/ChangeLog +++ b/frysk-core/frysk/debuginfo/ChangeLog @@ -1,3 +1,21 @@ +2008-01-07 Nurdin Premji + + * CompilerVersion: New. + * CompilerVersionFactory: New. + * GNURedHatCompilerVersion: New. + * TypeEntry: Moved compiler version decoding to the +*CompilerVersion classes. + +2008-01-04 Nurdin Premji + + * TypeEntry.java: Added rsl loggers. + (addMembers): New. + (compilerSupportsClassType): New + (getClassType): New. + (getStructOrClassType): Return composite type, use addMembers, check for + compiler supporting ClassType. + (getType): Added support for compilers supporting DWTag.CLASS_TYPE_ + 2007-12-13 Sami Wagiaalla * TypeEntry.java: Use SourceLocation instead of LineColPair. diff --git a/frysk-core/frysk/proc/live/LinuxPPC32.java b/frysk-core/frysk/debuginfo/CompilerVersion.java similarity index 84% copy from frysk-core/frysk/proc/live/LinuxPPC32.java copy to frysk-core/frysk/debuginfo/CompilerVersion.java index 522e8aa..eb50621 100644 --- a/frysk-core/frysk/proc/live/LinuxPPC32.java +++ b/frysk-core/frysk/debuginfo/CompilerVersion.java @@ -1,6 +1,5 @@ // This file is part of the program FRYSK. // -// Copyright 2006 IBM Corp. // Copyright 2008, Red Hat Inc. // // FRYSK is free software; you can redistribute it and/or modify it @@ -11,11 +10,11 @@ // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with FRYSK; if not, write to the Free Software Foundation, // Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. -// +// // In addition, as a special exception, Red Hat, Inc. gives You the // additional right to link the code of FRYSK with code not covered // under the GNU General Public License ("Non-GPL Code") and to @@ -38,21 +37,22 @@ // version and license this file solely under the GPL without // exception. -package frysk.proc.live; +package frysk.debuginfo; -import frysk.isa.PPC32Registers; +import frysk.rsl.Log; -class LinuxPPC32 extends IsaPowerPC { +public class CompilerVersion { - LinuxPPC32() { - //In Power32 the PC will be in Link Register - super(PPC32Registers.LR); + protected static Log fine = Log.fine(CompilerVersion.class); + public final String compilerString; + + CompilerVersion(String compString) { + this.compilerString = compString; + fine.log(this, "Created compilerVersion for:", compString); } - private static LinuxPPC32 isa; - static LinuxPPC32 isaSingleton () { - if (isa == null) - isa = new LinuxPPC32 (); - return isa; + public boolean supportsClassType() { + return false; } + } diff --git a/frysk-core/frysk/debuginfo/CompilerVersionFactory.java b/frysk-core/frysk/debuginfo/CompilerVersionFactory.java new file mode 100644 index 0000000..cd12bdd --- /dev/null +++ b/frysk-core/frysk/debuginfo/CompilerVersionFactory.java @@ -0,0 +1,48 @@ +package frysk.debuginfo; + +import java.util.HashMap; +import frysk.rsl.Log; + +public class CompilerVersionFactory { + private static HashMap compilerVersions = new HashMap(); + protected static Log fine = Log.fine(CompilerVersionFactory.class); + protected static Log finest = Log.finest(CompilerVersionFactory.class); + + public static CompilerVersion getCompilerVersion(String compiler) { + if (compilerVersions.containsKey(compiler)) + return (CompilerVersion) compilerVersions.get(compiler); + + // XXX: GNU C specific. + fine.log("Found compiler: ", compiler); + + CompilerVersion compVersion; + + // String looks like: GNU C++ 4.1.2 20070925 (Red Hat 4.1.2-33) + // + if (!compiler.matches("GNU C.*\\(Red Hat \\d+\\.\\d+\\.\\d+-\\d+\\)")) { + compVersion = new CompilerVersion(compiler); + } else { + String preCompilerVersion = "(Red Hat "; + + String compilerVersion = compiler.substring(compiler + .indexOf(preCompilerVersion) + + preCompilerVersion.length(), compiler.lastIndexOf(')')); + + String[] versions = compilerVersion.split("\\."); + + finest.log("Version string has 3 sections"); + + int version = Integer.parseInt(versions[0]); + int minorVersion = Integer.parseInt(versions[1]); + + String[] minorVersions = versions[2].split("-"); + + int patchLevel = Integer.parseInt(minorVersions[0]); + int RHRelease = Integer.parseInt(minorVersions[1]); + compVersion = new GNURedHatCompilerVersion(compiler, version, + minorVersion, patchLevel, RHRelease); + } + compilerVersions.put(compiler, compVersion); + return compVersion; + } +} diff --git a/frysk-core/frysk/debuginfo/VirtualDebugInfoFrame.java b/frysk-core/frysk/debuginfo/GNURedHatCompilerVersion.java similarity index 78% copy from frysk-core/frysk/debuginfo/VirtualDebugInfoFrame.java copy to frysk-core/frysk/debuginfo/GNURedHatCompilerVersion.java index ae3ed76..cb0ccd1 100644 --- a/frysk-core/frysk/debuginfo/VirtualDebugInfoFrame.java +++ b/frysk-core/frysk/debuginfo/GNURedHatCompilerVersion.java @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2007, Red Hat Inc. +// Copyright 2008, Red Hat Inc. // // FRYSK is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by @@ -39,23 +39,25 @@ package frysk.debuginfo; -import java.io.PrintWriter; -import frysk.stack.Frame; -import frysk.stack.FrameDecorator; +public class GNURedHatCompilerVersion extends CompilerVersion { -public class VirtualDebugInfoFrame extends DebugInfoFrame { + private int version; + private int minorVersion; + private int patchLevel; + private int RHRelease; - /** - * Create a frame, outer to OUTER, and decorating frame. - */ - protected VirtualDebugInfoFrame(FrameDecorator inner, Frame decorated) { - super(inner, decorated); - } + public GNURedHatCompilerVersion(String string, int version, + int minorVersion, int patchLevel, int RHRelease) { + super(string); - public void toPrint(PrintWriter writer, boolean printParameters, - boolean fullpath) { - super.toPrint(writer, printParameters, fullpath); - writer.print(" [inline]"); + this.version = version; + this.minorVersion = minorVersion; + this.patchLevel = patchLevel; + this.RHRelease = RHRelease; } + public boolean supportsClassType() { + return version >= 4 && minorVersion >= 1 && patchLevel >= 2 + && RHRelease >= 37; + } } diff --git a/frysk-core/frysk/debuginfo/TypeEntry.java b/frysk-core/frysk/debuginfo/TypeEntry.java index 9d9ed3b..3ad41da 100644 --- a/frysk-core/frysk/debuginfo/TypeEntry.java +++ b/frysk-core/frysk/debuginfo/TypeEntry.java @@ -40,10 +40,13 @@ package frysk.debuginfo; import frysk.isa.ISA; +import frysk.rsl.Log; import frysk.scopes.SourceLocation; import frysk.value.Access; import frysk.value.ArrayType; import frysk.value.CharType; +import frysk.value.ClassType; +import frysk.value.CompositeType; import frysk.value.ConstType; import frysk.value.EnumType; import frysk.value.FloatingPointType; @@ -52,6 +55,7 @@ import frysk.value.GccStructOrClassType; import frysk.value.PointerType; import frysk.value.ReferenceType; import frysk.value.SignedType; +import frysk.value.StructType; import frysk.value.Type; import frysk.value.TypeDef; import frysk.value.UnionType; @@ -74,6 +78,8 @@ import lib.dwfl.DwarfDie; public class TypeEntry { + static protected Log fine = Log.fine(TypeEntry.class); + static protected Log finest = Log.finest(TypeEntry.class); private final ByteOrder byteorder; private final HashMap dieHash; @@ -118,7 +124,98 @@ public class TypeEntry arrayType = new ArrayType(type, elementCount * typeSize, dims); return arrayType; } + + + private void addMembers(DwarfDie classDie, CompositeType classType) { + LocationExpression locationExpression = null; + + for (DwarfDie member = classDie.getChild(); + member != null; + member = member.getSibling()) { + + dumpDie("member=", member); + boolean staticMember = false; + long offset; + try { + offset = member.getDataMemberLocation(); + } catch (DwAttributeNotFoundException de) { + offset = 0; // union + staticMember = true; + if(member.isDeclaration()){ + locationExpression = new LocationExpression(member.getDefinition()); + }else{ + locationExpression = new LocationExpression(member); + } + + } + + SourceLocation sourceLocation; + try{ + sourceLocation = new SourceLocation(member.getDeclFile(), member.getDeclLine(), member.getDeclColumn()); + }catch(DwAttributeNotFoundException e){ + sourceLocation = SourceLocation.UNKNOWN; + } + + Access access = null; + switch (member.getAttrConstant(DwAt.ACCESSIBILITY)) { + case DwAccess.PUBLIC_: access = Access.PUBLIC; break; + case DwAccess.PROTECTED_: access = Access.PROTECTED; break; + case DwAccess.PRIVATE_: access = Access.PRIVATE; break; + } + + if (member.getTag() == DwTag.SUBPROGRAM) { + Value v = getSubprogramValue(member); + if(hasArtifitialParameter(member)){ + classType.addMember(member.getName(), sourceLocation, v.getType(), offset, access); + }else{ + classType.addStaticMember(locationExpression, member.getName(), sourceLocation, v.getType(), offset, access); + } + continue; + } + +// DwarfDie memberDieType = member.getUltimateType(); +// if (memberDieType == null) +// continue; + + Type memberType = getType (member.getType()); + if (memberType instanceof UnknownType == false) { + // System V ABI Supplements discuss bit field layout + int bitSize = member + .getAttrConstant(DwAt.BIT_SIZE); + if (bitSize != -1) { + int bitOffset = member + .getAttrConstant(DwAt.BIT_OFFSET); + if(staticMember){ + classType.addStaticBitFieldMember(locationExpression, member.getName(), sourceLocation, memberType, offset, access, + bitOffset, bitSize); + }else{ + classType.addBitFieldMember(member.getName(), sourceLocation, memberType, offset, access, + bitOffset, bitSize); + } + } + else{ + if(staticMember){ + classType.addStaticMember(locationExpression, member.getName(), sourceLocation, memberType, offset, access); + }else{ + classType.addMember(member.getName(), sourceLocation, memberType, offset, access); + } + + } + continue; + } + else{ + if(staticMember){ + classType.addStaticMember(locationExpression, member.getName(), sourceLocation, new UnknownType(member + .getName()), offset, access); + }else{ + classType.addMember(member.getName(), sourceLocation, new UnknownType(member + .getName()), offset, access); + } + } +} + } + /** * @param classDie * A struct die @@ -126,100 +223,43 @@ public class TypeEntry * Name of the struct * @return GccStructOrClassType for the struct */ - public GccStructOrClassType getGccStructOrClassType(DwarfDie classDie, String name) { - - LocationExpression locationExpression = null; + public CompositeType getGccStructOrClassType(DwarfDie classDie, String name) { + dumpDie("structOrClassDie=", classDie); - dumpDie("classDie=", classDie); + CompositeType type; - GccStructOrClassType classType = new GccStructOrClassType(name, getByteSize(classDie)); - - for (DwarfDie member = classDie.getChild(); - member != null; - member = member.getSibling()) { - - dumpDie("member=", member); - - boolean staticMember = false; - long offset; - try { - offset = member.getDataMemberLocation(); - } catch (DwAttributeNotFoundException de) { - offset = 0; // union - staticMember = true; - if(member.isDeclaration()){ - locationExpression = new LocationExpression(member.getDefinition()); - }else{ - locationExpression = new LocationExpression(member); - } + String compiler = classDie.getProducer(); + boolean supportsClassType = CompilerVersionFactory.getCompilerVersion(compiler).supportsClassType(); + fine.log("Compiler support determined as:" + supportsClassType); - } - - SourceLocation sourceLocation; - try{ - sourceLocation = new SourceLocation(member.getDeclFile(), member.getDeclLine(), member.getDeclColumn()); - }catch(DwAttributeNotFoundException e){ - sourceLocation = SourceLocation.UNKNOWN; - } - - Access access = null; - switch (member.getAttrConstant(DwAt.ACCESSIBILITY)) { - case DwAccess.PUBLIC_: access = Access.PUBLIC; break; - case DwAccess.PROTECTED_: access = Access.PROTECTED; break; - case DwAccess.PRIVATE_: access = Access.PRIVATE; break; - } - - if (member.getTag() == DwTag.SUBPROGRAM) { - Value v = getSubprogramValue(member); - if(hasArtifitialParameter(member)){ - classType.addMember(member.getName(), sourceLocation, v.getType(), offset, access); - }else{ - classType.addStaticMember(locationExpression, member.getName(), sourceLocation, v.getType(), offset, access); - } - continue; - } - -// DwarfDie memberDieType = member.getUltimateType(); -// if (memberDieType == null) -// continue; + /* + * If the compiler supported class types and this was a class, it would + * have been detected as a ClassType. Since it was not, it must be a + * struct + */ + if (supportsClassType) + type = new StructType(name, getByteSize(classDie)); + else + type = new GccStructOrClassType(name, getByteSize(classDie)); - Type memberType = getType (member.getType()); - if (memberType instanceof UnknownType == false) { - // System V ABI Supplements discuss bit field layout - int bitSize = member - .getAttrConstant(DwAt.BIT_SIZE); - if (bitSize != -1) { - int bitOffset = member - .getAttrConstant(DwAt.BIT_OFFSET); - if(staticMember){ - classType.addStaticBitFieldMember(locationExpression, member.getName(), sourceLocation, memberType, offset, access, - bitOffset, bitSize); - }else{ - classType.addBitFieldMember(member.getName(), sourceLocation, memberType, offset, access, - bitOffset, bitSize); - } - } - else{ - if(staticMember){ - classType.addStaticMember(locationExpression, member.getName(), sourceLocation, memberType, offset, access); - }else{ - classType.addMember(member.getName(), sourceLocation, memberType, offset, access); - } - - } - continue; - } - else{ - if(staticMember){ - classType.addStaticMember(locationExpression, member.getName(), sourceLocation, new UnknownType(member - .getName()), offset, access); - }else{ - classType.addMember(member.getName(), sourceLocation, new UnknownType(member - .getName()), offset, access); - } - } - } + addMembers(classDie, type); + return type; + } + + /** + * + * @param classDie + * A class die + * @param name + * Name of the class + * @return ClassType for the class. + */ + public ClassType getClassType(DwarfDie classDie, String name) { + dumpDie("classDie=", classDie); + + ClassType classType = new ClassType(name, getByteSize(classDie)); + addMembers(classDie, classType); return classType; } @@ -403,11 +443,17 @@ public class TypeEntry break; } case DwTag.STRUCTURE_TYPE_: { - GccStructOrClassType classType = + CompositeType classType = getGccStructOrClassType(type, typeDie.getName()); returnType = classType; break; } + case DwTag.CLASS_TYPE_: { + ClassType classType = + getClassType(type, typeDie.getName()); + returnType = classType; + break; + } case DwTag.ENUMERATION_TYPE_: { DwarfDie subrange = type.getChild(); EnumType enumType = new EnumType(typeDie.getName(), diff --git a/frysk-core/frysk/pkglibdir/ChangeLog b/frysk-core/frysk/pkglibdir/ChangeLog index 21191c8..4b1f933 100644 --- a/frysk-core/frysk/pkglibdir/ChangeLog +++ b/frysk-core/frysk/pkglibdir/ChangeLog @@ -1,7 +1,13 @@ -2008-01-02 Tim Moore +2007-01-04 Nurdin Premji + * funit-complex-class.cxx: New + * funit-complex-struct.cxx: New + * funit-inherited-struct.cxx: New + * funit-simple-class.cxx: New + * funit-simple-struct.cxx: New - * funit-structmember.c: New test with structure member and function - that share a name. +2008-01-02 Tim Moore + * funit-structmember.c: New test with structure member and function hooks/post-receive -- frysk system monitor/debugger