diff options
Diffstat (limited to 'lldb/tools/lldb-perf')
| -rw-r--r-- | lldb/tools/lldb-perf/darwin/formatters/fmts_tester.mm | 69 | ||||
| -rw-r--r-- | lldb/tools/lldb-perf/darwin/formatters/main.cpp | 260 | ||||
| -rw-r--r-- | lldb/tools/lldb-perf/darwin/sketch/foobar.sketch2 | bin | 0 -> 10027 bytes | |||
| -rw-r--r-- | lldb/tools/lldb-perf/darwin/sketch/main.cpp | 14 | ||||
| -rw-r--r-- | lldb/tools/lldb-perf/lib/Measurement.h | 53 | ||||
| -rw-r--r-- | lldb/tools/lldb-perf/lib/Metric.cpp | 16 | ||||
| -rw-r--r-- | lldb/tools/lldb-perf/lib/Metric.h | 6 | ||||
| -rw-r--r-- | lldb/tools/lldb-perf/lib/TestCase.cpp | 10 | ||||
| -rw-r--r-- | lldb/tools/lldb-perf/lib/TestCase.h | 10 | ||||
| -rw-r--r-- | lldb/tools/lldb-perf/lib/Xcode.cpp | 2 |
10 files changed, 416 insertions, 24 deletions
diff --git a/lldb/tools/lldb-perf/darwin/formatters/fmts_tester.mm b/lldb/tools/lldb-perf/darwin/formatters/fmts_tester.mm new file mode 100644 index 00000000000..bfbc54e189f --- /dev/null +++ b/lldb/tools/lldb-perf/darwin/formatters/fmts_tester.mm @@ -0,0 +1,69 @@ +#import <Cocoa/Cocoa.h> +#include <vector> +#include <list> +#include <map> +#include <string> + +int main() +{ + NSArray* nsarray = @[@1,@2,@"hello world",@3,@4,@"foobar"]; + NSMutableArray* nsmutablearray = [[NSMutableArray alloc] initWithCapacity:5]; + [nsmutablearray addObject:@1]; + [nsmutablearray addObject:@2]; + [nsmutablearray addObject:@"hello world"]; + [nsmutablearray addObject:@3]; + [nsmutablearray addObject:@4]; + [nsmutablearray addObject:@"foobar"]; + NSDictionary* nsdictionary = @{@1 : @1, @2 : @2, @"hello" : @"world", @3 : @3}; + NSMutableDictionary* nsmutabledictionary = [[NSMutableDictionary alloc] initWithCapacity:5]; + [nsmutabledictionary setObject:@1 forKey:@1]; + [nsmutabledictionary setObject:@2 forKey:@2]; + [nsmutabledictionary setObject:@"hello" forKey:@"world"]; + [nsmutabledictionary setObject:@3 forKey:@3]; + NSString* str0 = @"Hello world"; + NSString* str1 = @"Hello ℥"; + NSString* str2 = @"Hello world"; + NSString* str3 = @"Hello ℥"; + NSString* str4 = @"Hello world"; + NSDate* me = [NSDate dateWithNaturalLanguageString:@"April 10, 1985"]; + NSDate* cutie = [NSDate dateWithNaturalLanguageString:@"January 29, 1983"]; + NSDate* mom = [NSDate dateWithNaturalLanguageString:@"May 24, 1959"]; + NSDate* dad = [NSDate dateWithNaturalLanguageString:@"October 29, 1954"]; + NSDate* today = [NSDate dateWithNaturalLanguageString:@"March 14, 2013"]; + NSArray* bundles = [NSBundle allBundles]; + NSArray* frameworks = [NSBundle allFrameworks]; + NSSet* nsset = [NSSet setWithArray:nsarray]; + NSMutableSet* nsmutableset = [NSMutableSet setWithCapacity:5]; + [nsmutableset addObject:@1]; + [nsmutableset addObject:@2]; + [nsmutableset addObject:@"hello world"]; + [nsmutableset addObject:@3]; + [nsmutableset addObject:@4]; + [nsmutableset addObject:@"foobar"]; + std::vector<int> vector; + vector.push_back(1); + vector.push_back(2); + vector.push_back(3); + vector.push_back(4); + vector.push_back(5); + std::list<int> list; + list.push_back(1); + list.push_back(2); + list.push_back(3); + list.push_back(4); + list.push_back(5); + std::map<int,int> map; + map[1] = 1; + map[2] = 2; + map[3] = 3; + map[4] = 4; + map[5] = 5; + std::string sstr0("Hello world"); + std::string sstr1("Hello world"); + std::string sstr2("Hello world"); + std::string sstr3("Hello world"); + std::string sstr4("Hello world"); + int x = 0; + for (;;) + x++; +}
\ No newline at end of file diff --git a/lldb/tools/lldb-perf/darwin/formatters/main.cpp b/lldb/tools/lldb-perf/darwin/formatters/main.cpp new file mode 100644 index 00000000000..bc55e7827f3 --- /dev/null +++ b/lldb/tools/lldb-perf/darwin/formatters/main.cpp @@ -0,0 +1,260 @@ +// +// main.cpp +// PerfTestDriver +// +// Created by Enrico Granata on 3/6/13. +// Copyright (c) 2013 Apple Inc. All rights reserved. +// + +#include <CoreFoundation/CoreFoundation.h> + +#include "lldb-perf/lib/Timer.h" +#include "lldb-perf/lib/Metric.h" +#include "lldb-perf/lib/Measurement.h" +#include "lldb-perf/lib/TestCase.h" +#include "lldb-perf/lib/Xcode.h" + +#include <iostream> +#include <unistd.h> +#include <fstream> + +using namespace lldb::perf; + +class FormattersTest : public TestCase +{ +public: + FormattersTest () : TestCase() + { + m_dump_std_vector_measurement = CreateTimeMeasurement([] (SBValue value) -> void { + lldb::perf::Xcode::FetchVariable (value,1,false); + }, "std-vector", "time to dump an std::vector"); + m_dump_std_list_measurement = CreateTimeMeasurement([] (SBValue value) -> void { + lldb::perf::Xcode::FetchVariable (value,1,false); + }, "std-list", "time to dump an std::list"); + m_dump_std_map_measurement = CreateTimeMeasurement([] (SBValue value) -> void { + lldb::perf::Xcode::FetchVariable (value,1,false); + }, "std-map", "time to dump an std::map"); + m_dump_std_string_measurement = CreateTimeMeasurement([] (SBValue value) -> void { + lldb::perf::Xcode::FetchVariable (value,1,false); + }, "std-string", "time to dump an std::string"); + + m_dump_nsstring_measurement = CreateTimeMeasurement([] (SBValue value) -> void { + lldb::perf::Xcode::FetchVariable (value,0,false); + }, "ns-string", "time to dump an NSString"); + + m_dump_nsarray_measurement = CreateTimeMeasurement([] (SBValue value) -> void { + lldb::perf::Xcode::FetchVariable (value,1,false); + }, "ns-array", "time to dump an NSArray"); + + m_dump_nsdictionary_measurement = CreateTimeMeasurement([] (SBValue value) -> void { + lldb::perf::Xcode::FetchVariable (value,1,false); + }, "ns-dictionary", "time to dump an NSDictionary"); + + m_dump_nsset_measurement = CreateTimeMeasurement([] (SBValue value) -> void { + lldb::perf::Xcode::FetchVariable (value,1,false); + }, "ns-set", "time to dump an NSSet"); + + m_dump_nsbundle_measurement = CreateTimeMeasurement([] (SBValue value) -> void { + lldb::perf::Xcode::FetchVariable (value,1,false); + }, "ns-bundle", "time to dump an NSBundle"); + + m_dump_nsdate_measurement = CreateTimeMeasurement([] (SBValue value) -> void { + lldb::perf::Xcode::FetchVariable (value,0,false); + }, "ns-date", "time to dump an NSDate"); + } + + virtual + ~FormattersTest () + { + } + + virtual void + Setup (int argc, const char** argv) + { + m_app_path.assign(argv[1]); + m_out_path.assign(argv[2]); + m_target = m_debugger.CreateTarget(m_app_path.c_str()); + m_target.BreakpointCreateByName("main"); + + Launch (NULL,"."); + } + + SBThread + SelectMyThread (const char* file_name) + { + auto threads_count = m_process.GetNumThreads(); + for (auto thread_num = 0; thread_num < threads_count; thread_num++) + { + SBThread thread(m_process.GetThreadAtIndex(thread_num)); + auto local_file_name = thread.GetFrameAtIndex(0).GetCompileUnit().GetFileSpec().GetFilename(); + if (!local_file_name) + continue; + if (strcmp(local_file_name,file_name)) + continue; + return thread; + } + Xcode::RunCommand(m_debugger,"bt all",true); + assert(false); + } + + void + DoTest () + { + SBThread thread_main(SelectMyThread("fmts_tester.mm")); + SBFrame frame_zero(thread_main.GetFrameAtIndex(0)); + + m_dump_nsarray_measurement(frame_zero.FindVariable("nsarray", lldb::eDynamicCanRunTarget)); + m_dump_nsarray_measurement(frame_zero.FindVariable("nsmutablearray", lldb::eDynamicCanRunTarget)); + + m_dump_nsdictionary_measurement(frame_zero.FindVariable("nsdictionary", lldb::eDynamicCanRunTarget)); + m_dump_nsdictionary_measurement(frame_zero.FindVariable("nsmutabledictionary", lldb::eDynamicCanRunTarget)); + + m_dump_nsstring_measurement(frame_zero.FindVariable("str0", lldb::eDynamicCanRunTarget)); + m_dump_nsstring_measurement(frame_zero.FindVariable("str1", lldb::eDynamicCanRunTarget)); + m_dump_nsstring_measurement(frame_zero.FindVariable("str2", lldb::eDynamicCanRunTarget)); + m_dump_nsstring_measurement(frame_zero.FindVariable("str3", lldb::eDynamicCanRunTarget)); + m_dump_nsstring_measurement(frame_zero.FindVariable("str4", lldb::eDynamicCanRunTarget)); + + m_dump_nsdate_measurement(frame_zero.FindVariable("me", lldb::eDynamicCanRunTarget)); + m_dump_nsdate_measurement(frame_zero.FindVariable("cutie", lldb::eDynamicCanRunTarget)); + m_dump_nsdate_measurement(frame_zero.FindVariable("mom", lldb::eDynamicCanRunTarget)); + m_dump_nsdate_measurement(frame_zero.FindVariable("dad", lldb::eDynamicCanRunTarget)); + m_dump_nsdate_measurement(frame_zero.FindVariable("today", lldb::eDynamicCanRunTarget)); + + m_dump_nsbundle_measurement(frame_zero.FindVariable("bundles", lldb::eDynamicCanRunTarget)); + m_dump_nsbundle_measurement(frame_zero.FindVariable("frameworks", lldb::eDynamicCanRunTarget)); + + m_dump_nsset_measurement(frame_zero.FindVariable("nsset", lldb::eDynamicCanRunTarget)); + m_dump_nsset_measurement(frame_zero.FindVariable("nsmutableset", lldb::eDynamicCanRunTarget)); + + m_dump_std_vector_measurement(frame_zero.FindVariable("vector", lldb::eDynamicCanRunTarget)); + m_dump_std_list_measurement(frame_zero.FindVariable("list", lldb::eDynamicCanRunTarget)); + m_dump_std_map_measurement(frame_zero.FindVariable("map", lldb::eDynamicCanRunTarget)); + + m_dump_std_string_measurement(frame_zero.FindVariable("sstr0", lldb::eDynamicCanRunTarget)); + m_dump_std_string_measurement(frame_zero.FindVariable("sstr1", lldb::eDynamicCanRunTarget)); + m_dump_std_string_measurement(frame_zero.FindVariable("sstr2", lldb::eDynamicCanRunTarget)); + m_dump_std_string_measurement(frame_zero.FindVariable("sstr3", lldb::eDynamicCanRunTarget)); + m_dump_std_string_measurement(frame_zero.FindVariable("sstr4", lldb::eDynamicCanRunTarget)); + } + + virtual ActionWanted + TestStep (int counter) + { +#define STEP(n) if (counter == n) +#define NEXT(s) return TestCase::ActionWanted{TestCase::ActionWanted::Type::eAWNext,SelectMyThread(s)} +#define FINISH(s) return TestCase::ActionWanted{TestCase::ActionWanted::Type::eAWFinish,SelectMyThread(s)} +#define CONT return TestCase::ActionWanted{TestCase::ActionWanted::Type::eAWContinue,SBThread()} +#define KILL return TestCase::ActionWanted{TestCase::ActionWanted::Type::eAWKill,SBThread()} + STEP (0) + { + m_target.BreakpointCreateByLocation("fmts_tester.mm", 68); + CONT; + } + + STEP (1) + { + DoTest (); + CONT; + } + STEP (2) + { + DoTest (); + CONT; + } + STEP (3) + { + DoTest (); + CONT; + } + STEP (4) + { + DoTest (); + CONT; + } + STEP (5) + { + DoTest (); + CONT; + } + STEP (6) + { + DoTest (); + CONT; + } + STEP (7) + { + DoTest (); + CONT; + } + STEP (8) + { + DoTest (); + CONT; + } + STEP (9) + { + DoTest (); + CONT; + } + STEP (10) + { + DoTest (); + CONT; + } + KILL; + } + + void + Results () + { + CFCMutableArray array; + m_dump_std_vector_measurement.Write(array); + m_dump_std_list_measurement.Write(array); + m_dump_std_map_measurement.Write(array); + m_dump_std_string_measurement.Write(array); + + m_dump_nsstring_measurement.Write(array); + m_dump_nsarray_measurement.Write(array); + m_dump_nsdictionary_measurement.Write(array); + m_dump_nsset_measurement.Write(array); + m_dump_nsbundle_measurement.Write(array); + m_dump_nsdate_measurement.Write(array); + + CFDataRef xmlData = CFPropertyListCreateData(kCFAllocatorDefault, array.get(), kCFPropertyListXMLFormat_v1_0, 0, NULL); + + CFURLRef file = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8*)m_out_path.c_str(), m_out_path.size(), FALSE); + + CFURLWriteDataAndPropertiesToResource(file,xmlData,NULL,NULL); + } + +private: + // C++ formatters + TimeMeasurement<std::function<void(SBValue)>> m_dump_std_vector_measurement; + TimeMeasurement<std::function<void(SBValue)>> m_dump_std_list_measurement; + TimeMeasurement<std::function<void(SBValue)>> m_dump_std_map_measurement; + TimeMeasurement<std::function<void(SBValue)>> m_dump_std_string_measurement; + + // Cocoa formatters + TimeMeasurement<std::function<void(SBValue)>> m_dump_nsstring_measurement; + TimeMeasurement<std::function<void(SBValue)>> m_dump_nsarray_measurement; + TimeMeasurement<std::function<void(SBValue)>> m_dump_nsdictionary_measurement; + TimeMeasurement<std::function<void(SBValue)>> m_dump_nsset_measurement; + TimeMeasurement<std::function<void(SBValue)>> m_dump_nsbundle_measurement; + TimeMeasurement<std::function<void(SBValue)>> m_dump_nsdate_measurement; + + // useful files + std::string m_app_path; + std::string m_out_path; +}; + +// argv[1] == path to app +// argv[2] == path to result +int main(int argc, const char * argv[]) +{ + FormattersTest frmtest; + frmtest.SetVerbose(true); + TestCase::Run(frmtest,argc,argv); + return 0; +} + diff --git a/lldb/tools/lldb-perf/darwin/sketch/foobar.sketch2 b/lldb/tools/lldb-perf/darwin/sketch/foobar.sketch2 Binary files differnew file mode 100644 index 00000000000..553c698b180 --- /dev/null +++ b/lldb/tools/lldb-perf/darwin/sketch/foobar.sketch2 diff --git a/lldb/tools/lldb-perf/darwin/sketch/main.cpp b/lldb/tools/lldb-perf/darwin/sketch/main.cpp index de12140508c..132903b49e3 100644 --- a/lldb/tools/lldb-perf/darwin/sketch/main.cpp +++ b/lldb/tools/lldb-perf/darwin/sketch/main.cpp @@ -26,13 +26,13 @@ public: SketchTest () : m_fetch_frames_measurement ([this] (SBProcess process) -> void { Xcode::FetchFrames (process,false,false); - }, "fetch-frames"), + }, "fetch-frames", "time to dump backtrace for every frame in every thread"), m_file_line_bp_measurement([] (SBTarget target,const char* file, uint32_t line) -> void { Xcode::CreateFileLineBreakpoint(target, file, line); - }, "file-line-bkpt"), + }, "file-line-bkpt", "time to set a breakpoint given a file and line"), m_fetch_modules_measurement ([] (SBTarget target) -> void { Xcode::FetchModules(target); - }, "fetch-modules"), + }, "fetch-modules", "time to get info for all modules in the process"), m_fetch_vars_measurement([this] (SBProcess process, int depth) -> void { auto threads_count = process.GetNumThreads(); for (size_t thread_num = 0; thread_num < threads_count; thread_num++) @@ -42,11 +42,11 @@ public: Xcode::FetchVariables(frame,depth,GetVerbose()); } - }, "fetch-vars"), + }, "fetch-vars", "time to dump variables for the topmost frame in every thread"), m_run_expr_measurement([this] (SBFrame frame, const char* expr) -> void { SBValue value(frame.EvaluateExpression(expr, lldb::eDynamicCanRunTarget)); Xcode::FetchVariable(value,0,GetVerbose()); - }, "run-expr") + }, "run-expr", "time to evaluate an expression and display the result") {} virtual @@ -57,8 +57,8 @@ public: virtual void Setup (int argc, const char** argv) { - m_app_path.assign(argv[1]); // "~/perf/Small_ObjC/Sketch/build/Debug/Sketch.app" - m_doc_path.assign(argv[2]); // "/Volumes/work/egranata/perf/Small_ObjC/TesterApp/foobar.sketch2"; + m_app_path.assign(argv[1]); + m_doc_path.assign(argv[2]); m_out_path.assign(argv[3]); TestCase::Setup(argc,argv); m_target = m_debugger.CreateTarget(m_app_path.c_str()); diff --git a/lldb/tools/lldb-perf/lib/Measurement.h b/lldb/tools/lldb-perf/lib/Measurement.h index 0697b0fe30f..4623bdf8f6f 100644 --- a/lldb/tools/lldb-perf/lib/Measurement.h +++ b/lldb/tools/lldb-perf/lib/Measurement.h @@ -10,6 +10,7 @@ #define __PerfTestDriver__Measurement__ #include "Gauge.h" +#include "Timer.h" #include "Metric.h" namespace lldb { namespace perf @@ -18,10 +19,19 @@ template <typename GaugeType, typename Action> class Measurement : public WriteToPList { public: - Measurement (Action act, const char* name = NULL) : + Measurement () {} + + Measurement (Action act, const char* name = NULL, const char* descr = NULL) : m_action (act), - m_metric (Metric<typename GaugeType::SizeType>(name)) + m_metric (Metric<typename GaugeType::SizeType>(name,descr)) {} + + template <typename GaugeType_Rhs, typename Action_Rhs> + Measurement (const Measurement<GaugeType_Rhs, Action_Rhs>& rhs) : + m_action(rhs.action()), + m_metric(rhs.metric()) + { + } template <typename... Args> void @@ -31,22 +41,55 @@ public: m_metric.append (gauge.gauge(m_action,args...)); } - Metric<typename GaugeType::SizeType> - metric () + virtual const Metric<typename GaugeType::SizeType>& + metric () const { return m_metric; } + virtual const Action& + action () const + { + return m_action; + } + virtual void Write (CFCMutableArray& parent) { m_metric.Write(parent); } -private: +protected: Action m_action; Metric<typename GaugeType::SizeType> m_metric; }; + +template <typename Action> +class TimeMeasurement : public Measurement<TimeGauge,Action> +{ +public: + TimeMeasurement () : Measurement<TimeGauge,Action> () + {} + + TimeMeasurement (Action act, const char* name = NULL, const char* descr = NULL) : Measurement<TimeGauge,Action> (act, name, descr) + {} + + template <typename Action_Rhs> + TimeMeasurement (const TimeMeasurement<Action_Rhs>& rhs) : Measurement<TimeGauge,Action>(rhs) + {} + + template <typename GaugeType_Rhs, typename Action_Rhs> + TimeMeasurement (const Measurement<GaugeType_Rhs, Action_Rhs>& rhs) : Measurement<GaugeType_Rhs,Action_Rhs>(rhs) + {} + + template <typename... Args> + void + operator () (Args... args) + { + Measurement<TimeGauge,Action>::operator()(args...); + } +}; + } } #endif /* defined(__PerfTestDriver__Measurement__) */ diff --git a/lldb/tools/lldb-perf/lib/Metric.cpp b/lldb/tools/lldb-perf/lib/Metric.cpp index 885413fc65a..3791dd35409 100644 --- a/lldb/tools/lldb-perf/lib/Metric.cpp +++ b/lldb/tools/lldb-perf/lib/Metric.cpp @@ -19,8 +19,9 @@ Metric<T>::Metric () : Metric ("") {} template <class T> -Metric<T>::Metric (const char* n) : +Metric<T>::Metric (const char* n, const char* d) : m_name(n ? n : ""), +m_description(d ? d : ""), m_dataset () {} @@ -63,10 +64,18 @@ Metric<T>::name () } template <class T> +const char* +Metric<T>::description () +{ + return m_description.c_str(); +} + +template <class T> void Metric<T>::WriteImpl (CFCMutableArray& parent, identity<double>) { CFCMutableDictionary dict; - dict.AddValueCString(CFCString("name").get(),m_name.c_str(), true); + dict.AddValueCString(CFCString("name").get(),name(), true); + dict.AddValueCString(CFCString("description").get(),description(), true); dict.AddValueDouble(CFCString("value").get(),this->average(), true); parent.AppendValue(dict.get(), true); } @@ -75,7 +84,8 @@ template <class T> void Metric<T>::WriteImpl (CFCMutableArray& parent, identity<mach_vm_size_t>) { CFCMutableDictionary dict; - dict.AddValueCString(CFCString("name").get(),m_name.c_str(), true); + dict.AddValueCString(CFCString("name").get(),name(), true); + dict.AddValueCString(CFCString("description").get(),description(), true); dict.AddValueUInt64(CFCString("value").get(),this->average(), true); parent.AppendValue(dict.get(), true); } diff --git a/lldb/tools/lldb-perf/lib/Metric.h b/lldb/tools/lldb-perf/lib/Metric.h index 33ed6c27443..874169522ad 100644 --- a/lldb/tools/lldb-perf/lib/Metric.h +++ b/lldb/tools/lldb-perf/lib/Metric.h @@ -31,7 +31,7 @@ template <class ValueType> class Metric : public WriteToPList { public: Metric (); - Metric (const char*); + Metric (const char*, const char* = NULL); void append (ValueType v); @@ -48,6 +48,9 @@ public: const char* name (); + const char* + description (); + virtual void Write (CFCMutableArray& parent) { @@ -64,6 +67,7 @@ private: void WriteImpl (CFCMutableArray& parent, identity<mach_vm_size_t>); std::string m_name; + std::string m_description; std::vector<ValueType> m_dataset; }; } } diff --git a/lldb/tools/lldb-perf/lib/TestCase.cpp b/lldb/tools/lldb-perf/lib/TestCase.cpp index 2067969f81a..beb335f6613 100644 --- a/lldb/tools/lldb-perf/lib/TestCase.cpp +++ b/lldb/tools/lldb-perf/lib/TestCase.cpp @@ -18,17 +18,17 @@ m_process(), m_thread(), m_listener(), m_verbose(false) -{} - -void -TestCase::Setup (int argc, const char** argv) { - SBDebugger::Initialize(); + SBDebugger::Initialize(); SBHostOS::ThreadCreated ("<lldb-tester.app.main>"); m_debugger = SBDebugger::Create(false); m_listener = m_debugger.GetListener(); } +void +TestCase::Setup (int argc, const char** argv) +{} + bool TestCase::Launch (const char** args, const char* cwd) { diff --git a/lldb/tools/lldb-perf/lib/TestCase.h b/lldb/tools/lldb-perf/lib/TestCase.h index f2d67de6662..c4d449a330a 100644 --- a/lldb/tools/lldb-perf/lib/TestCase.h +++ b/lldb/tools/lldb-perf/lib/TestCase.h @@ -59,9 +59,15 @@ public: Results () = 0; template <typename G,typename A> - Measurement<G,A> CreateMeasurement (A a, const char* name = NULL) + Measurement<G,A> CreateMeasurement (A a, const char* name = NULL, const char* description = NULL) { - return Measurement<G,A> (a,name); + return Measurement<G,A> (a,name, description); + } + + template <typename A> + TimeMeasurement<A> CreateTimeMeasurement (A a, const char* name = NULL, const char* description = NULL) + { + return TimeMeasurement<A> (a,name, description); } static void diff --git a/lldb/tools/lldb-perf/lib/Xcode.cpp b/lldb/tools/lldb-perf/lib/Xcode.cpp index fd2d2c4406c..730844d520f 100644 --- a/lldb/tools/lldb-perf/lib/Xcode.cpp +++ b/lldb/tools/lldb-perf/lib/Xcode.cpp @@ -32,7 +32,7 @@ Xcode::FetchVariable (SBValue value, uint32_t expand, bool verbose) auto count = value.GetNumChildren(); for (int i = 0; i < count; i++) { - SBValue child(value.GetChildAtIndex(i)); + SBValue child(value.GetChildAtIndex(i,value.IsDynamic() ? lldb::eDynamicCanRunTarget : lldb::eNoDynamicValues, true)); FetchVariable (child,expand-1,verbose); } } |

