
This fixes a few bugs, effectively through a fallback to `p` when `po` fails. The motivating bug this fixes is when an error within the compiler causes `po` to fail. Previously when that happened, only its value (typically an object's address) was printed – and problematically, no compiler diagnostics were shown. With this change, compiler diagnostics are shown, _and_ the object is fully printed (ie `p`). Another bug this fixes is when `po` is used on a type that doesn't provide an object description (such as a struct). Again, the normal `ValueObject` printing is used. Additionally, this also improves how lldb handles an object description method that fails in some way. Now an error will be shown (it wasn't before), and the value will be printed normally.
230 lines
6.1 KiB
C++
230 lines
6.1 KiB
C++
//===-- DumpValueObjectOptions.cpp ----------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/DataFormatters/DumpValueObjectOptions.h"
|
|
|
|
#include "lldb/ValueObject/ValueObject.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
DumpValueObjectOptions::DumpValueObjectOptions()
|
|
: m_summary_sp(), m_root_valobj_name(), m_decl_printing_helper(),
|
|
m_child_printing_decider(), m_pointer_as_array(), m_use_synthetic(true),
|
|
m_scope_already_checked(false), m_flat_output(false), m_ignore_cap(false),
|
|
m_show_types(false), m_show_location(false), m_use_object_desc(false),
|
|
m_hide_root_type(false), m_hide_root_name(false), m_hide_name(false),
|
|
m_hide_value(false), m_run_validator(false),
|
|
m_use_type_display_name(true), m_allow_oneliner_mode(true),
|
|
m_hide_pointer_value(false), m_reveal_empty_aggregates(true) {}
|
|
|
|
DumpValueObjectOptions::DumpValueObjectOptions(ValueObject &valobj)
|
|
: DumpValueObjectOptions() {
|
|
m_use_dynamic = valobj.GetDynamicValueType();
|
|
m_use_synthetic = valobj.IsSynthetic();
|
|
m_varformat_language = valobj.GetPreferredDisplayLanguage();
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetMaximumPointerDepth(uint32_t depth) {
|
|
m_max_ptr_depth = {depth};
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetMaximumDepth(uint32_t depth, bool is_default) {
|
|
m_max_depth = depth;
|
|
m_max_depth_is_default = is_default;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetDeclPrintingHelper(DeclPrintingHelper helper) {
|
|
m_decl_printing_helper = helper;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetChildPrintingDecider(ChildPrintingDecider decider) {
|
|
m_child_printing_decider = decider;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &DumpValueObjectOptions::SetShowTypes(bool show) {
|
|
m_show_types = show;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &DumpValueObjectOptions::SetShowLocation(bool show) {
|
|
m_show_location = show;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &DumpValueObjectOptions::DisableObjectDescription() {
|
|
// Reset these options to their default values.
|
|
SetUseObjectDescription(false);
|
|
SetHideRootType(false);
|
|
SetHideName(false);
|
|
SetHideValue(false);
|
|
SetShowSummary(true);
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetUseObjectDescription(bool use) {
|
|
m_use_object_desc = use;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &DumpValueObjectOptions::SetShowSummary(bool show) {
|
|
if (!show)
|
|
SetOmitSummaryDepth(UINT32_MAX);
|
|
else
|
|
SetOmitSummaryDepth(0);
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetUseDynamicType(lldb::DynamicValueType dyn) {
|
|
m_use_dynamic = dyn;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetUseSyntheticValue(bool use_synthetic) {
|
|
m_use_synthetic = use_synthetic;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &DumpValueObjectOptions::SetScopeChecked(bool check) {
|
|
m_scope_already_checked = check;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &DumpValueObjectOptions::SetFlatOutput(bool flat) {
|
|
m_flat_output = flat;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetOmitSummaryDepth(uint32_t depth) {
|
|
m_omit_summary_depth = depth;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &DumpValueObjectOptions::SetIgnoreCap(bool ignore) {
|
|
m_ignore_cap = ignore;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &DumpValueObjectOptions::SetRawDisplay() {
|
|
SetUseSyntheticValue(false);
|
|
SetOmitSummaryDepth(UINT32_MAX);
|
|
SetIgnoreCap(true);
|
|
SetHideName(false);
|
|
SetHideValue(false);
|
|
SetUseTypeDisplayName(false);
|
|
SetAllowOnelinerMode(false);
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &DumpValueObjectOptions::SetFormat(lldb::Format format) {
|
|
m_format = format;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetSummary(lldb::TypeSummaryImplSP summary) {
|
|
m_summary_sp = summary;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetRootValueObjectName(const char *name) {
|
|
if (name)
|
|
m_root_valobj_name.assign(name);
|
|
else
|
|
m_root_valobj_name.clear();
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetHideRootType(bool hide_root_type) {
|
|
m_hide_root_type = hide_root_type;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetHideRootName(bool hide_root_name) {
|
|
m_hide_root_name = hide_root_name;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &DumpValueObjectOptions::SetHideName(bool hide_name) {
|
|
m_hide_name = hide_name;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &DumpValueObjectOptions::SetHideValue(bool hide_value) {
|
|
m_hide_value = hide_value;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &DumpValueObjectOptions::SetHidePointerValue(bool hide) {
|
|
m_hide_pointer_value = hide;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetVariableFormatDisplayLanguage(
|
|
lldb::LanguageType lang) {
|
|
m_varformat_language = lang;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &DumpValueObjectOptions::SetRunValidator(bool run) {
|
|
m_run_validator = run;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetUseTypeDisplayName(bool dis) {
|
|
m_use_type_display_name = dis;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetAllowOnelinerMode(bool oneliner) {
|
|
m_allow_oneliner_mode = oneliner;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetRevealEmptyAggregates(bool reveal) {
|
|
m_reveal_empty_aggregates = reveal;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetExpandPointerTypeFlags(unsigned flags) {
|
|
m_expand_ptr_type_flags = flags;
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &
|
|
DumpValueObjectOptions::SetElementCount(uint32_t element_count) {
|
|
m_pointer_as_array = PointerAsArraySettings(element_count);
|
|
return *this;
|
|
}
|
|
|
|
DumpValueObjectOptions &DumpValueObjectOptions::SetPointerAsArray(
|
|
const PointerAsArraySettings &ptr_array) {
|
|
m_pointer_as_array = ptr_array;
|
|
return *this;
|
|
}
|