diff options
-rw-r--r-- | lldb/lldb.xcodeproj/project.pbxproj | 165 | ||||
-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 |
11 files changed, 581 insertions, 24 deletions
diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj index cb51b0be0ef..a0e8ed3e9c9 100644 --- a/lldb/lldb.xcodeproj/project.pbxproj +++ b/lldb/lldb.xcodeproj/project.pbxproj @@ -585,6 +585,10 @@ 94D6A0AA16CEB55F00833B6E /* NSArray.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94D6A0A716CEB55F00833B6E /* NSArray.cpp */; }; 94D6A0AB16CEB55F00833B6E /* NSDictionary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94D6A0A816CEB55F00833B6E /* NSDictionary.cpp */; }; 94D6A0AC16CEB55F00833B6E /* NSSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94D6A0A916CEB55F00833B6E /* NSSet.cpp */; }; + 94DB610216EA89B800459D9E /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26F5C39010F3FA26009D5894 /* CoreFoundation.framework */; }; + 94DB610316EA89BD00459D9E /* LLDB.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26680207115FD0ED008E1FE4 /* LLDB.framework */; }; + 94DB610416EA89BD00459D9E /* lldbperf.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 940DB89A16EA5F4200D3C2F1 /* lldbperf.a */; }; + 94DB610516EA89C000459D9E /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94DB60F016EA888A00459D9E /* main.cpp */; }; 94EA1D5C15E6C9B400D4171A /* PythonDataObjects.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94EA1D5B15E6C9B400D4171A /* PythonDataObjects.cpp */; }; 94FA3DE01405D50400833217 /* ValueObjectConstResultChild.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94FA3DDF1405D50300833217 /* ValueObjectConstResultChild.cpp */; }; 9A19A6AF1163BBB200E0D453 /* SBValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A19A6A51163BB7E00E0D453 /* SBValue.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -741,6 +745,13 @@ remoteGlobalIDString = 940DB89916EA5F4200D3C2F1; remoteInfo = lldbperf; }; + 94DB610016EA89AE00459D9E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 940DB89916EA5F4200D3C2F1; + remoteInfo = lldbperf; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -753,6 +764,15 @@ ); runOnlyForDeploymentPostprocessing = 1; }; + 94DB60F316EA897F00459D9E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; AF90106415AB7D2900FF120D /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; @@ -1666,6 +1686,8 @@ 94D6A0A716CEB55F00833B6E /* NSArray.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NSArray.cpp; path = source/DataFormatters/NSArray.cpp; sourceTree = "<group>"; }; 94D6A0A816CEB55F00833B6E /* NSDictionary.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NSDictionary.cpp; path = source/DataFormatters/NSDictionary.cpp; sourceTree = "<group>"; }; 94D6A0A916CEB55F00833B6E /* NSSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NSSet.cpp; path = source/DataFormatters/NSSet.cpp; sourceTree = "<group>"; }; + 94DB60F016EA888A00459D9E /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; }; + 94DB60F516EA897F00459D9E /* lldb-perf-formatters */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "lldb-perf-formatters"; sourceTree = BUILT_PRODUCTS_DIR; }; 94E367CC140C4EC4001C7A5A /* modify-python-lldb.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = "modify-python-lldb.py"; sourceTree = "<group>"; }; 94E367CE140C4EEA001C7A5A /* python-typemaps.swig */ = {isa = PBXFileReference; lastKnownFileType = text; path = "python-typemaps.swig"; sourceTree = "<group>"; }; 94EA1D5A15E6C99B00D4171A /* PythonDataObjects.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PythonDataObjects.h; path = include/lldb/Interpreter/PythonDataObjects.h; sourceTree = "<group>"; }; @@ -1859,6 +1881,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 94DB60F216EA897F00459D9E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 94DB610216EA89B800459D9E /* CoreFoundation.framework in Frameworks */, + 94DB610316EA89BD00459D9E /* LLDB.framework in Frameworks */, + 94DB610416EA89BD00459D9E /* lldbperf.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; EDC6D49614E5C19B001B75F8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1928,6 +1960,7 @@ EDE274EC14EDCE1F005B0F75 /* com.apple.lldb.launcherRootXPCService.xpc */, 940DB89A16EA5F4200D3C2F1 /* lldbperf.a */, 940DB8AD16EA60C900D3C2F1 /* lldb-perf-sketch */, + 94DB60F516EA897F00459D9E /* lldb-perf-formatters */, ); name = Products; sourceTree = "<group>"; @@ -3476,6 +3509,7 @@ 940DB8C616EA654E00D3C2F1 /* darwin */ = { isa = PBXGroup; children = ( + 940DB8FB16EA84BF00D3C2F1 /* formatters */, 940DB8C716EA655400D3C2F1 /* sketch */, ); path = darwin; @@ -3489,6 +3523,14 @@ path = sketch; sourceTree = "<group>"; }; + 940DB8FB16EA84BF00D3C2F1 /* formatters */ = { + isa = PBXGroup; + children = ( + 94DB60F016EA888A00459D9E /* main.cpp */, + ); + path = formatters; + sourceTree = "<group>"; + }; 94CB255616B0683B0059775D /* DataFormatters */ = { isa = PBXGroup; children = ( @@ -3812,6 +3854,24 @@ productReference = 940DB8AD16EA60C900D3C2F1 /* lldb-perf-sketch */; productType = "com.apple.product-type.tool"; }; + 94DB60F416EA897F00459D9E /* lldb-perf-formatters */ = { + isa = PBXNativeTarget; + buildConfigurationList = 94DB60FB16EA897F00459D9E /* Build configuration list for PBXNativeTarget "lldb-perf-formatters" */; + buildPhases = ( + 94DB60F116EA897F00459D9E /* Sources */, + 94DB60F216EA897F00459D9E /* Frameworks */, + 94DB60F316EA897F00459D9E /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 94DB610116EA89AE00459D9E /* PBXTargetDependency */, + ); + name = "lldb-perf-formatters"; + productName = "lldb-perf-formatters"; + productReference = 94DB60F516EA897F00459D9E /* lldb-perf-formatters */; + productType = "com.apple.product-type.tool"; + }; EDC6D49814E5C19B001B75F8 /* launcherXPCService */ = { isa = PBXNativeTarget; buildConfigurationList = EDC6D4A614E5C19B001B75F8 /* Build configuration list for PBXNativeTarget "launcherXPCService" */; @@ -3884,6 +3944,7 @@ 2687EAC51508110B00DD8C2E /* install-headers */, 940DB89916EA5F4200D3C2F1 /* lldbperf */, 940DB8AC16EA60C900D3C2F1 /* lldb-perf-sketch */, + 94DB60F416EA897F00459D9E /* lldb-perf-formatters */, ); }; /* End PBXProject section */ @@ -4483,6 +4544,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 94DB60F116EA897F00459D9E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 94DB610516EA89C000459D9E /* main.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; EDC6D49514E5C19B001B75F8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -4579,6 +4648,11 @@ target = 940DB89916EA5F4200D3C2F1 /* lldbperf */; targetProxy = 940DB8E816EA72BE00D3C2F1 /* PBXContainerItemProxy */; }; + 94DB610116EA89AE00459D9E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 940DB89916EA5F4200D3C2F1 /* lldbperf */; + targetProxy = 94DB610016EA89AE00459D9E /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -6063,6 +6137,86 @@ }; name = BuildAndIntegration; }; + 94DB60FC16EA897F00459D9E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + PRODUCT_NAME = "$(TARGET_NAME)"; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/include $(SRCROOT)/source $(LLVM_SOURCE_DIR)/include $(LLVM_SOURCE_DIR)/tools/clang/include $(LLVM_BUILD_DIR)/$(LLVM_BUILD_DIR_ARCH)/include $(LLVM_BUILD_DIR)/$(LLVM_BUILD_DIR_ARCH)/tools/clang/include $(SRCROOT)/Tools"; + }; + name = Debug; + }; + 94DB60FD16EA897F00459D9E /* DebugClang */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + PRODUCT_NAME = "$(TARGET_NAME)"; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/include $(SRCROOT)/source $(LLVM_SOURCE_DIR)/include $(LLVM_SOURCE_DIR)/tools/clang/include $(LLVM_BUILD_DIR)/$(LLVM_BUILD_DIR_ARCH)/include $(LLVM_BUILD_DIR)/$(LLVM_BUILD_DIR_ARCH)/tools/clang/include $(SRCROOT)/Tools"; + }; + name = DebugClang; + }; + 94DB60FE16EA897F00459D9E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + PRODUCT_NAME = "$(TARGET_NAME)"; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/include $(SRCROOT)/source $(LLVM_SOURCE_DIR)/include $(LLVM_SOURCE_DIR)/tools/clang/include $(LLVM_BUILD_DIR)/$(LLVM_BUILD_DIR_ARCH)/include $(LLVM_BUILD_DIR)/$(LLVM_BUILD_DIR_ARCH)/tools/clang/include $(SRCROOT)/Tools $(SRCROOT)/source/Host/macosx/"; + }; + name = Release; + }; + 94DB60FF16EA897F00459D9E /* BuildAndIntegration */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + PRODUCT_NAME = "$(TARGET_NAME)"; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/include $(SRCROOT)/source $(LLVM_SOURCE_DIR)/include $(LLVM_SOURCE_DIR)/tools/clang/include $(LLVM_BUILD_DIR)/$(LLVM_BUILD_DIR_ARCH)/include $(LLVM_BUILD_DIR)/$(LLVM_BUILD_DIR_ARCH)/tools/clang/include $(SRCROOT)/Tools $(SRCROOT)/source/Host/macosx/"; + }; + name = BuildAndIntegration; + }; EDC6D4A714E5C19B001B75F8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -6387,6 +6541,17 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = BuildAndIntegration; }; + 94DB60FB16EA897F00459D9E /* Build configuration list for PBXNativeTarget "lldb-perf-formatters" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 94DB60FC16EA897F00459D9E /* Debug */, + 94DB60FD16EA897F00459D9E /* DebugClang */, + 94DB60FE16EA897F00459D9E /* Release */, + 94DB60FF16EA897F00459D9E /* BuildAndIntegration */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = BuildAndIntegration; + }; EDC6D4A614E5C19B001B75F8 /* Build configuration list for PBXNativeTarget "launcherXPCService" */ = { isa = XCConfigurationList; buildConfigurations = ( 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); } } |