Valgrind: Collapse project and global settings classes

Change-Id: I41b157bb07a451851641c7a5785334bd28036f45
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2023-07-25 13:07:40 +02:00
parent a419670ff5
commit cecf9c9136
9 changed files with 78 additions and 136 deletions

View File

@@ -742,7 +742,7 @@ void CallgrindToolPrivate::setupRunner(CallgrindToolRunner *toolRunner)
QTC_ASSERT(m_visualization, return); QTC_ASSERT(m_visualization, return);
// apply project settings // apply project settings
ValgrindProjectSettings settings; ValgrindSettings settings{false};
settings.fromMap(runControl->settingsData(ANALYZER_VALGRIND_SETTINGS)); settings.fromMap(runControl->settingsData(ANALYZER_VALGRIND_SETTINGS));
m_visualization->setMinimumInclusiveCostRatio(settings.visualizationMinimumInclusiveCostRatio() / 100.0); m_visualization->setMinimumInclusiveCostRatio(settings.visualizationMinimumInclusiveCostRatio() / 100.0);
m_proxyModel.setMinimumInclusiveCostRatio(settings.minimumInclusiveCostRatio() / 100.0); m_proxyModel.setMinimumInclusiveCostRatio(settings.minimumInclusiveCostRatio() / 100.0);

View File

@@ -86,7 +86,7 @@ FilePath MemcheckErrorView::defaultSuppressionFile() const
// slot, can (for now) be invoked either when the settings were modified *or* when the active // slot, can (for now) be invoked either when the settings were modified *or* when the active
// settings object has changed. // settings object has changed.
void MemcheckErrorView::settingsChanged(ValgrindBaseSettings *settings) void MemcheckErrorView::settingsChanged(ValgrindSettings *settings)
{ {
QTC_ASSERT(settings, return); QTC_ASSERT(settings, return);
m_settings = settings; m_settings = settings;

View File

@@ -12,7 +12,7 @@
namespace Valgrind { namespace Valgrind {
namespace Internal { namespace Internal {
class ValgrindBaseSettings; class ValgrindSettings;
class MemcheckErrorView : public Debugger::DetailedErrorView class MemcheckErrorView : public Debugger::DetailedErrorView
{ {
@@ -22,8 +22,8 @@ public:
void setDefaultSuppressionFile(const Utils::FilePath &suppFile); void setDefaultSuppressionFile(const Utils::FilePath &suppFile);
Utils::FilePath defaultSuppressionFile() const; Utils::FilePath defaultSuppressionFile() const;
ValgrindBaseSettings *settings() const { return m_settings; } ValgrindSettings *settings() const { return m_settings; }
void settingsChanged(ValgrindBaseSettings *settings); void settingsChanged(ValgrindSettings *settings);
private: private:
void suppressError(); void suppressError();
@@ -31,7 +31,7 @@ private:
QAction *m_suppressAction; QAction *m_suppressAction;
Utils::FilePath m_defaultSuppFile; Utils::FilePath m_defaultSuppFile;
ValgrindBaseSettings *m_settings = nullptr; ValgrindSettings *m_settings = nullptr;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -193,13 +193,13 @@ void MemcheckToolRunner::addToolArguments(CommandLine &cmd) const
QString leakCheckValue; QString leakCheckValue;
switch (m_settings.leakCheckOnFinish()) { switch (m_settings.leakCheckOnFinish()) {
case ValgrindBaseSettings::LeakCheckOnFinishNo: case ValgrindSettings::LeakCheckOnFinishNo:
leakCheckValue = "no"; leakCheckValue = "no";
break; break;
case ValgrindBaseSettings::LeakCheckOnFinishYes: case ValgrindSettings::LeakCheckOnFinishYes:
leakCheckValue = "full"; leakCheckValue = "full";
break; break;
case ValgrindBaseSettings::LeakCheckOnFinishSummaryOnly: case ValgrindSettings::LeakCheckOnFinishSummaryOnly:
default: default:
leakCheckValue = "summary"; leakCheckValue = "summary";
break; break;
@@ -420,7 +420,7 @@ private:
void heobAction(); void heobAction();
private: private:
ValgrindBaseSettings *m_settings; ValgrindSettings *m_settings;
QMenu *m_filterMenu = nullptr; QMenu *m_filterMenu = nullptr;
Valgrind::XmlProtocol::ErrorListModel m_errorModel; Valgrind::XmlProtocol::ErrorListModel m_errorModel;
@@ -941,11 +941,11 @@ void MemcheckToolPrivate::maybeActiveRunConfigurationChanged()
{ {
updateRunActions(); updateRunActions();
ValgrindBaseSettings *settings = nullptr; ValgrindSettings *settings = nullptr;
if (Project *project = ProjectManager::startupProject()) if (Project *project = ProjectManager::startupProject())
if (Target *target = project->activeTarget()) if (Target *target = project->activeTarget())
if (RunConfiguration *rc = target->activeRunConfiguration()) if (RunConfiguration *rc = target->activeRunConfiguration())
settings = rc->currentSettings<ValgrindBaseSettings>(ANALYZER_VALGRIND_SETTINGS); settings = rc->currentSettings<ValgrindSettings>(ANALYZER_VALGRIND_SETTINGS);
if (!settings) // fallback to global settings if (!settings) // fallback to global settings
settings = &globalSettings(); settings = &globalSettings();
@@ -962,7 +962,7 @@ void MemcheckToolPrivate::maybeActiveRunConfigurationChanged()
// now make the new settings current, update and connect input widgets // now make the new settings current, update and connect input widgets
m_settings = settings; m_settings = settings;
QTC_ASSERT(m_settings, return); QTC_ASSERT(m_settings, return);
connect(m_settings, &ValgrindBaseSettings::destroyed, connect(m_settings, &ValgrindSettings::destroyed,
this, &MemcheckToolPrivate::settingsDestroyed); this, &MemcheckToolPrivate::settingsDestroyed);
updateFromSettings(); updateFromSettings();

View File

@@ -104,16 +104,16 @@ QStringList ValgrindToolRunner::genericToolArguments() const
QString smcCheckValue; QString smcCheckValue;
switch (m_settings.selfModifyingCodeDetection()) { switch (m_settings.selfModifyingCodeDetection()) {
case ValgrindBaseSettings::DetectSmcNo: case ValgrindSettings::DetectSmcNo:
smcCheckValue = "none"; smcCheckValue = "none";
break; break;
case ValgrindBaseSettings::DetectSmcEverywhere: case ValgrindSettings::DetectSmcEverywhere:
smcCheckValue = "all"; smcCheckValue = "all";
break; break;
case ValgrindBaseSettings::DetectSmcEverywhereButFile: case ValgrindSettings::DetectSmcEverywhereButFile:
smcCheckValue = "all-non-file"; smcCheckValue = "all-non-file";
break; break;
case ValgrindBaseSettings::DetectSmcStackOnly: case ValgrindSettings::DetectSmcStackOnly:
default: default:
smcCheckValue = "stack"; smcCheckValue = "stack";
break; break;

View File

@@ -24,7 +24,7 @@ protected:
virtual QString progressTitle() const = 0; virtual QString progressTitle() const = 0;
virtual void addToolArguments(Utils::CommandLine &cmd) const = 0; virtual void addToolArguments(Utils::CommandLine &cmd) const = 0;
ValgrindProjectSettings m_settings; ValgrindSettings m_settings{false};
QFutureInterface<void> m_progress; QFutureInterface<void> m_progress;
ValgrindRunner m_runner; ValgrindRunner m_runner;

View File

@@ -31,7 +31,7 @@ class ValgrindRunConfigurationAspect : public GlobalOrProjectAspect
public: public:
ValgrindRunConfigurationAspect(Target *) ValgrindRunConfigurationAspect(Target *)
{ {
setProjectSettings(new ValgrindProjectSettings); setProjectSettings(new ValgrindSettings(false));
setGlobalSettings(&globalSettings()); setGlobalSettings(&globalSettings());
setId(ANALYZER_VALGRIND_SETTINGS); setId(ANALYZER_VALGRIND_SETTINGS);
setDisplayName(Tr::tr("Valgrind Settings")); setDisplayName(Tr::tr("Valgrind Settings"));

View File

@@ -182,9 +182,12 @@ void SuppressionAspect::bufferToGui()
// //
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
ValgrindBaseSettings::ValgrindBaseSettings(bool global) ValgrindSettings::ValgrindSettings(bool global)
: suppressions(this, global) : suppressions(this, global)
{ {
setSettingsGroup("Analyzer");
setAutoApply(false);
// Note that this is used twice, once for project settings in the .user files // Note that this is used twice, once for project settings in the .user files
// and once for global settings in QtCreator.ini. This uses intentionally // and once for global settings in QtCreator.ini. This uses intentionally
// the same key to facilitate copying using fromMap/toMap. // the same key to facilitate copying using fromMap/toMap.
@@ -250,6 +253,12 @@ ValgrindBaseSettings::ValgrindBaseSettings(bool global)
numCallers.setDefaultValue(25); numCallers.setDefaultValue(25);
numCallers.setLabelText(Tr::tr("Backtrace frame count:")); numCallers.setLabelText(Tr::tr("Backtrace frame count:"));
lastSuppressionDirectory.setSettingsKey(base + "LastSuppressionDirectory");
lastSuppressionDirectory.setVisible(global);
lastSuppressionHistory.setSettingsKey(base + "LastSuppressionHistory");
lastSuppressionHistory.setVisible(global);
// Callgrind // Callgrind
kcachegrindExecutable.setSettingsKey(base + "KCachegrindExecutable"); kcachegrindExecutable.setSettingsKey(base + "KCachegrindExecutable");
@@ -320,6 +329,24 @@ ValgrindBaseSettings::ValgrindBaseSettings(bool global)
defaultErrorKinds << i; defaultErrorKinds << i;
visibleErrorKinds.setDefaultValue(defaultErrorKinds); visibleErrorKinds.setDefaultValue(defaultErrorKinds);
detectCycles.setSettingsKey(base + "Callgrind.CycleDetection");
detectCycles.setDefaultValue(true);
detectCycles.setLabelText("O"); // FIXME: Create a real icon
detectCycles.setToolTip(Tr::tr("Enable cycle detection to properly handle recursive "
"or circular function calls."));
detectCycles.setVisible(global);
costFormat.setSettingsKey(base + "Callgrind.CostFormat");
costFormat.setDefaultValue(CostDelegate::FormatRelative);
costFormat.setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox);
costFormat.setVisible(global);
shortenTemplates.setSettingsKey(base + "Callgrind.ShortenTemplates");
shortenTemplates.setDefaultValue(true);
shortenTemplates.setLabelText("<>"); // FIXME: Create a real icon
shortenTemplates.setToolTip(Tr::tr("Remove template parameter lists when displaying function names."));
shortenTemplates.setVisible(global);
setLayouter([this] { setLayouter([this] {
using namespace Layouting; using namespace Layouting;
@@ -367,73 +394,28 @@ ValgrindBaseSettings::ValgrindBaseSettings(bool global)
}; };
// clang-format on // clang-format on
}); });
if (global) {
readSettings();
} else {
// FIXME: Is this needed?
connect(this, &AspectContainer::fromMapFinished, [this] {
// FIXME: Update project page e.g. on "Restore Global", aspects
// there are 'autoapply', and Aspect::cancel() is normally part of
// the 'manual apply' machinery.
setAutoApply(false);
cancel();
setAutoApply(true);
});
}
} }
ValgrindSettings &globalSettings()
//////////////////////////////////////////////////////////////////
//
// ValgrindGlobalSettings
//
//////////////////////////////////////////////////////////////////
ValgrindGlobalSettings &globalSettings()
{ {
static ValgrindGlobalSettings theSettings; static ValgrindSettings theSettings{true};
return theSettings; return theSettings;
} }
ValgrindGlobalSettings::ValgrindGlobalSettings()
: ValgrindBaseSettings(true)
{
const QString base = "Analyzer.Valgrind";
lastSuppressionDirectory.setSettingsKey(base + "LastSuppressionDirectory");
lastSuppressionHistory.setSettingsKey(base + "LastSuppressionHistory");
detectCycles.setSettingsKey(base + "Callgrind.CycleDetection");
detectCycles.setDefaultValue(true);
detectCycles.setLabelText("O"); // FIXME: Create a real icon
detectCycles.setToolTip(Tr::tr("Enable cycle detection to properly handle recursive "
"or circular function calls."));
costFormat.setSettingsKey(base + "Callgrind.CostFormat");
costFormat.setDefaultValue(CostDelegate::FormatRelative);
costFormat.setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox);
shortenTemplates.setSettingsKey(base + "Callgrind.ShortenTemplates");
shortenTemplates.setDefaultValue(true);
shortenTemplates.setLabelText("<>"); // FIXME: Create a real icon
shortenTemplates.setToolTip(Tr::tr("Remove template parameter lists when displaying function names."));
setSettingsGroup("Analyzer");
readSettings();
setAutoApply(false);
}
//
// Memcheck
//
//////////////////////////////////////////////////////////////////
//
// ValgrindProjectSettings
//
//////////////////////////////////////////////////////////////////
ValgrindProjectSettings::ValgrindProjectSettings()
: ValgrindBaseSettings(false)
{
connect(this, &AspectContainer::fromMapFinished, [this] {
// FIXME: Update project page e.g. on "Restore Global", aspects
// there are 'autoapply', and Aspect::cancel() is normally part of
// the 'manual apply' machinery.
setAutoApply(false);
cancel();
setAutoApply(true);
});
}
// //
// ValgrindOptionsPage // ValgrindOptionsPage
// //
@@ -454,5 +436,4 @@ public:
const ValgrindOptionsPage settingsPage; const ValgrindOptionsPage settingsPage;
} // Valgrind::Internal } // Valgrind::Internal

View File

@@ -31,19 +31,20 @@ private:
void bufferToGui() override; void bufferToGui() override;
bool guiToBuffer() override; bool guiToBuffer() override;
friend class ValgrindBaseSettings; friend class ValgrindSettings;
SuppressionAspectPrivate *d = nullptr; SuppressionAspectPrivate *d = nullptr;
}; };
/** /**
* Valgrind settings shared for global and per-project. * Valgrind settings shared for global and per-project.
*/ */
class ValgrindBaseSettings : public Utils::AspectContainer class ValgrindSettings : public Utils::AspectContainer
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit ValgrindBaseSettings(bool global); // These exists once globally, and once per project
explicit ValgrindSettings(bool global);
enum SelfModifyingCodeDetection { enum SelfModifyingCodeDetection {
DetectSmcNo, DetectSmcNo,
@@ -58,20 +59,14 @@ public:
LeakCheckOnFinishYes LeakCheckOnFinishYes
}; };
/** // Generic valgrind settings
* Base valgrind settings
*/
public:
Utils::FilePathAspect valgrindExecutable{this}; Utils::FilePathAspect valgrindExecutable{this};
Utils::StringAspect valgrindArguments{this}; Utils::StringAspect valgrindArguments{this};
Utils::SelectionAspect selfModifyingCodeDetection{this}; Utils::SelectionAspect selfModifyingCodeDetection{this};
SuppressionAspect suppressions; SuppressionAspect suppressions;
/** // Memcheck
* Base memcheck settings
*/
public:
Utils::StringAspect memcheckArguments{this}; Utils::StringAspect memcheckArguments{this};
Utils::IntegerAspect numCallers{this}; Utils::IntegerAspect numCallers{this};
Utils::SelectionAspect leakCheckOnFinish{this}; Utils::SelectionAspect leakCheckOnFinish{this};
@@ -80,12 +75,12 @@ public:
Utils::BoolAspect filterExternalIssues{this}; Utils::BoolAspect filterExternalIssues{this};
Utils::IntegersAspect visibleErrorKinds{this}; Utils::IntegersAspect visibleErrorKinds{this};
Utils::FilePathAspect lastSuppressionDirectory{this}; // Global only
Utils::StringAspect lastSuppressionHistory{this}; // Global only
void setVisibleErrorKinds(const QList<int> &); void setVisibleErrorKinds(const QList<int> &);
/** // Callgrind
* Base callgrind settings
*/
public:
Utils::StringAspect callgrindArguments{this}; Utils::StringAspect callgrindArguments{this};
Utils::FilePathAspect kcachegrindExecutable{this}; Utils::FilePathAspect kcachegrindExecutable{this};
@@ -96,46 +91,12 @@ public:
Utils::BoolAspect enableEventToolTips{this}; Utils::BoolAspect enableEventToolTips{this};
Utils::DoubleAspect minimumInclusiveCostRatio{this}; Utils::DoubleAspect minimumInclusiveCostRatio{this};
Utils::DoubleAspect visualizationMinimumInclusiveCostRatio{this}; Utils::DoubleAspect visualizationMinimumInclusiveCostRatio{this};
Utils::SelectionAspect costFormat{this}; // Global only
Utils::BoolAspect detectCycles{this}; // Global only
Utils::BoolAspect shortenTemplates{this}; // Global only
}; };
/** ValgrindSettings &globalSettings();
* Global valgrind settings
*/
class ValgrindGlobalSettings : public ValgrindBaseSettings
{
Q_OBJECT
public:
ValgrindGlobalSettings();
/**
* Global memcheck settings
*/
Utils::FilePathAspect lastSuppressionDirectory{this};
Utils::StringAspect lastSuppressionHistory{this};
/**
* Global callgrind settings
*/
Utils::SelectionAspect costFormat{this};
Utils::BoolAspect detectCycles{this};
Utils::BoolAspect shortenTemplates{this};
};
ValgrindGlobalSettings &globalSettings();
/**
* Per-project valgrind settings.
*/
class ValgrindProjectSettings : public ValgrindBaseSettings
{
Q_OBJECT
public:
ValgrindProjectSettings();
};
} // Valgrind::Internal } // Valgrind::Internal