teemperor updated this revision to Diff 163741.
teemperor marked an inline comment as done.
teemperor added a comment.
- Now using a typedef instead of a macro.
- Using LLVM code style in Lazy.h
- Renamed UpdateX to CalculateX
https://reviews.llvm.org/D51557
Files:
include/lldb/DataFormatters/ValueObjectPrinter.h
include/lldb/Symbol/CompileUnit.h
include/lldb/Target/ObjCLanguageRuntime.h
include/lldb/Utility/Lazy.h
source/DataFormatters/ValueObjectPrinter.cpp
source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
source/Plugins/SymbolFile/DWARF/DWARFUnit.h
source/Symbol/CompileUnit.cpp
source/Target/ObjCLanguageRuntime.cpp
unittests/Utility/CMakeLists.txt
unittests/Utility/LazyTest.cpp
Index: unittests/Utility/LazyTest.cpp
===================================================================
--- /dev/null
+++ unittests/Utility/LazyTest.cpp
@@ -0,0 +1,72 @@
+//===-- LazyTest.cpp --------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/Utility/Lazy.h"
+#include "gtest/gtest.h"
+
+using namespace lldb_private;
+
+namespace {
+class LazyClass {
+ bool UpdateFoo() {
+ ++m_updates_called;
+ return m_foo_value;
+ }
+
+public:
+ LazyBoolMember<LazyClass, &LazyClass::UpdateFoo> m_foo;
+ bool getFoo() { return m_foo.get(*this); }
+ bool m_foo_value = true;
+ int m_updates_called = 0;
+};
+} // namespace
+
+TEST(LazyTest, UpdateCount) {
+ LazyClass l;
+ EXPECT_EQ(0, l.m_updates_called);
+
+ l.getFoo();
+ EXPECT_EQ(1, l.m_updates_called);
+ l.getFoo();
+ EXPECT_EQ(1, l.m_updates_called);
+ l.getFoo();
+ EXPECT_EQ(1, l.m_updates_called);
+}
+
+TEST(LazyTest, Value) {
+ {
+ LazyClass l1;
+ EXPECT_EQ(l1.m_foo_value, l1.getFoo());
+ }
+
+ {
+ LazyClass l2;
+ bool old_value = l2.m_foo_value;
+ l2.m_foo_value = !l2.m_foo_value;
+ EXPECT_NE(old_value, l2.getFoo());
+ }
+}
+
+TEST(LazyTest, Reset) {
+ LazyClass l;
+ EXPECT_EQ(0, l.m_updates_called);
+ l.m_foo.reset();
+ EXPECT_EQ(0, l.m_updates_called);
+
+ l.getFoo();
+ EXPECT_EQ(1, l.m_updates_called);
+
+ l.m_foo.reset();
+ EXPECT_EQ(1, l.m_updates_called);
+
+ l.getFoo();
+ EXPECT_EQ(2, l.m_updates_called);
+ l.getFoo();
+ EXPECT_EQ(2, l.m_updates_called);
+}
Index: unittests/Utility/CMakeLists.txt
===================================================================
--- unittests/Utility/CMakeLists.txt
+++ unittests/Utility/CMakeLists.txt
@@ -10,6 +10,7 @@
FileSpecTest.cpp
FlagsTest.cpp
JSONTest.cpp
+ LazyTest.cpp
LogTest.cpp
NameMatchesTest.cpp
PredicateTest.cpp
Index: source/Target/ObjCLanguageRuntime.cpp
===================================================================
--- source/Target/ObjCLanguageRuntime.cpp
+++ source/Target/ObjCLanguageRuntime.cpp
@@ -35,7 +35,6 @@
ObjCLanguageRuntime::ObjCLanguageRuntime(Process *process)
: LanguageRuntime(process), m_impl_cache(),
- m_has_new_literals_and_indexing(eLazyBoolCalculate),
m_isa_to_descriptor(), m_hash_to_isa_map(), m_type_size_cache(),
m_isa_to_descriptor_stop_id(UINT32_MAX), m_complete_class_cache(),
m_negative_complete_class_cache() {}
@@ -154,6 +153,21 @@
return false;
}
+bool ObjCLanguageRuntime::ClassDescriptor::CalculateKVO() {
+ const char *class_name = GetClassName().AsCString();
+ if (class_name && *class_name)
+ return strstr(class_name, "NSKVONotifying_") == class_name;
+ return false;
+}
+
+bool ObjCLanguageRuntime::ClassDescriptor::CalculateCFType() {
+ const char *class_name = GetClassName().AsCString();
+ if (class_name && *class_name)
+ return strcmp(class_name, "__NSCFType") == 0 ||
+ strcmp(class_name, "NSCFType") == 0;
+ return false;
+}
+
ObjCLanguageRuntime::ObjCISA
ObjCLanguageRuntime::GetISA(const ConstString &name) {
ISAToDescriptorIterator pos = GetDescriptorIterator(name);
Index: source/Symbol/CompileUnit.cpp
===================================================================
--- source/Symbol/CompileUnit.cpp
+++ source/Symbol/CompileUnit.cpp
@@ -23,8 +23,9 @@
lldb_private::LazyBool is_optimized)
: ModuleChild(module_sp), FileSpec(pathname, false), UserID(cu_sym_id),
m_user_data(user_data), m_language(language), m_flags(0),
- m_support_files(), m_line_table_ap(), m_variables(),
- m_is_optimized(is_optimized) {
+ m_support_files(), m_line_table_ap(), m_variables() {
+ if (is_optimized != eLazyBoolCalculate)
+ m_is_optimized.set(is_optimized == eLazyBoolYes);
if (language != eLanguageTypeUnknown)
m_flags.Set(flagsParsedLanguage);
assert(module_sp);
@@ -36,8 +37,9 @@
lldb_private::LazyBool is_optimized)
: ModuleChild(module_sp), FileSpec(fspec), UserID(cu_sym_id),
m_user_data(user_data), m_language(language), m_flags(0),
- m_support_files(), m_line_table_ap(), m_variables(),
- m_is_optimized(is_optimized) {
+ m_support_files(), m_line_table_ap(), m_variables() {
+ if (is_optimized != eLazyBoolCalculate)
+ m_is_optimized.set(is_optimized == eLazyBoolYes);
if (language != eLanguageTypeUnknown)
m_flags.Set(flagsParsedLanguage);
assert(module_sp);
@@ -382,17 +384,14 @@
return sc_list.GetSize() - prev_size;
}
-bool CompileUnit::GetIsOptimized() {
- if (m_is_optimized == eLazyBoolCalculate) {
- m_is_optimized = eLazyBoolNo;
- if (SymbolVendor *symbol_vendor = GetModule()->GetSymbolVendor()) {
- SymbolContext sc;
- CalculateSymbolContext(&sc);
- if (symbol_vendor->ParseCompileUnitIsOptimized(sc))
- m_is_optimized = eLazyBoolYes;
- }
+bool CompileUnit::CalculateOptimized() {
+ if (SymbolVendor *symbol_vendor = GetModule()->GetSymbolVendor()) {
+ SymbolContext sc;
+ CalculateSymbolContext(&sc);
+ if (symbol_vendor->ParseCompileUnitIsOptimized(sc))
+ return true;
}
- return m_is_optimized;
+ return false;
}
void CompileUnit::SetVariableList(VariableListSP &variables) {
Index: source/Plugins/SymbolFile/DWARF/DWARFUnit.h
===================================================================
--- source/Plugins/SymbolFile/DWARF/DWARFUnit.h
+++ source/Plugins/SymbolFile/DWARF/DWARFUnit.h
@@ -12,6 +12,7 @@
#include "DWARFDIE.h"
#include "DWARFDebugInfoEntry.h"
+#include "lldb/Utility/Lazy.h"
#include "lldb/lldb-enumerations.h"
#include "llvm/Support/RWMutex.h"
#include <atomic>
@@ -208,7 +209,6 @@
uint32_t m_producer_version_update = 0;
lldb::LanguageType m_language_type = lldb::eLanguageTypeUnknown;
bool m_is_dwarf64 = false;
- lldb_private::LazyBool m_is_optimized = lldb_private::eLazyBoolCalculate;
dw_addr_t m_addr_base = 0; // Value of DW_AT_addr_base
dw_addr_t m_ranges_base = 0; // Value of DW_AT_ranges_base
// If this is a dwo compile unit this is the offset of the base compile unit
@@ -223,6 +223,10 @@
void ExtractDIEsRWLocked();
void ClearDIEsRWLocked();
+ bool UpdateIsOptimized();
+ lldb_private::LazyBoolMember<DWARFUnit, &DWARFUnit::UpdateIsOptimized>
+ m_is_optimized;
+
// Get the DWARF unit DWARF debug informration entry. Parse the single DIE
// if needed.
const DWARFDebugInfoEntry *GetUnitDIEPtrOnly() {
Index: source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
===================================================================
--- source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
+++ source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
@@ -412,6 +412,14 @@
m_dwo_symbol_file->GetCompileUnit()->ClearDIEsRWLocked();
}
+bool DWARFUnit::UpdateIsOptimized() {
+ const DWARFDebugInfoEntry *die = GetUnitDIEPtrOnly();
+ if (die)
+ return die->GetAttributeValueAsUnsigned(m_dwarf, this,
+ DW_AT_APPLE_optimized, 0) == 1;
+ return false;
+}
+
void DWARFUnit::BuildAddressRangeTable(SymbolFileDWARF *dwarf,
DWARFDebugAranges *debug_aranges) {
// This function is usually called if there in no .debug_aranges section in
@@ -702,19 +710,7 @@
return m_language_type;
}
-bool DWARFUnit::GetIsOptimized() {
- if (m_is_optimized == eLazyBoolCalculate) {
- const DWARFDebugInfoEntry *die = GetUnitDIEPtrOnly();
- if (die) {
- m_is_optimized = eLazyBoolNo;
- if (die->GetAttributeValueAsUnsigned(m_dwarf, this, DW_AT_APPLE_optimized,
- 0) == 1) {
- m_is_optimized = eLazyBoolYes;
- }
- }
- }
- return m_is_optimized == eLazyBoolYes;
-}
+bool DWARFUnit::GetIsOptimized() { return m_is_optimized.get(*this); }
SymbolFileDWARFDwo *DWARFUnit::GetDwoSymbolFile() const {
return m_dwo_symbol_file.get();
Index: source/DataFormatters/ValueObjectPrinter.cpp
===================================================================
--- source/DataFormatters/ValueObjectPrinter.cpp
+++ source/DataFormatters/ValueObjectPrinter.cpp
@@ -57,13 +57,6 @@
m_curr_depth = curr_depth;
assert(m_orig_valobj && "cannot print a NULL ValueObject");
assert(m_stream && "cannot print to a NULL Stream");
- m_should_print = eLazyBoolCalculate;
- m_is_nil = eLazyBoolCalculate;
- m_is_uninit = eLazyBoolCalculate;
- m_is_ptr = eLazyBoolCalculate;
- m_is_ref = eLazyBoolCalculate;
- m_is_aggregate = eLazyBoolCalculate;
- m_is_instance_ptr = eLazyBoolCalculate;
m_summary_formatter = {nullptr, false};
m_value.assign("");
m_summary.assign("");
@@ -167,57 +160,35 @@
return root_valobj_name ? root_valobj_name : if_fail;
}
-bool ValueObjectPrinter::ShouldPrintValueObject() {
- if (m_should_print == eLazyBoolCalculate)
- m_should_print =
- (m_options.m_flat_output == false || m_type_flags.Test(eTypeHasValue))
- ? eLazyBoolYes
- : eLazyBoolNo;
- return m_should_print == eLazyBoolYes;
+bool ValueObjectPrinter::CalculateShouldPrint() {
+ return m_options.m_flat_output == false || m_type_flags.Test(eTypeHasValue);
}
-bool ValueObjectPrinter::IsNil() {
- if (m_is_nil == eLazyBoolCalculate)
- m_is_nil = m_valobj->IsNilReference() ? eLazyBoolYes : eLazyBoolNo;
- return m_is_nil == eLazyBoolYes;
-}
+bool ValueObjectPrinter::CalculateIsNil() { return m_valobj->IsNilReference(); }
-bool ValueObjectPrinter::IsUninitialized() {
- if (m_is_uninit == eLazyBoolCalculate)
- m_is_uninit =
- m_valobj->IsUninitializedReference() ? eLazyBoolYes : eLazyBoolNo;
- return m_is_uninit == eLazyBoolYes;
+bool ValueObjectPrinter::CalculateIsUnit() {
+ return m_valobj->IsUninitializedReference();
}
-bool ValueObjectPrinter::IsPtr() {
- if (m_is_ptr == eLazyBoolCalculate)
- m_is_ptr = m_type_flags.Test(eTypeIsPointer) ? eLazyBoolYes : eLazyBoolNo;
- return m_is_ptr == eLazyBoolYes;
+bool ValueObjectPrinter::CalculateIsPtr() {
+ return m_type_flags.Test(eTypeIsPointer);
}
-bool ValueObjectPrinter::IsRef() {
- if (m_is_ref == eLazyBoolCalculate)
- m_is_ref = m_type_flags.Test(eTypeIsReference) ? eLazyBoolYes : eLazyBoolNo;
- return m_is_ref == eLazyBoolYes;
+bool ValueObjectPrinter::CalculateIsRef() {
+ return m_type_flags.Test(eTypeIsReference);
}
-bool ValueObjectPrinter::IsAggregate() {
- if (m_is_aggregate == eLazyBoolCalculate)
- m_is_aggregate =
- m_type_flags.Test(eTypeHasChildren) ? eLazyBoolYes : eLazyBoolNo;
- return m_is_aggregate == eLazyBoolYes;
+bool ValueObjectPrinter::CalculateIsAggregate() {
+ return m_type_flags.Test(eTypeHasChildren);
}
-bool ValueObjectPrinter::IsInstancePointer() {
+bool ValueObjectPrinter::CalculateIsInstancePtr() {
// you need to do this check on the value's clang type
- if (m_is_instance_ptr == eLazyBoolCalculate)
- m_is_instance_ptr = (m_valobj->GetValue().GetCompilerType().GetTypeInfo() &
- eTypeInstanceIsPointer) != 0
- ? eLazyBoolYes
- : eLazyBoolNo;
- if ((eLazyBoolYes == m_is_instance_ptr) && m_valobj->IsBaseClass())
- m_is_instance_ptr = eLazyBoolNo;
- return m_is_instance_ptr == eLazyBoolYes;
+ bool result = (m_valobj->GetValue().GetCompilerType().GetTypeInfo() &
+ eTypeInstanceIsPointer) != 0;
+ if (result && m_valobj->IsBaseClass())
+ result = false;
+ return result;
}
bool ValueObjectPrinter::PrintLocationIfNeeded() {
Index: include/lldb/Utility/Lazy.h
===================================================================
--- /dev/null
+++ include/lldb/Utility/Lazy.h
@@ -0,0 +1,56 @@
+//===-- Lazy.h --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef liblldb_Lazy_h_
+#define liblldb_Lazy_h_
+
+#include <type_traits>
+
+#include "llvm/ADT/Optional.h"
+
+#include "lldb/lldb-private-enumerations.h"
+
+namespace lldb_private {
+
+/// Contains a member variable value that will be lazily calculcated when it's
+/// used for the first time.
+///
+/// The class takes a value type T that should be stored, and a member function
+/// that will be called to calculate the actual value on the first read.
+// FIXME: The class/member pointer pair can be replaced by an auto template with
+// C++17.
+template <typename T, typename Class, T (Class::*Calculate)()>
+class LazyMember {
+ llvm::Optional<T> Value;
+
+public:
+ LazyMember() { reset(); }
+
+ /// Requests that the member should be recalculated on the next read.
+ void reset() { Value.reset(); }
+
+ /// Reads the value of this LazyMember. Potentially recalculates the value
+ /// before returning.
+ const T &get(Class &instance) {
+ if (!Value)
+ set((instance.*Calculate)());
+ return *Value;
+ }
+
+ /// Explicitly sets the value of this instance to a certain value, which will
+ /// also prevent that any future reads recalculate it.
+ void set(const T &value) { Value = value; }
+};
+
+/// Convenience struct for LazyMember with a bool.
+template <typename Class, bool (Class::*Calculate)()>
+class LazyBoolMember : public LazyMember<bool, Class, Calculate> {};
+} // namespace lldb_private
+
+#endif // liblldb_Lazy_h_
Index: include/lldb/Target/ObjCLanguageRuntime.h
===================================================================
--- include/lldb/Target/ObjCLanguageRuntime.h
+++ include/lldb/Target/ObjCLanguageRuntime.h
@@ -27,6 +27,7 @@
#include "lldb/Symbol/DeclVendor.h"
#include "lldb/Symbol/Type.h"
#include "lldb/Target/LanguageRuntime.h"
+#include "lldb/Utility/Lazy.h"
#include "lldb/lldb-private.h"
class CommandObjectObjC_ClassTable_Dump;
@@ -53,9 +54,7 @@
// implementations of the runtime, and more might come
class ClassDescriptor {
public:
- ClassDescriptor()
- : m_is_kvo(eLazyBoolCalculate), m_is_cf(eLazyBoolCalculate),
- m_type_wp() {}
+ ClassDescriptor() = default;
virtual ~ClassDescriptor() = default;
@@ -67,27 +66,11 @@
// virtual if any implementation has some other version-specific rules but
// for the known v1/v2 this is all that needs to be done
- virtual bool IsKVO() {
- if (m_is_kvo == eLazyBoolCalculate) {
- const char *class_name = GetClassName().AsCString();
- if (class_name && *class_name)
- m_is_kvo =
- (LazyBool)(strstr(class_name, "NSKVONotifying_") == class_name);
- }
- return (m_is_kvo == eLazyBoolYes);
- }
+ virtual bool IsKVO() { return m_is_kvo.get(*this); }
// virtual if any implementation has some other version-specific rules but
// for the known v1/v2 this is all that needs to be done
- virtual bool IsCFType() {
- if (m_is_cf == eLazyBoolCalculate) {
- const char *class_name = GetClassName().AsCString();
- if (class_name && *class_name)
- m_is_cf = (LazyBool)(strcmp(class_name, "__NSCFType") == 0 ||
- strcmp(class_name, "NSCFType") == 0);
- }
- return (m_is_cf == eLazyBoolYes);
- }
+ virtual bool IsCFType() { return m_is_cf.get(*this); }
virtual bool IsValid() = 0;
@@ -139,8 +122,12 @@
bool check_version_specific = false) const;
private:
- LazyBool m_is_kvo;
- LazyBool m_is_cf;
+ bool CalculateKVO();
+
+ bool CalculateCFType();
+
+ LazyBoolMember<ClassDescriptor, &ClassDescriptor::CalculateKVO> m_is_kvo;
+ LazyBoolMember<ClassDescriptor, &ClassDescriptor::CalculateCFType> m_is_cf;
lldb::TypeWP m_type_wp;
};
@@ -280,14 +267,7 @@
}
bool HasNewLiteralsAndIndexing() {
- if (m_has_new_literals_and_indexing == eLazyBoolCalculate) {
- if (CalculateHasNewLiteralsAndIndexing())
- m_has_new_literals_and_indexing = eLazyBoolYes;
- else
- m_has_new_literals_and_indexing = eLazyBoolNo;
- }
-
- return (m_has_new_literals_and_indexing == eLazyBoolYes);
+ return m_has_new_literals_and_indexing.get(*this);
}
virtual void SymbolsDidLoad(const ModuleList &module_list) {
@@ -379,7 +359,9 @@
typedef ThreadSafeDenseMap<void *, uint64_t> TypeSizeCache;
MsgImplMap m_impl_cache;
- LazyBool m_has_new_literals_and_indexing;
+ LazyBoolMember<ObjCLanguageRuntime,
+ &ObjCLanguageRuntime::CalculateHasNewLiteralsAndIndexing>
+ m_has_new_literals_and_indexing;
ISAToDescriptorMap m_isa_to_descriptor;
HashToISAMap m_hash_to_isa_map;
TypeSizeCache m_type_size_cache;
Index: include/lldb/Symbol/CompileUnit.h
===================================================================
--- include/lldb/Symbol/CompileUnit.h
+++ include/lldb/Symbol/CompileUnit.h
@@ -14,6 +14,7 @@
#include "lldb/Core/ModuleChild.h"
#include "lldb/Symbol/DebugMacros.h"
#include "lldb/Symbol/Function.h"
+#include "lldb/Utility/Lazy.h"
#include "lldb/Utility/Stream.h"
#include "lldb/Utility/UserID.h"
#include "lldb/lldb-enumerations.h"
@@ -407,7 +408,7 @@
/// optimization. 'false' indicates that either the optimization
/// is unknown, or this compile unit was built without optimization.
//------------------------------------------------------------------
- bool GetIsOptimized();
+ bool GetIsOptimized() { return m_is_optimized.get(*this); }
protected:
void *m_user_data; ///< User data for the SymbolFile parser to store
@@ -430,8 +431,9 @@
m_debug_macros_sp; ///< Debug macros that will get parsed on demand.
lldb::VariableListSP m_variables; ///< Global and static variable list that
///will get parsed on demand.
- lldb_private::LazyBool m_is_optimized; /// eLazyBoolYes if this compile unit
- /// was compiled with optimization.
+ bool CalculateOptimized();
+ /// true if this compile unit was compiled with optimization.
+ LazyBoolMember<CompileUnit, &CompileUnit::CalculateOptimized> m_is_optimized;
private:
enum {
Index: include/lldb/DataFormatters/ValueObjectPrinter.h
===================================================================
--- include/lldb/DataFormatters/ValueObjectPrinter.h
+++ include/lldb/DataFormatters/ValueObjectPrinter.h
@@ -20,6 +20,7 @@
#include "lldb/lldb-public.h"
#include "lldb/Utility/Flags.h"
+#include "lldb/Utility/Lazy.h"
#include "lldb/DataFormatters/DumpValueObjectOptions.h"
#include "lldb/Symbol/CompilerType.h"
@@ -65,21 +66,16 @@
const char *GetRootNameForDisplay(const char *if_fail = nullptr);
- bool ShouldPrintValueObject();
+ bool ShouldPrintValueObject() { return m_should_print.get(*this); }
bool ShouldPrintValidation();
- bool IsNil();
-
- bool IsUninitialized();
-
- bool IsPtr();
-
- bool IsRef();
-
- bool IsInstancePointer();
-
- bool IsAggregate();
+ bool IsNil() { return m_is_nil.get(*this); }
+ bool IsUninitialized() { return m_is_uninit.get(*this); }
+ bool IsPtr() { return m_is_ptr.get(*this); }
+ bool IsRef() { return m_is_ref.get(*this); }
+ bool IsInstancePointer() { return m_is_instance_ptr.get(*this); }
+ bool IsAggregate() { return m_is_aggregate.get(*this); }
bool PrintValidationMarkerIfNeeded();
@@ -138,13 +134,23 @@
CompilerType m_compiler_type;
DumpValueObjectOptions::PointerDepth m_ptr_depth;
uint32_t m_curr_depth;
- LazyBool m_should_print;
- LazyBool m_is_nil;
- LazyBool m_is_uninit;
- LazyBool m_is_ptr;
- LazyBool m_is_ref;
- LazyBool m_is_aggregate;
- LazyBool m_is_instance_ptr;
+
+ bool CalculateShouldPrint();
+ bool CalculateIsNil();
+ bool CalculateIsUnit();
+ bool CalculateIsPtr();
+ bool CalculateIsRef();
+ bool CalculateIsAggregate();
+ bool CalculateIsInstancePtr();
+
+ using Class = ValueObjectPrinter;
+ LazyBoolMember<Class, &Class::CalculateShouldPrint> m_should_print;
+ LazyBoolMember<Class, &Class::CalculateIsNil> m_is_nil;
+ LazyBoolMember<Class, &Class::CalculateIsUnit> m_is_uninit;
+ LazyBoolMember<Class, &Class::CalculateIsPtr> m_is_ptr;
+ LazyBoolMember<Class, &Class::CalculateIsRef> m_is_ref;
+ LazyBoolMember<Class, &Class::CalculateIsAggregate> m_is_aggregate;
+ LazyBoolMember<Class, &Class::CalculateIsInstancePtr> m_is_instance_ptr;
std::pair<TypeSummaryImpl *, bool> m_summary_formatter;
std::string m_value;
std::string m_summary;
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits