Hello community,
here is the log from the commit of package kcachegrind for openSUSE:Factory checked in at 2015-10-03 20:19:04
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/kcachegrind (Old)
and /work/SRC/openSUSE:Factory/.kcachegrind.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kcachegrind"
Changes:
--------
--- /work/SRC/openSUSE:Factory/kcachegrind/kcachegrind.changes 2015-07-14 17:32:31.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.kcachegrind.new/kcachegrind.changes 2015-10-03 20:19:06.000000000 +0200
@@ -1,0 +2,23 @@
+Sun Sep 13 19:01:39 UTC 2015 - tittiatcoke@gmail.com
+
+- Update to KDE Applications 15.08.1
+ * KDE Applications 15.08.1
+ * https://www.kde.org/announcements/announce-applications-15.08.1.php
+
+
+-------------------------------------------------------------------
+Wed Aug 19 19:42:50 UTC 2015 - cgiboudeaux@gmx.com
+
+- Update to KDE Applications 15.08.0
+ * KDE Applications 15.08.0
+ * https://www.kde.org/announcements/announce-applications-15.08.0.php
+
+-------------------------------------------------------------------
+Fri Aug 7 06:48:12 UTC 2015 - tittiatcoke@gmail.com
+
+- Update to KDE Applications 15.07.90
+ * KDE Applications 15.08.0 RC1
+ * https://www.kde.org/announcements/announce-applications-15.07.90.php
+
+
+-------------------------------------------------------------------
Old:
----
kcachegrind-15.04.3.tar.xz
New:
----
kcachegrind-15.08.1.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ kcachegrind.spec ++++++
--- /var/tmp/diff_new_pack.N2ywVa/_old 2015-10-03 20:19:07.000000000 +0200
+++ /var/tmp/diff_new_pack.N2ywVa/_new 2015-10-03 20:19:07.000000000 +0200
@@ -22,7 +22,7 @@
License: GPL-2.0 and BSD-4-Clause and GFDL-1.2
Group: Development/Tools/Other
Url: http://www.kde.org/
-Version: 15.04.3
+Version: 15.08.1
Release: 0
Source0: %{name}-%{version}.tar.xz
BuildRoot: %{_tmppath}/%{name}-%{version}-build
++++++ kcachegrind-15.04.3.tar.xz -> kcachegrind-15.08.1.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/README_DEVELOPER new/kcachegrind-15.08.1/README_DEVELOPER
--- old/kcachegrind-15.04.3/README_DEVELOPER 1970-01-01 01:00:00.000000000 +0100
+++ new/kcachegrind-15.08.1/README_DEVELOPER 2015-06-16 22:05:36.000000000 +0200
@@ -0,0 +1,79 @@
+A short guide into the internal design of KCachegrind
+=====================================================
+
+
+Basics of the data model
+------------------------
+
+KCachegrind is a visualization of constant data. This makes the
+data model quite simple. However, as the visualization may require
+a lot of aggregation/summation of a huge number of raw data points in
+all kind of different ways, this aggregation is done in a lazy way.
+Only when the visualization asks for aggregated data, and the data was
+never requested before, aggregation is done.
+This makes the loading of large files faster: only the hierarchy of
+records (e.g. instructions belonging to a source line, source lines
+belong to a function, multiple functions are part of an ELF object)
+is built while loading a file, but no aggregation of data is done.
+Further, this reduces memory consumption.
+
+Important classes of the data model:
+
+* TraceData is a representation of profile data from one profile session,
+ possibly consisting of multiple parts, where each part corresponds to a
+ loaded file
+
+* any record/entry of a some profile data is inherited from CostItem,
+ and this is a complete hierarchy, which gets automatically built
+ when loading a file. E.g. TraceData itself inherits from CostItem.
+
+* every record/entry usually consists of different fields, and
+ are indexed by so-called EventType's. So-called "derived" event
+ types are not actually backed by real fields with concrete data,
+ but get calculated on-demand using a given formula referencing
+ fields with real data.
+
+
+Basics of the GUI
+-----------------
+
+At any time, every view visualizes some CostItem from loaded profile data.
+More concretely, the "visualization state" consists of e.g. the
+current CostItem to show, a curent EventType to show, from which
+part(s) to show, which sub-CostItem should be shown selected and so on.
+
+Every view is inherited from the TraceItemView class, which manages the
+visualization state. TraceItemView's can be setup in a hierarchical
+fashion, and make sure to keep the visualization state consistent between
+each other. E.g. item selection by mouse are forwarded to the parent view,
+which passes the new selection back to all its sub-views.
+
+When a subclass of TraceItemView is asked to change its visualization state,
+it actually only starts a timer, and all state change wishes get merged
+until a time-out happens.
+Then, TraceViewItem::doUpdate() gets called with an argument telling what
+parts of the visualization state should be changed. There, one can do
+special handling if only one thing is to be changed, such as selection of
+another CostItem - in such cases, it is not required to refresh the whole
+view. Otherwise, TraceViewItem::refresh() gets called, which is expected
+to do a complete refresh of the visualization.
+
+The basic visualization task of subclasses of TraceItemView's is to visualize
+one CostItem (the "active" CostItem), typically e.g. a function
+(TraceFunction). Further, there is a "selected" CostItem. This usually is
+a subitem of the active, visualized CostItem, e.g. a source line from the
+active function (TraceLine), or another function in the call graph around
+the active function.
+
+TraceItemView's may not be able to show a given CostItem, but want to show
+another CostItem instead, or show nothing. In the latter case, they get
+grayed out. This behavior is encoded through TraceItemView::canShow, which,
+given a CostItem to visualize, returns the replacement it can visualize
+instead, or 0 if it cannot show anything.
+
+Every top-level window visualizes exactly one profile data (_data),
+and consists of some subviews (FunctionSelection on the left, MultiView on
+the right, with various TabViews embedded) which all inherit from
+TraceItemView, always synced to show some visualization state at a given
+time.
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/converters/README new/kcachegrind-15.08.1/converters/README
--- old/kcachegrind-15.04.3/converters/README 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/converters/README 2015-06-16 22:05:36.000000000 +0200
@@ -17,8 +17,8 @@
* Jörg Beyer for
hotshot2calltree
-If you want to write a converter, have a look at the calltree format
-description on the web site (kcachegrind.sf.net).
+If you want to write a converter, have a look at the callgrind format
+description on the web site (kcachegrind.github.io).
Josef
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/doc/index.docbook new/kcachegrind-15.08.1/doc/index.docbook
--- old/kcachegrind-15.04.3/doc/index.docbook 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/doc/index.docbook 2015-06-16 22:05:36.000000000 +0200
@@ -406,7 +406,7 @@
<para>
To explore the &GUI; further, in addition to this manual, also have a look at
-the documentation section <ulink url="http://kcachegrind.sf.net">on the Web
+the documentation section <ulink url="https://kcachegrind.github.io">on the Web
site</ulink>.
Also, every widget in &kcachegrind; has <quote>What's this</quote> help.
</para>
@@ -1157,7 +1157,7 @@
<para>
&kcachegrind; is part of the &package; package of &kde;. For less supported
interim releases, &callgrind; and further documentation, see
-<ulink url="http://kcachegrind.sf.net">the Web page</ulink>. Look there for
+<ulink url="https://kcachegrind.github.io">the Web page</ulink>. Look there for
further installation and compile instructions.
</para>
</sect1>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/kcachegrind/kcachegrind.desktop new/kcachegrind-15.08.1/kcachegrind/kcachegrind.desktop
--- old/kcachegrind-15.04.3/kcachegrind/kcachegrind.desktop 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/kcachegrind/kcachegrind.desktop 2015-06-16 22:05:36.000000000 +0200
@@ -174,5 +174,5 @@
Comment[zh_CN]=性能测试数据的可视化表现
Comment[zh_TW]=效能分析資料視覺化
X-DBUS-StartupType=Multi
-X-DBUS-ServiceName=net.sf.kcachegrind
+X-DBUS-ServiceName=io.github.kcachegrind
Categories=Qt;KDE;Development;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/kcachegrind/main.cpp new/kcachegrind-15.08.1/kcachegrind/main.cpp
--- old/kcachegrind-15.04.3/kcachegrind/main.cpp 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/kcachegrind/main.cpp 2015-06-16 22:05:36.000000000 +0200
@@ -41,8 +41,8 @@
KCACHEGRIND_VERSION,
ki18n("KDE Frontend for Callgrind/Cachegrind"),
KAboutData::License_GPL,
- ki18n("(C) 2002 - 2011"), KLocalizedString(),
- "http://kcachegrind.sf.net");
+ ki18n("(C) 2002 - 2015"), KLocalizedString(),
+ "https://kcachegrind.github.io");
aboutData.addAuthor(ki18n("Josef Weidendorfer"),
ki18n("Author/Maintainer"),
"Josef.Weidendorfer@gmx.de");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/kcachegrind.lsm.cmake new/kcachegrind-15.08.1/kcachegrind.lsm.cmake
--- old/kcachegrind-15.04.3/kcachegrind.lsm.cmake 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/kcachegrind.lsm.cmake 2015-06-16 22:05:36.000000000 +0200
@@ -5,7 +5,7 @@
Keywords: Profiling, Performance Analysis, Visualisation, Development
Author: Josef Weidendorfer
Maintained-by: Josef Weidendorfer
-Home-page: http://kcachegrind.sourceforge.net
+Home-page: https://kcachegrind.github.io
Platforms: Linux and other Unices
Copying-policy: GNU Public License
End
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/kcachegrind.spec.cmake new/kcachegrind-15.08.1/kcachegrind.spec.cmake
--- old/kcachegrind-15.04.3/kcachegrind.spec.cmake 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/kcachegrind.spec.cmake 2015-06-16 22:05:36.000000000 +0200
@@ -5,7 +5,7 @@
Copyright: GPL
Group: Development/Tools
Vendor: (none)
-URL: http://kcachegrind.sourceforge.net
+URL: https://kcachegrind.github.io
Packager: Josef Weidendorfer
Source: kcachegrind-${KCACHEGRIND_VERSION}.tar.gz
BuildRoot: /var/tmp/build
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libcore/addr.h new/kcachegrind-15.08.1/libcore/addr.h
--- old/kcachegrind-15.04.3/libcore/addr.h 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/libcore/addr.h 2015-06-16 22:05:36.000000000 +0200
@@ -55,6 +55,9 @@
Addr operator+(int d) const { return Addr(_v + d); }
Addr operator-(int d) const { return Addr(_v - d); }
+ // return decremented address until it is a multiple of <a>, a power of 2
+ Addr alignedDown(int a) { return Addr(_v & ~( ((uint64)a) -1)); }
+
private:
uint64 _v;
};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libcore/cachegrindloader.cpp new/kcachegrind-15.08.1/libcore/cachegrindloader.cpp
--- old/kcachegrind-15.04.3/libcore/cachegrindloader.cpp 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/libcore/cachegrindloader.cpp 2015-06-16 22:05:36.000000000 +0200
@@ -944,6 +944,19 @@
case '#':
continue;
+ case 'a':
+ // "arch: arm"
+ if (line.stripPrefix("rch: arm")) {
+ TraceData::Arch a = _data->architecture();
+ if ((a != TraceData::ArchUnknown) &&
+ (a != TraceData::ArchARM)) {
+ error(QString("Redefined architecture!"));
+ }
+ _data->setArchitecture(TraceData::ArchARM);
+ continue;
+ }
+ break;
+
case 't':
// totals:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libcore/globalconfig.cpp new/kcachegrind-15.08.1/libcore/globalconfig.cpp
--- old/kcachegrind-15.04.3/libcore/globalconfig.cpp 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/libcore/globalconfig.cpp 2015-06-16 22:05:36.000000000 +0200
@@ -474,3 +474,8 @@
else
_objectSourceDirs.insert(obj, dirs);
}
+
+void GlobalConfig::clearObjectSourceDirs()
+{
+ _objectSourceDirs.clear();
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libcore/globalconfig.h new/kcachegrind-15.08.1/libcore/globalconfig.h
--- old/kcachegrind-15.04.3/libcore/globalconfig.h 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/libcore/globalconfig.h 2015-06-16 22:05:36.000000000 +0200
@@ -73,6 +73,7 @@
QStringList objectSourceDirs(QString);
void setGeneralSourceDirs(QStringList);
void setObjectSourceDirs(QString, QStringList);
+ void clearObjectSourceDirs();
void setPercentPrecision(int);
void setMaxSymbolLength(int);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libcore/tracedata.cpp new/kcachegrind-15.08.1/libcore/tracedata.cpp
--- old/kcachegrind-15.04.3/libcore/tracedata.cpp 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/libcore/tracedata.cpp 2015-06-16 22:05:36.000000000 +0200
@@ -3080,6 +3080,8 @@
_maxPartNumber = 0;
_fixPool = 0;
_dynPool = 0;
+
+ _arch = ArchUnknown;
}
TraceData::~TraceData()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libcore/tracedata.h new/kcachegrind-15.08.1/libcore/tracedata.h
--- old/kcachegrind-15.04.3/libcore/tracedata.h 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/libcore/tracedata.h 2015-06-16 22:05:36.000000000 +0200
@@ -1363,6 +1363,9 @@
class TraceData: public ProfileCostArray
{
public:
+ // profiled architecture (must be same for every part)
+ enum Arch { ArchUnknown, ArchARM };
+
TraceData(Logger* l = 0);
virtual ~TraceData();
@@ -1446,6 +1449,8 @@
void setCommand(const QString& command) { _command = command; }
QString command() const { return _command; }
+ void setArchitecture(Arch a) { _arch = a; }
+ Arch architecture() const { return _arch; }
ProfileCostArray* totals() { return &_totals; }
void setMaxThreadID(int tid) { _maxThreadID = tid; }
int maxThreadID() const { return _maxThreadID; }
@@ -1493,6 +1498,7 @@
TraceFileMap _fileMap;
TraceFunctionMap _functionMap;
QString _command;
+ Arch _arch;
QString _traceName;
// Max of all costs of calls: This allows to see if the incl. cost can
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libviews/functionselection.cpp new/kcachegrind-15.08.1/libviews/functionselection.cpp
--- old/kcachegrind-15.04.3/libviews/functionselection.cpp 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/libviews/functionselection.cpp 2015-06-16 22:05:36.000000000 +0200
@@ -162,7 +162,7 @@
functionList->setItemDelegate(new AutoToolTipDelegate(functionList));
vboxLayout->addWidget(functionList);
- // order has to match mapping in groupTypeSelected()
+ // only to adjust size, will be repopulated on data change
QStringList args;
args << tr("(No Grouping)")
<< ProfileContext::i18nTypeName(ProfileContext::Object)
@@ -351,9 +351,12 @@
addGroupAction(m, ProfileContext::Function, tr("No Grouping"));
m->addSeparator();
}
- addGroupAction(m, ProfileContext::Object);
- addGroupAction(m, ProfileContext::File);
- addGroupAction(m, ProfileContext::Class);
+ if (_data->objectMap().count()>1)
+ addGroupAction(m, ProfileContext::Object);
+ if (_data->fileMap().count()>1)
+ addGroupAction(m, ProfileContext::File);
+ if (_data->classMap().count()>1)
+ addGroupAction(m, ProfileContext::Class);
addGroupAction(m, ProfileContext::FunctionCycle);
connect(m, SIGNAL(triggered(QAction*)),
@@ -368,16 +371,12 @@
void FunctionSelection::groupTypeSelected(int cg)
{
- switch(cg) {
- case 0: selectedGroupType( ProfileContext::Function ); break;
- case 1: selectedGroupType( ProfileContext::Object ); break;
- case 2: selectedGroupType( ProfileContext::File ); break;
- case 3: selectedGroupType( ProfileContext::Class ); break;
- case 4: selectedGroupType( ProfileContext::FunctionCycle ); break;
- default: break;
- }
-}
+ int t = groupBox->itemData(cg).toInt();
+ if (t == 0)
+ t = ProfileContext::Function; // always works
+ selectedGroupType((ProfileContext::Type) t);
+}
CostItem* FunctionSelection::canShow(CostItem* i)
{
@@ -501,6 +500,24 @@
return;
}
+ if (changeType & dataChanged) {
+ groupBox->clear();
+ groupBox->addItem(tr("(No Grouping)"), ProfileContext::Function);
+ if (_data) {
+ if (_data->objectMap().count()>1)
+ groupBox->addItem(ProfileContext::i18nTypeName(ProfileContext::Object),
+ ProfileContext::Object);
+ if (_data->fileMap().count()>1)
+ groupBox->addItem(ProfileContext::i18nTypeName(ProfileContext::File),
+ ProfileContext::File);
+ if (_data->classMap().count()>1)
+ groupBox->addItem(ProfileContext::i18nTypeName(ProfileContext::Class),
+ ProfileContext::Class);
+ groupBox->addItem(ProfileContext::i18nTypeName(ProfileContext::FunctionCycle),
+ ProfileContext::FunctionCycle);
+ }
+ }
+
if (changeType & groupTypeChanged) {
if (_activeItem && (_activeItem->type() == ProfileContext::Function)) {
TraceFunction* f = (TraceFunction*) _activeItem;
@@ -517,14 +534,8 @@
}
}
- int id;
- switch(_groupType) {
- case ProfileContext::Object: id = 1; break;
- case ProfileContext::File: id = 2; break;
- case ProfileContext::Class: id = 3; break;
- case ProfileContext::FunctionCycle: id = 4; break;
- default: id = 0; break;
- }
+ int id = groupBox->findData(_groupType);
+ if (id < 0) id = 0; // if not found, default to first entry
groupBox->setCurrentIndex(id);
if (_groupType == ProfileContext::Function)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libviews/instrview.cpp new/kcachegrind-15.08.1/libviews/instrview.cpp
--- old/kcachegrind-15.04.3/libviews/instrview.cpp 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/libviews/instrview.cpp 2015-06-16 22:05:36.000000000 +0200
@@ -34,6 +34,7 @@
#include <QScrollBar>
#include <QHeaderView>
#include <QKeyEvent>
+#include <QProcessEnvironment>
#include "config.h"
#include "globalconfig.h"
@@ -45,7 +46,31 @@
#define DEFAULT_SHOWHEXCODE true
-// Helpers for parsing output of 'objdump'
+// Helpers
+
+// check environment variables
+
+QProcessEnvironment env;
+
+static
+QString getSysRoot()
+{
+ if (env.isEmpty())
+ env = QProcessEnvironment::systemEnvironment();
+
+ return env.value("SYSROOT");
+}
+
+static
+QString getObjDump()
+{
+ if (env.isEmpty())
+ env = QProcessEnvironment::systemEnvironment();
+
+ return env.value("OBJDUMP", "objdump");
+}
+
+// parsing output of 'objdump'
static Addr parseAddr(char* buf)
{
@@ -554,6 +579,7 @@
new InstrItem(this, this, 3, tr(" --dump-instr=yes"));
new InstrItem(this, this, 4, tr("To see (conditional) jumps, additionally specify"));
new InstrItem(this, this, 5, tr(" --collect-jumps=yes"));
+ setColumnWidths();
return;
}
@@ -728,7 +754,17 @@
QString filename = o->shortName();
if (QDir::isAbsolutePath(dir)) {
- return QFile::exists(dir + '/' + filename);
+ if (QFile::exists(dir + '/' + filename))
+ return true;
+
+ QString sysRoot = getSysRoot();
+ if (!sysRoot.isEmpty()) {
+ if (!dir.startsWith('/') && !sysRoot.endsWith('/'))
+ sysRoot += '/';
+ dir = sysRoot + dir;
+ return QFile::exists(dir + '/' + filename);
+ }
+ return false;
}
QFileInfo fi(dir, filename);
@@ -759,6 +795,7 @@
Addr costAddr, nextCostAddr, objAddr, addr;
Addr dumpStartAddr, dumpEndAddr;
TraceInstrMap::Iterator costIt;
+ bool isArm = (function->data()->architecture() == TraceData::ArchARM);
// should not happen
if (it == itEnd) return false;
@@ -767,9 +804,16 @@
TraceInstrMap::Iterator tmpIt = itEnd;
--tmpIt;
nextCostAddr = (*it).addr();
+
+ if (isArm) {
+ // for Arm: address always even (even for Thumb encoding)
+ nextCostAddr = nextCostAddr.alignedDown(2);
+ }
+
dumpStartAddr = (nextCostAddr<20) ? Addr(0) : nextCostAddr -20;
dumpEndAddr = (*tmpIt).addr() +20;
+
QString dir = function->object()->directory();
if (!searchFile(dir, function->object())) {
new InstrItem(this, this, 1,
@@ -779,6 +823,9 @@
QString(" '%1'").arg(function->object()->name()));
new InstrItem(this, this, 3,
tr("This file can not be found."));
+ if (isArm)
+ new InstrItem(this, this, 4,
+ tr("If cross-compiled, set SYSROOT variable."));
return false;
}
function->object()->setDirectory(dir);
@@ -790,13 +837,13 @@
<< QString("--start-address=0x%1").arg(dumpStartAddr.toString())
<< QString("--stop-address=0x%1").arg(dumpEndAddr.toString())
<< objfile;
- QString objdumpCmd = "objdump " + objdumpArgs.join(" ");
- if (1) qDebug("Running '%s'...", qPrintable(objdumpCmd));
+ QString objdumpCmd = getObjDump() + " " + objdumpArgs.join(" ");
+ qDebug("Running '%s'...", qPrintable(objdumpCmd));
// and run...
QProcess objdump;
- objdump.start("objdump", objdumpArgs);
+ objdump.start(getObjDump(), objdumpArgs);
if (!objdump.waitForStarted() ||
!objdump.waitForFinished()) {
@@ -873,6 +920,8 @@
}
costAddr = nextCostAddr;
nextCostAddr = (it == itEnd) ? Addr(0) : (*it).addr();
+ if (isArm)
+ nextCostAddr = nextCostAddr.alignedDown(2);
if (0) qDebug() << "Got nextCostAddr: 0x" << nextCostAddr.toString()
<< ", costAddr 0x" << costAddr.toString();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libviews/sourceitem.cpp new/kcachegrind-15.08.1/libviews/sourceitem.cpp
--- old/kcachegrind-15.04.3/libviews/sourceitem.cpp 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/libviews/sourceitem.cpp 2015-06-16 22:05:36.000000000 +0200
@@ -27,6 +27,7 @@
#include <QPainter>
#include <QPolygon>
#include <QTextDocument>
+#include <QLineEdit>
#include "globalguiconfig.h"
#include "listutils.h"
@@ -64,6 +65,9 @@
QString s = src;
setText(4, s.replace( QRegExp("\t"), " " ));
+ // to allow text selection after double click
+ setFlags(flags() | Qt::ItemIsEditable);
+
updateGroup();
updateCost();
}
@@ -302,6 +306,16 @@
_parent = parent;
}
+QWidget* SourceItemDelegate::createEditor(QWidget *parent,
+ const QStyleOptionViewItem &option,
+ const QModelIndex &index) const
+{
+ QWidget* w = QItemDelegate::createEditor(parent, option, index);
+ QLineEdit* e = qobject_cast(w);
+ if (e) e->setReadOnly(true);
+ return w;
+}
+
QSize SourceItemDelegate::sizeHint(const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libviews/sourceitem.h new/kcachegrind-15.08.1/libviews/sourceitem.h
--- old/kcachegrind-15.04.3/libviews/sourceitem.h 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/libviews/sourceitem.h 2015-06-16 22:05:36.000000000 +0200
@@ -89,6 +89,9 @@
const QModelIndex & index ) const;
QSize sizeHint(const QStyleOptionViewItem &option,
const QModelIndex &index) const;
+ QWidget* createEditor(QWidget *parent,
+ const QStyleOptionViewItem &option,
+ const QModelIndex &index) const;
protected:
void paintArrows(QPainter *p,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libviews/sourceview.cpp new/kcachegrind-15.08.1/libviews/sourceview.cpp
--- old/kcachegrind-15.04.3/libviews/sourceview.cpp 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/libviews/sourceview.cpp 2015-06-16 22:05:36.000000000 +0200
@@ -50,7 +50,6 @@
_arrowLevels = 0;
-
setColumnCount(5);
setRootIsDecorated(false);
setAllColumnsShowFocus(true);
@@ -63,7 +62,7 @@
<< tr( "Cost" )
<< tr( "Cost 2" )
<< ""
- << tr( "Source (unknown)");
+ << tr( "Source");
setHeaderLabels(headerLabels);
// sorting will be enabled after refresh()
@@ -314,7 +313,6 @@
_arrowLevels = 0;
if (!_data || !_activeItem) {
- headerItem()->setText(4, tr("(No Source)"));
return;
}
@@ -658,9 +656,9 @@
// do it here, because the source directory could have been set before
if (topLevelItemCount()==0) {
- headerItem()->setText(4, validSourceFile ?
- tr("Source ('%1')").arg(filename) :
- tr("Source (unknown)"));
+ if (validSourceFile && (nextCostLineno != 0))
+ new SourceItem(this, this, fileno, 0, true,
+ tr("--- From '%1' ---").arg(filename));
}
else {
new SourceItem(this, this, fileno, 0, true,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/qcachegrind/qcgmain.cpp new/kcachegrind-15.08.1/qcachegrind/qcgmain.cpp
--- old/kcachegrind-15.04.3/qcachegrind/qcgmain.cpp 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/qcachegrind/qcgmain.cpp 2015-06-16 22:05:36.000000000 +0200
@@ -35,7 +35,7 @@
QApplication app(argc, argv);
Loader::initLoaders();
- QCoreApplication::setOrganizationName("kcachegrind.sf.net");
+ QCoreApplication::setOrganizationName("kcachegrind.github.io");
QCoreApplication::setApplicationName("QCachegrind");
ConfigStorage::setStorage(new QCGConfigStorage);
// creates global config object of type GlobalGUIConfig
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/qcachegrind/qcgtoplevel.cpp new/kcachegrind-15.08.1/qcachegrind/qcgtoplevel.cpp
--- old/kcachegrind-15.04.3/qcachegrind/qcgtoplevel.cpp 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/qcachegrind/qcgtoplevel.cpp 2015-06-16 22:05:36.000000000 +0200
@@ -174,10 +174,11 @@
delete lConfig;
ConfigGroup* pConfig = ConfigStorage::group("TracePositions");
- if (_eventType)
- pConfig->setValue(QString("EventType%1").arg(key), _eventType->name());
- if (_eventType2)
- pConfig->setValue(QString("EventType2%1").arg(key), _eventType2->name());
+ QString eventType, eventType2;
+ if (_eventType) eventType = _eventType->name();
+ if (_eventType2) eventType2 = _eventType2->name();
+ pConfig->setValue(QString("EventType%1").arg(key), eventType);
+ pConfig->setValue(QString("EventType2%1").arg(key), eventType2);
if (_groupType != ProfileContext::InvalidType)
pConfig->setValue(QString("GroupType%1").arg(key),
ProfileContext::typeName(_groupType));
@@ -618,12 +619,12 @@
"phase of developing a computer program. "
"QCachegrind is open-source, and it is distributed under the "
"terms of the GPL v2. For details and source code, see the "
- "homepage</a> of the "
+ "https://kcachegrind.github.io\">homepage</a> of the "
"KCachegrind project.</p>"
"Main author and maintainer: "
""
"Josef Weidendorfer</a><br>"
- "(with lots of bug fixes and porting to Qt4 by the KDE team)");
+ "(with lots of bug fixes/porting help by the KDE community)");
QMessageBox::about(this, tr("About QCachegrind"), text);
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/qcachegrind/qcgtoplevel.h new/kcachegrind-15.08.1/qcachegrind/qcgtoplevel.h
--- old/kcachegrind-15.04.3/qcachegrind/qcgtoplevel.h 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/qcachegrind/qcgtoplevel.h 2015-06-16 22:05:36.000000000 +0200
@@ -51,7 +51,7 @@
class QCGTopLevel : public QMainWindow, public Logger, public TopLevelBase
{
Q_OBJECT
- Q_CLASSINFO("D-Bus Interface", "net.sf.qcachegrind")
+ Q_CLASSINFO("D-Bus Interface", "io.github.qcachegrind")
public:
QCGTopLevel();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/qcachegrind/sourcesettings.cpp new/kcachegrind-15.08.1/qcachegrind/sourcesettings.cpp
--- old/kcachegrind-15.04.3/qcachegrind/sourcesettings.cpp 2015-05-15 09:47:33.000000000 +0200
+++ new/kcachegrind-15.08.1/qcachegrind/sourcesettings.cpp 2015-06-16 22:05:36.000000000 +0200
@@ -200,6 +200,10 @@
QTreeWidgetItem* item = ui.dirList->topLevelItem(idx);
dirs[item->text(0)] << item->text(1);
}
+
+ c->setGeneralSourceDirs(QStringList());
+ c->clearObjectSourceDirs();
+
QHash::const_iterator oit = dirs.constBegin();
for(;oit != dirs.constEnd(); ++oit) {
if (oit.key() == _always)