public inbox for frysk-cvs@sourceware.org help / color / mirror / Atom feed
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. Date: Tue, 08 Jan 2008 00:10:00 -0000 [thread overview] Message-ID: <20080108001047.22418.qmail@sourceware.org> (raw) 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 <nurdin@localhost.localdomain> 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 <nurdin@localhost.localdomain> Date: Mon Jan 7 18:57:07 2008 -0500 Updated frysk.value.TestClass commit 22c8ac06d2ee31a28bdceb57e81e78de194f3337 Author: Nurdin Premji <nurdin@localhost.localdomain> Date: Mon Jan 7 18:54:43 2008 -0500 Update logger, added CompilerVersionFactory to decode compiler versions. commit c9151b8cf38a6a3d558ea119d4cf1fad180a4518 Author: Nurdin Premji <nurdin@localhost.localdomain> Date: Mon Jan 7 17:00:51 2008 -0500 Update ChangeLog, added finest logs to Log.java commit 0ac6ddd2b5e8d1a23b9e867de0f6408cc927646e Author: Nurdin Premji <nurdin@localhost.localdomain> Date: Mon Jan 7 16:59:58 2008 -0500 Clean up logs, variable names for compiler class type support. commit dcc3d7c8a382c04bd95f9e42e2687f8ea8ec2b56 Author: Nurdin Premji <nurdin@localhost.localdomain> 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 <npremji@redhat.com> + + * CompilerVersion: New. + * CompilerVersionFactory: New. + * GNURedHatCompilerVersion: New. + * TypeEntry: Moved compiler version decoding to the +*CompilerVersion classes. + +2008-01-04 Nurdin Premji <npremji@redhat.com> + + * 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 <swagiaal@redhat.com> * 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 <timoore@redhat.com> +2007-01-04 Nurdin Premji <npremji@redhat.com> + * 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 <timoore@redhat.com> + * funit-structmember.c: New test with structure member and function hooks/post-receive -- frysk system monitor/debugger
reply other threads:[~2008-01-08 0:10 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=20080108001047.22418.qmail@sourceware.org \ --to=npremji@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).