diff options
author | Todd Fiala <todd.fiala@gmail.com> | 2014-09-25 19:25:07 +0000 |
---|---|---|
committer | Todd Fiala <todd.fiala@gmail.com> | 2014-09-25 19:25:07 +0000 |
commit | b3185e710e797b441c042a942d812eaf6b01ad4a (patch) | |
tree | b29c7d86ca2a591ec7465edbedcf19ac85ff37f5 | |
parent | 1fa1ce6112a5a1550b107daae3d9ddd7017dd25c (diff) | |
download | bcm5719-llvm-b3185e710e797b441c042a942d812eaf6b01ad4a.tar.gz bcm5719-llvm-b3185e710e797b441c042a942d812eaf6b01ad4a.zip |
Fixup gtest layout, add Linux ThreadStateCoordinator.cpp.
This change does the following:
* Remove test/c++/...
* Add gtest.
* Add gtest/unittest directory for unittesting individual classes.
* Add an initial Plugins/Process?linux/ThreadStateCoordinatorTest.cpp.
- currently failing a test (intentional).
- added a bare-bones ThreadStateCoordinator.cpp to Plugins/Process/Linux,
more soon. Just enough to prove out running gtest on Ubuntu and MacOSX.
* Added recursive make machinery so that doing a 'make' in gtest/ is
sufficient to kick off the existing test several directories down.
- Caveat - I currently short circuit from gtest/unittest/Makefile directly to
the one and only gtest/unittest/Plugins/Process/Linux directory. We'll need
to add the intervening layers. I haven't done this yet since to fix the
Xcode test failure correspondence, I may need to add a python layer which
might just handle the directory crawling.
* Added an Xcode project to the lldb workspace for gtest.
- Runs the recursive make system in gtest/Makefile.
- Default target is 'test'. test and clean are supported.
- Currently does not support test failure file/line correspondence.
Requires a bit of text transformation to hook that up.
llvm-svn: 218460
-rw-r--r-- | lldb/gtest/Makefile | 5 | ||||
-rw-r--r-- | lldb/gtest/gtest.xcodeproj/project.pbxproj | 232 | ||||
-rw-r--r-- | lldb/gtest/make/Makefile.rules | 91 | ||||
-rw-r--r-- | lldb/gtest/unittest/Makefile | 7 | ||||
-rw-r--r-- | lldb/gtest/unittest/Plugins/Process/Linux/Makefile | 17 | ||||
-rw-r--r-- | lldb/gtest/unittest/Plugins/Process/Linux/ThreadStateCoordinatorTest.cpp | 49 | ||||
-rw-r--r-- | lldb/lldb.xcodeproj/project.pbxproj | 6 | ||||
-rw-r--r-- | lldb/lldb.xcworkspace/contents.xcworkspacedata | 3 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/Linux/CMakeLists.txt | 3 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/Linux/ThreadStateCoordinator.cpp | 38 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/Linux/ThreadStateCoordinator.h | 85 | ||||
-rw-r--r-- | lldb/test/c++/make/Makefile.rules | 58 | ||||
-rw-r--r-- | lldb/test/c++/native_process/thread_state_coordinator/Makefile | 14 | ||||
-rw-r--r-- | lldb/test/c++/native_process/thread_state_coordinator/ThreadStateCoordinatorTest.cpp | 7 |
14 files changed, 535 insertions, 80 deletions
diff --git a/lldb/gtest/Makefile b/lldb/gtest/Makefile new file mode 100644 index 00000000000..a1492fb9978 --- /dev/null +++ b/lldb/gtest/Makefile @@ -0,0 +1,5 @@ +LEVEL := ./make + +SUBDIRS := unittest + +include $(LEVEL)/Makefile.rules diff --git a/lldb/gtest/gtest.xcodeproj/project.pbxproj b/lldb/gtest/gtest.xcodeproj/project.pbxproj new file mode 100644 index 00000000000..ed1ace7e207 --- /dev/null +++ b/lldb/gtest/gtest.xcodeproj/project.pbxproj @@ -0,0 +1,232 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXFileReference section */ + 236ED33319D49076008CA7D7 /* ThreadStateCoordinatorTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ThreadStateCoordinatorTest.cpp; sourceTree = "<group>"; }; + 236ED33419D49081008CA7D7 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; }; + 236ED33619D490B0008CA7D7 /* Makefile.rules */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.rules; sourceTree = "<group>"; }; +/* End PBXFileReference section */ + +/* Begin PBXGroup section */ + 236ED32F19D4901D008CA7D7 /* unittest */ = { + isa = PBXGroup; + children = ( + 236ED33019D4903E008CA7D7 /* Plugins */, + ); + path = unittest; + sourceTree = "<group>"; + }; + 236ED33019D4903E008CA7D7 /* Plugins */ = { + isa = PBXGroup; + children = ( + 236ED33119D4904B008CA7D7 /* Process */, + ); + path = Plugins; + sourceTree = "<group>"; + }; + 236ED33119D4904B008CA7D7 /* Process */ = { + isa = PBXGroup; + children = ( + 236ED33219D4905B008CA7D7 /* Linux */, + ); + path = Process; + sourceTree = "<group>"; + }; + 236ED33219D4905B008CA7D7 /* Linux */ = { + isa = PBXGroup; + children = ( + 236ED33419D49081008CA7D7 /* Makefile */, + 236ED33319D49076008CA7D7 /* ThreadStateCoordinatorTest.cpp */, + ); + path = Linux; + sourceTree = "<group>"; + }; + 236ED33519D49098008CA7D7 /* make */ = { + isa = PBXGroup; + children = ( + 236ED33619D490B0008CA7D7 /* Makefile.rules */, + ); + path = make; + sourceTree = "<group>"; + }; + 23CDD8EE19D4790700461DDC = { + isa = PBXGroup; + children = ( + 236ED33519D49098008CA7D7 /* make */, + 236ED32F19D4901D008CA7D7 /* unittest */, + ); + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXLegacyTarget section */ + 23CDD8F319D4790700461DDC /* gtest */ = { + isa = PBXLegacyTarget; + buildArgumentsString = "$(ACTION)"; + buildConfigurationList = 23CDD8F619D4790700461DDC /* Build configuration list for PBXLegacyTarget "gtest" */; + buildPhases = ( + ); + buildToolPath = /usr/bin/make; + buildWorkingDirectory = .; + dependencies = ( + ); + name = gtest; + passBuildSettingsInEnvironment = 1; + productName = gtest; + }; +/* End PBXLegacyTarget section */ + +/* Begin PBXProject section */ + 23CDD8EF19D4790700461DDC /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0600; + ORGANIZATIONNAME = LLVM; + TargetAttributes = { + 23CDD8F319D4790700461DDC = { + CreatedOnToolsVersion = 6.1; + }; + }; + }; + buildConfigurationList = 23CDD8F219D4790700461DDC /* Build configuration list for PBXProject "gtest" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 23CDD8EE19D4790700461DDC; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 23CDD8F319D4790700461DDC /* gtest */, + ); + }; +/* End PBXProject section */ + +/* Begin XCBuildConfiguration section */ + 23CDD8F419D4790700461DDC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 23CDD8F519D4790700461DDC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + 23CDD8F719D4790700461DDC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEBUGGING_SYMBOLS = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 23CDD8F819D4790700461DDC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 23CDD8F219D4790700461DDC /* Build configuration list for PBXProject "gtest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 23CDD8F419D4790700461DDC /* Debug */, + 23CDD8F519D4790700461DDC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 23CDD8F619D4790700461DDC /* Build configuration list for PBXLegacyTarget "gtest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 23CDD8F719D4790700461DDC /* Debug */, + 23CDD8F819D4790700461DDC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 23CDD8EF19D4790700461DDC /* Project object */; +} diff --git a/lldb/gtest/make/Makefile.rules b/lldb/gtest/make/Makefile.rules new file mode 100644 index 00000000000..aba4e872e12 --- /dev/null +++ b/lldb/gtest/make/Makefile.rules @@ -0,0 +1,91 @@ +# Retrieve this Makefile's location. +THIS_FILE_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))/ + +# Set default target to be test +.DEFAULT_GOAL := test + +# Set up GTEST for canonical Linux and MacOSX source trees. +ifneq ($(wildcard $(THIS_FILE_DIR)../../llvm/utils/unittest/googletest),) + # Assume lldb/llvm (MacOSX Xcode) directory form. + LLVM_BASE_DIR := $(realpath $(THIS_FILE_DIR)../../llvm) +else + # Assume llvm/tools/lldb (Non-MacOSX) directory form. + LLVM_BASE_DIR := $(realpath $(THIS_FILE_DIR)../../../..) +endif + +ifeq ($(GTEST_DIR),) + GTEST_DIR := $(LLVM_BASE_DIR)/utils/unittest/googletest +endif +GTEST_INCLUDE_DIR := $(GTEST_DIR)/include + +ifeq ($(LLVM_BUILD_DIR),) + ifneq ($(wildcard $(THIS_FILE_DIR)../../llvm-build/Release+Asserts/x86_64/Release+Asserts),) + LLVM_BUILD_DIR := $(realpath $(THIS_FILE_DIR)../../llvm-build/Release+Asserts/x86_64/Release+Asserts) + else ifneq ($(wildcard $(THIS_FILE_DIR)../../../../../build-debug/lib),) + LLVM_BUILD_DIR := $(realpath $(THIS_FILE_DIR)../../../../../build-debug) + endif +endif + +ifeq ($(LLVM_BUILD_DIR),) + $(error Could not find LLVM build output dir, please set it with LLVM_BUILD_DIR) +endif +GTEST_STATIC_LIB_DIR := $(LLVM_BUILD_DIR)/lib + +ifeq ($(LLVM_BUILD_INCLUDE_DIR),) + ifneq ($(wildcard $(LLVM_BUILD_DIR)/../include),) + LLVM_BUILD_INCLUDE_DIR := $(realpath $(LLVM_BUILD_DIR)/../include) + else ifneq ($(wildcard $(LLVM_BUILD_DIR)/include),) + LLVM_BUILD_INCLUDE_DIR := $(realpath $(LLVM_BUILD_DIR)/include) + endif +endif + +ifeq ($(LLVM_BUILD_INCLUDE_DIR),) + $(error Could not find LLVM build directory include dir, please set it with LLVM_BUILD_INCLUDE_DIR) +endif + +# $(info LLVM_BASE_DIR = $(LLVM_BASE_DIR)) +# $(info LLVM_BUILD_DIR = $(LLVM_BUILD_DIR)) +# $(info GTEST_DIR = $(GTEST_DIR)) +# $(info GTEST_INCLUDE_DIR = $(GTEST_INCLUDE_DIR)) +# $(info GTEST_STATIC_LIB_DIR = $(GTEST_STATIC_LIB_DIR)) + +# Note lldb/include is already added for us by test/make/Makefile.rules +LLDB_HEADER_DIRS += \ + -I $(realpath $(THIS_FILE_DIR)../../source/) +# -I $(realpath $(THIS_FILE_DIR)../../include) + +CFLAGS_EXTRAS += -I $(GTEST_INCLUDE_DIR) -I $(LLVM_BASE_DIR)/include -I $(LLVM_BUILD_INCLUDE_DIR) $(LLDB_HEADER_DIRS) +LD_EXTRAS += $(GTEST_STATIC_LIB_DIR)/libgtest.a $(GTEST_STATIC_LIB_DIR)/libgtest_main.a $(GTEST_STATIC_LIB_DIR)/libLLVMSupport.a + +.PHONY: clean test + +# Handle subdirs +ifneq ($(SUBDIRS),) + +.PHONY: subdirs $(SUBDIRS) + +subdirs: $(SUBDIRS) + +test:: subdirs + +clean:: subdirs + +$(SUBDIRS): + $(MAKE) -C $@ $(MAKECMDGOALS) + +endif + + +# Skip pulling in build rules when we don't have an CXX_SOURCES defined. +# If this is the case, then we're just recursing directories. +# Consider doing directory handling/makefile running via a python script +# like test/dotest.py. + +ifneq ($(CXX_SOURCES),) + +include $(realpath $(THIS_FILE_DIR)../../test/make/Makefile.rules) + +test:: $(EXE) + $(realpath $(EXE)) + +endif
\ No newline at end of file diff --git a/lldb/gtest/unittest/Makefile b/lldb/gtest/unittest/Makefile new file mode 100644 index 00000000000..7a93c63cedb --- /dev/null +++ b/lldb/gtest/unittest/Makefile @@ -0,0 +1,7 @@ +LEVEL := ../make + +SUBDIRS := Plugins/Process/Linux + +$(info in unittest Makefile) + +include $(LEVEL)/Makefile.rules diff --git a/lldb/gtest/unittest/Plugins/Process/Linux/Makefile b/lldb/gtest/unittest/Plugins/Process/Linux/Makefile new file mode 100644 index 00000000000..f80768c2199 --- /dev/null +++ b/lldb/gtest/unittest/Plugins/Process/Linux/Makefile @@ -0,0 +1,17 @@ +THIS_FILE_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))/ + +LEVEL := $(realpath $(THIS_FILE_DIR)../../../../make) + +CFLAGS_EXTRAS := -D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS +ENABLE_THREADS := YES +CXX_SOURCES := $(wildcard *.cpp) \ + $(realpath $(LEVEL)/../../source/Plugins/Process/Linux/ThreadStateCoordinator.cpp) +MAKE_DSYM := NO + +OS := $(shell uname -s) +# $(info OS $(OS)) +ifeq ($(OS),Linux) + LD_EXTRAS := -lncurses -ldl +endif + +include $(LEVEL)/Makefile.rules diff --git a/lldb/gtest/unittest/Plugins/Process/Linux/ThreadStateCoordinatorTest.cpp b/lldb/gtest/unittest/Plugins/Process/Linux/ThreadStateCoordinatorTest.cpp new file mode 100644 index 00000000000..016e2d87537 --- /dev/null +++ b/lldb/gtest/unittest/Plugins/Process/Linux/ThreadStateCoordinatorTest.cpp @@ -0,0 +1,49 @@ +#include <limits.h> +#include "gtest/gtest.h" + +#include "Plugins/Process/Linux/ThreadStateCoordinator.h" + +using namespace lldb_private; + +namespace +{ + const ThreadStateCoordinator::ThreadIDSet EMPTY_THREAD_ID_SET; + + void + NOPLogger (const char *format, va_list args) + { + // Do nothing. + } +} + +TEST(ThreadStateCoordinatorTest, StopCoordinatorWorksNoPriorEvents) +{ + ThreadStateCoordinator coordinator(NOPLogger); + + coordinator.StopCoordinator (); + + ASSERT_EQ(coordinator.ProcessNextEvent (), false); +} + +TEST(ThreadStateCoordinatorTest, CallAfterThreadsStopFiresWhenNoPendingStops) +{ + ThreadStateCoordinator coordinator(NOPLogger); + + const lldb::tid_t TRIGGERING_TID = 4105; + bool call_after_fired = false; + + // Notify we have a trigger that needs to be fired when all threads in the wait tid set have stopped. + coordinator.CallAfterThreadsStop (TRIGGERING_TID, + EMPTY_THREAD_ID_SET, + [](lldb::tid_t tid) {}, + [&](lldb::tid_t tid) { call_after_fired = true; }); + + // Notification trigger shouldn't go off yet. + ASSERT_EQ (call_after_fired, false); + + // Process next event. This will pick up the call after threads stop event. + ASSERT_EQ(coordinator.ProcessNextEvent (), true); + + // Now the trigger should have fired. + ASSERT_EQ(call_after_fired, true); +} diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj index 4b000d8837f..3a3934d51c0 100644 --- a/lldb/lldb.xcodeproj/project.pbxproj +++ b/lldb/lldb.xcodeproj/project.pbxproj @@ -69,6 +69,7 @@ 233B007F1960CB280090E598 /* ProcessLaunchInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 233B007E1960CB280090E598 /* ProcessLaunchInfo.cpp */; }; 236124A41986B4E2004EFC37 /* IOObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 236124A21986B4E2004EFC37 /* IOObject.cpp */; }; 236124A51986B4E2004EFC37 /* Socket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 236124A31986B4E2004EFC37 /* Socket.cpp */; }; + 23CDD8FB19D47B3600461DDC /* ThreadStateCoordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 23CDD8E819D3E13200461DDC /* ThreadStateCoordinator.cpp */; }; 23DDF226196C3EE600BB8417 /* CommandOptionValidators.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 23DDF224196C3EE600BB8417 /* CommandOptionValidators.cpp */; }; 23EDE33319269E7C00F6A132 /* NativeRegisterContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 23EDE3301926839700F6A132 /* NativeRegisterContext.cpp */; }; 23EFE389193D1ABC00E54E54 /* SBTypeEnumMember.h in Headers */ = {isa = PBXBuildFile; fileRef = 23EFE388193D1ABC00E54E54 /* SBTypeEnumMember.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -980,6 +981,8 @@ 23AB0530199FF639003B8084 /* ProcessFreeBSD.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ProcessFreeBSD.h; sourceTree = "<group>"; }; 23AB0531199FF639003B8084 /* ProcessMonitor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ProcessMonitor.cpp; sourceTree = "<group>"; }; 23AB0532199FF639003B8084 /* ProcessMonitor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ProcessMonitor.h; sourceTree = "<group>"; }; + 23B6FF4119D38D48004CC8C3 /* ThreadStateCoordinator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ThreadStateCoordinator.h; sourceTree = "<group>"; }; + 23CDD8E819D3E13200461DDC /* ThreadStateCoordinator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ThreadStateCoordinator.cpp; sourceTree = "<group>"; }; 23DDF224196C3EE600BB8417 /* CommandOptionValidators.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CommandOptionValidators.cpp; path = source/Interpreter/CommandOptionValidators.cpp; sourceTree = "<group>"; }; 23EDE3301926839700F6A132 /* NativeRegisterContext.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = NativeRegisterContext.cpp; path = source/Target/NativeRegisterContext.cpp; sourceTree = "<group>"; }; 23EDE3311926843600F6A132 /* NativeRegisterContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NativeRegisterContext.h; path = include/lldb/Target/NativeRegisterContext.h; sourceTree = "<group>"; }; @@ -2370,6 +2373,8 @@ 233B009319610B1F0090E598 /* ProcessMonitor.h */, 233B00A2196113730090E598 /* ProcFileReader.h */, 233B00A1196113730090E598 /* ProcFileReader.cpp */, + 23B6FF4119D38D48004CC8C3 /* ThreadStateCoordinator.h */, + 23CDD8E819D3E13200461DDC /* ThreadStateCoordinator.cpp */, ); path = Linux; sourceTree = "<group>"; @@ -5255,6 +5260,7 @@ AF26703B1852D01E00B6CC36 /* QueueList.cpp in Sources */, 267C012B136880DF006E963E /* OptionGroupValueObjectDisplay.cpp in Sources */, 26BCFC521368AE38006DC050 /* OptionGroupFormat.cpp in Sources */, + 23CDD8FB19D47B3600461DDC /* ThreadStateCoordinator.cpp in Sources */, AF81DEFA1828A23F0042CF19 /* SystemRuntime.cpp in Sources */, 267C01371368C49C006E963E /* OptionGroupOutputFile.cpp in Sources */, 260E07C6136FA69E00CF21D3 /* OptionGroupUUID.cpp in Sources */, diff --git a/lldb/lldb.xcworkspace/contents.xcworkspacedata b/lldb/lldb.xcworkspace/contents.xcworkspacedata index 3266d5b39e2..96c1cfc872e 100644 --- a/lldb/lldb.xcworkspace/contents.xcworkspacedata +++ b/lldb/lldb.xcworkspace/contents.xcworkspacedata @@ -10,4 +10,7 @@ <FileRef location = "group:tools/lldb-perf/lldbperf.xcodeproj"> </FileRef> + <FileRef + location = "group:gtest/gtest.xcodeproj"> + </FileRef> </Workspace> diff --git a/lldb/source/Plugins/Process/Linux/CMakeLists.txt b/lldb/source/Plugins/Process/Linux/CMakeLists.txt index 4753219c398..b540b95c0ab 100644 --- a/lldb/source/Plugins/Process/Linux/CMakeLists.txt +++ b/lldb/source/Plugins/Process/Linux/CMakeLists.txt @@ -5,12 +5,13 @@ include_directories(../POSIX) include_directories(../Utility) add_lldb_library(lldbPluginProcessLinux + LinuxThread.cpp NativeProcessLinux.cpp NativeRegisterContextLinux_x86_64.cpp NativeThreadLinux.cpp ProcessLinux.cpp ProcessMonitor.cpp ProcFileReader.cpp - LinuxThread.cpp + ThreadStateCoordinator.cpp ) diff --git a/lldb/source/Plugins/Process/Linux/ThreadStateCoordinator.cpp b/lldb/source/Plugins/Process/Linux/ThreadStateCoordinator.cpp new file mode 100644 index 00000000000..40bcebe6847 --- /dev/null +++ b/lldb/source/Plugins/Process/Linux/ThreadStateCoordinator.cpp @@ -0,0 +1,38 @@ +//===-- ThreadStateCoordinator.cpp ------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "ThreadStateCoordinator.h" + +using namespace lldb_private; + +ThreadStateCoordinator::ThreadStateCoordinator (const LogFunc &log_func) : + m_done_b (false), + m_log_func (log_func) +{ +} + +void +ThreadStateCoordinator::CallAfterThreadsStop (const lldb::tid_t triggering_tid, + const ThreadIDSet &wait_for_stop_tids, + const ThreadIDFunc &request_thread_stop_func, + const ThreadIDFunc &call_after_func) +{ +} + +void +ThreadStateCoordinator::StopCoordinator () +{ + m_done_b = true; +} + +bool +ThreadStateCoordinator::ProcessNextEvent () +{ + return !m_done_b; +} diff --git a/lldb/source/Plugins/Process/Linux/ThreadStateCoordinator.h b/lldb/source/Plugins/Process/Linux/ThreadStateCoordinator.h new file mode 100644 index 00000000000..a275ce651a3 --- /dev/null +++ b/lldb/source/Plugins/Process/Linux/ThreadStateCoordinator.h @@ -0,0 +1,85 @@ +//===-- ThreadStateCoordinator.h --------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef lldb_ThreadStateCoordinator_h +#define lldb_ThreadStateCoordinator_h + +#include <functional> +#include <unordered_set> + +#include "lldb/lldb-types.h" + +namespace lldb_private +{ + class ThreadStateCoordinator + { + public: + + // Typedefs. + typedef std::unordered_set<lldb::tid_t> ThreadIDSet; + + // Callback definitions. + typedef std::function<void (lldb::tid_t tid)> ThreadIDFunc; + typedef std::function<void (const char *format, va_list args)> LogFunc; + + // constructors + ThreadStateCoordinator (const LogFunc &log_func); + + // The main purpose of the class: triggering an action after + // a given set of threads stop. + void + CallAfterThreadsStop (const lldb::tid_t triggering_tid, + const ThreadIDSet &wait_for_stop_tids, + const ThreadIDFunc &request_thread_stop_func, + const ThreadIDFunc &call_after_func); + + // Notifications called when various state changes occur. + void + NotifyThreadStop (lldb::tid_t tid); + + void + NotifyThreadResume (lldb::tid_t tid); + + void + NotifyThreadCreate (lldb::tid_t tid); + + void + NotifyThreadDeath (lldb::tid_t tid); + + // Indicate when the coordinator should shut down. + void + StopCoordinator (); + + // Process the next event, returning false when the coordinator is all done. + // This call is synchronous and blocks when there are no events pending. + // Expected usage is to run this in a separate thread until the function + // returns false. + bool + ProcessNextEvent (); + + private: + + enum EventType + { + eInvalid, + eEventTypeCallAfterThreadsStop, + eEventTypeThreadStopped, + eEventTypeThreadResumed, + eEventTypeThreadCreated, + eEventTypeThreadDied, + }; + + bool m_done_b; + + LogFunc m_log_func; + + }; +} + +#endif diff --git a/lldb/test/c++/make/Makefile.rules b/lldb/test/c++/make/Makefile.rules deleted file mode 100644 index 00c8de2dbf8..00000000000 --- a/lldb/test/c++/make/Makefile.rules +++ /dev/null @@ -1,58 +0,0 @@ -# Retrieve this Makefile's location. -THIS_FILE_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))/ - -# Set default target to be test -.DEFAULT_GOAL := test - -# Set up GTEST for canonical Linux and MacOSX source trees. -ifeq ($(wildcard ../../../../llvm/utils/unittest/googletest),) - # Assume llvm/tools/lldb (Non-MacOSX) directory form. - LLVM_BASE_DIR := $(realpath ../../../../../..) -else - # Assume lldb/llvm (MacOSX Xcode) directory form. - LLVM_BASE_DIR := $(realpath ../../../../llvm) -endif - -ifeq ($(GTEST_DIR),) - GTEST_DIR := $(LLVM_BASE_DIR)/utils/unittest/googletest -endif -GTEST_INCLUDE_DIR := $(GTEST_DIR)/include - -ifeq ($(LLVM_BUILD_DIR),) - ifneq ($(wildcard $(THIS_FILE_DIR)../../../llvm-build/Release+Asserts/x86_64/Release+Asserts),) - LLVM_BUILD_DIR := $(realpath $(THIS_FILE_DIR)../../../llvm-build/Release+Asserts/x86_64/Release+Asserts) - else ifneq ($(wildcard $(THIS_FILE_DIR)../../../../../../build-debug/lib),) - LLVM_BUILD_DIR := $(realpath $(THIS_FILE_DIR)../../../../../../build-debug) - endif -endif - -ifeq ($(LLVM_BUILD_DIR),) - $(error Could not find LLVM build output dir, please set it with LLVM_BUILD_DIR) -endif -GTEST_STATIC_LIB_DIR := $(LLVM_BUILD_DIR)/lib - -ifeq ($(LLVM_BUILD_INCLUDE_DIR),) - ifneq ($(wildcard $(LLVM_BUILD_DIR)/../include),) - LLVM_BUILD_INCLUDE_DIR := $(realpath $(LLVM_BUILD_DIR)/../include) - else ifneq ($(wildcard $(LLVM_BUILD_DIR)/include),) - LLVM_BUILD_INCLUDE_DIR := $(realpath $(LLVM_BUILD_DIR)/include) - endif -endif - -ifeq ($(LLVM_BUILD_INCLUDE_DIR),) - $(error Could not find LLVM build directory include dir, please set it with LLVM_BUILD_INCLUDE_DIR) -endif - -$(info LLVM_BASE_DIR = $(LLVM_BASE_DIR)) -$(info LLVM_BUILD_DIR = $(LLVM_BUILD_DIR)) -$(info GTEST_DIR = $(GTEST_DIR)) -$(info GTEST_INCLUDE_DIR = $(GTEST_INCLUDE_DIR)) -$(info GTEST_STATIC_LIB_DIR = $(GTEST_STATIC_LIB_DIR)) - -CFLAGS_EXTRAS += -I $(GTEST_INCLUDE_DIR) -I $(LLVM_BASE_DIR)/include -I $(LLVM_BUILD_INCLUDE_DIR) -LD_EXTRAS += $(GTEST_STATIC_LIB_DIR)/libgtest.a $(GTEST_STATIC_LIB_DIR)/libgtest_main.a $(GTEST_STATIC_LIB_DIR)/libLLVMSupport.a - -include $(THIS_FILE_DIR)../../make/Makefile.rules - -test:: $(EXE) - $(realpath $(EXE)) diff --git a/lldb/test/c++/native_process/thread_state_coordinator/Makefile b/lldb/test/c++/native_process/thread_state_coordinator/Makefile deleted file mode 100644 index 34db314ceed..00000000000 --- a/lldb/test/c++/native_process/thread_state_coordinator/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -LEVEL = ../../make - -CFLAGS_EXTRAS := -D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS -ENABLE_THREADS := YES -CXX_SOURCES := $(wildcard *.cpp) -MAKE_DSYM :=NO - -OS := $(shell uname -s) -$(info OS $(OS)) -ifeq ($(OS),Linux) - LD_EXTRAS += -lncurses -ldl -endif - -include $(LEVEL)/Makefile.rules diff --git a/lldb/test/c++/native_process/thread_state_coordinator/ThreadStateCoordinatorTest.cpp b/lldb/test/c++/native_process/thread_state_coordinator/ThreadStateCoordinatorTest.cpp deleted file mode 100644 index 47809f64ff4..00000000000 --- a/lldb/test/c++/native_process/thread_state_coordinator/ThreadStateCoordinatorTest.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include <limits.h> -#include "gtest/gtest.h" - -TEST(ThreadStateCoordinatorTest, ExpectEqualsWorks) -{ - EXPECT_EQ(1, 1); -} |