Skip to content

Commit

Permalink
Refactor Unix signals.
Browse files Browse the repository at this point in the history
Summary:
- Consolidate Unix signals selection in UnixSignals.
- Make Unix signals available from platform.
- Add jSignalsInfo packet to retrieve Unix signals from remote platform.
- Get a copy of the platform signal for each remote process.
- Update SB API for signals.
- Update signal utility in test suite.

Reviewers: ovyalov, clayborg

Subscribers: chaoren, jingham, labath, emaste, tberghammer, lldb-commits

Differential Revision: http://reviews.llvm.org/D11094

llvm-svn: 242101
  • Loading branch information
chaoren committed Jul 14, 2015
1 parent 2b05416 commit 98d0a4b
Show file tree
Hide file tree
Showing 47 changed files with 505 additions and 302 deletions.
3 changes: 3 additions & 0 deletions lldb/include/lldb/API/SBPlatform.h
Expand Up @@ -189,6 +189,9 @@ namespace lldb {
SBError
SetFilePermissions (const char *path, uint32_t file_permissions);

SBUnixSignals
GetUnixSignals() const;

protected:

friend class SBDebugger;
Expand Down
11 changes: 7 additions & 4 deletions lldb/include/lldb/API/SBUnixSignals.h
Expand Up @@ -65,17 +65,20 @@ class LLDB_API SBUnixSignals {

protected:
friend class SBProcess;
friend class SBPlatform;

SBUnixSignals (lldb::ProcessSP &process_sp);
SBUnixSignals(lldb::ProcessSP &process_sp);

lldb::ProcessSP
SBUnixSignals(lldb::PlatformSP &platform_sp);

lldb::UnixSignalsSP
GetSP() const;

void
SetSP (const lldb::ProcessSP &process_sp);
SetSP(const lldb::UnixSignalsSP &signals_sp);

private:
lldb::ProcessWP m_opaque_wp;
lldb::UnixSignalsWP m_opaque_wp;
};


Expand Down
5 changes: 3 additions & 2 deletions lldb/include/lldb/Core/StructuredData.h
Expand Up @@ -238,14 +238,15 @@ class StructuredData
{
}

void
bool
ForEach (std::function <bool(Object* object)> const &foreach_callback) const
{
for (const auto &object_sp : m_items)
{
if (foreach_callback(object_sp.get()) == false)
break;
return false;
}
return true;
}


Expand Down
4 changes: 2 additions & 2 deletions lldb/include/lldb/Host/Host.h
Expand Up @@ -244,8 +244,8 @@ class Host
#endif // !defined(__ANDROID__) && !defined(__ANDROID_NDK__)
#endif // defined (__APPLE__) || defined (__linux__) || defined (__FreeBSD__) || defined (__GLIBC__) || defined(__NetBSD__)

static const lldb_private::UnixSignalsSP&
GetUnixSignals ();
static const lldb::UnixSignalsSP &
GetUnixSignals();

static Error
LaunchProcess (ProcessLaunchInfo &launch_info);
Expand Down
6 changes: 6 additions & 0 deletions lldb/include/lldb/Target/Platform.h
Expand Up @@ -863,6 +863,12 @@ class ModuleCache;
return 1;
}

virtual const lldb::UnixSignalsSP &
GetRemoteUnixSignals();

const lldb::UnixSignalsSP &
GetUnixSignals();

//------------------------------------------------------------------
/// Locate a queue name given a thread's qaddr
///
Expand Down
10 changes: 5 additions & 5 deletions lldb/include/lldb/Target/Process.h
Expand Up @@ -950,7 +950,7 @@ class Process :
/// Construct with a shared pointer to a target, the Process listener,
/// and the appropriate UnixSignalsSP for the process.
//------------------------------------------------------------------
Process(Target &target, Listener &listener, const UnixSignalsSP &unix_signals_sp);
Process(Target &target, Listener &listener, const lldb::UnixSignalsSP &unix_signals_sp);

//------------------------------------------------------------------
/// Destructor.
Expand Down Expand Up @@ -1402,10 +1402,10 @@ class Process :
Signal (int signal);

void
SetUnixSignals (const UnixSignalsSP &signals_sp);
SetUnixSignals(const lldb::UnixSignalsSP &signals_sp);

UnixSignals &
GetUnixSignals ();
const lldb::UnixSignalsSP &
GetUnixSignals();

//==================================================================
// Plug-in Process Control Overrides
Expand Down Expand Up @@ -3237,7 +3237,7 @@ class Process :
lldb::DynamicCheckerFunctionsUP m_dynamic_checkers_ap; ///< The functions used by the expression parser to validate data that expressions use.
lldb::OperatingSystemUP m_os_ap;
lldb::SystemRuntimeUP m_system_runtime_ap;
UnixSignalsSP m_unix_signals_sp; /// This is the current signal set for this process.
lldb::UnixSignalsSP m_unix_signals_sp; /// This is the current signal set for this process.
lldb::ABISP m_abi_sp;
lldb::IOHandlerSP m_process_input_reader;
Communication m_stdio_communication;
Expand Down
17 changes: 15 additions & 2 deletions lldb/include/lldb/Target/UnixSignals.h
Expand Up @@ -26,6 +26,9 @@ namespace lldb_private
class UnixSignals
{
public:
static lldb::UnixSignalsSP
Create(const ArchSpec &arch);

//------------------------------------------------------------------
// Constructors and Destructors
//------------------------------------------------------------------
Expand Down Expand Up @@ -89,6 +92,12 @@ class UnixSignals
int32_t
GetNextSignalNumber (int32_t current_signal) const;

int32_t
GetNumSignals() const;

int32_t
GetSignalAtIndex(int32_t index) const;

// We assume that the elements of this object are constant once it is constructed,
// since a process should never need to add or remove symbols as it runs. So don't
// call these functions anywhere but the constructor of your subclass of UnixSignals or in
Expand Down Expand Up @@ -130,14 +139,18 @@ class UnixSignals
~Signal () {}
};

void
virtual void
Reset ();

typedef std::map <int32_t, Signal> collection;

collection m_signals;

DISALLOW_COPY_AND_ASSIGN (UnixSignals);
// GDBRemote signals need to be copyable.
UnixSignals(const UnixSignals &rhs);

const UnixSignals &
operator=(const UnixSignals &rhs) = delete;
};

} // Namespace lldb
Expand Down
2 changes: 2 additions & 0 deletions lldb/include/lldb/lldb-forward.h
Expand Up @@ -423,6 +423,8 @@ namespace lldb {
#ifndef LLDB_DISABLE_PYTHON
typedef std::shared_ptr<lldb_private::ScriptedSyntheticChildren> ScriptedSyntheticChildrenSP;
#endif
typedef std::shared_ptr<lldb_private::UnixSignals> UnixSignalsSP;
typedef std::weak_ptr<lldb_private::UnixSignals> UnixSignalsWP;
typedef std::shared_ptr<lldb_private::UnwindAssembly> UnwindAssemblySP;
typedef std::shared_ptr<lldb_private::UnwindPlan> UnwindPlanSP;
typedef lldb_private::SharingPtr<lldb_private::ValueObject> ValueObjectSP;
Expand Down
1 change: 0 additions & 1 deletion lldb/include/lldb/lldb-private-forward.h
Expand Up @@ -34,7 +34,6 @@ namespace lldb_private
typedef std::weak_ptr<lldb_private::NativeProcessProtocol> NativeProcessProtocolWP;
typedef std::shared_ptr<lldb_private::NativeRegisterContext> NativeRegisterContextSP;
typedef std::shared_ptr<lldb_private::NativeThreadProtocol> NativeThreadProtocolSP;
typedef std::shared_ptr<lldb_private::UnixSignals> UnixSignalsSP;
}

#endif // #if defined(__cplusplus)
Expand Down
6 changes: 6 additions & 0 deletions lldb/lldb.xcodeproj/project.pbxproj
Expand Up @@ -860,6 +860,7 @@
E7723D481AC4A8C8002BA082 /* RegisterContextFreeBSD_arm64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7723D461AC4A8C8002BA082 /* RegisterContextFreeBSD_arm64.cpp */; };
E7723D4C1AC4A944002BA082 /* RegisterContextPOSIX_arm64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E7723D4A1AC4A944002BA082 /* RegisterContextPOSIX_arm64.cpp */; };
E778E9A21B062D1700247609 /* EmulateInstructionMIPS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E778E99F1B062D1700247609 /* EmulateInstructionMIPS.cpp */; };
E7E94ABC1B54961F00D0AE30 /* GDBRemoteSignals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E73A15A41B548EC500786197 /* GDBRemoteSignals.cpp */; };
ED88244E15114A9200BC98B9 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EDB919B414F6F10D008FF64B /* Security.framework */; };
ED88245015114CA200BC98B9 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = ED88244F15114CA200BC98B9 /* main.mm */; };
ED88245115114CA200BC98B9 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = ED88244F15114CA200BC98B9 /* main.mm */; };
Expand Down Expand Up @@ -2677,6 +2678,8 @@
B2D3033612EFA5C500F84EB3 /* InstructionUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = InstructionUtils.h; path = Utility/InstructionUtils.h; sourceTree = "<group>"; };
B5EFAE841AE53B1D007059F3 /* RegisterContextFreeBSD_arm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RegisterContextFreeBSD_arm.cpp; path = Utility/RegisterContextFreeBSD_arm.cpp; sourceTree = "<group>"; };
B5EFAE851AE53B1D007059F3 /* RegisterContextFreeBSD_arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegisterContextFreeBSD_arm.h; path = Utility/RegisterContextFreeBSD_arm.h; sourceTree = "<group>"; };
E73A15A41B548EC500786197 /* GDBRemoteSignals.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GDBRemoteSignals.cpp; path = Utility/GDBRemoteSignals.cpp; sourceTree = "<group>"; };
E73A15A51B548EC500786197 /* GDBRemoteSignals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GDBRemoteSignals.h; path = Utility/GDBRemoteSignals.h; sourceTree = "<group>"; };
E769331D1A94D18100C73337 /* lldb-server.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "lldb-server.cpp"; path = "tools/lldb-server/lldb-server.cpp"; sourceTree = "<group>"; };
E7723D421AC4A7FB002BA082 /* RegisterContextPOSIXCore_arm64.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterContextPOSIXCore_arm64.cpp; sourceTree = "<group>"; };
E7723D431AC4A7FB002BA082 /* RegisterContextPOSIXCore_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterContextPOSIXCore_arm64.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -3811,6 +3814,8 @@
26B4666E11A2080F00CF6220 /* Utility */ = {
isa = PBXGroup;
children = (
E73A15A41B548EC500786197 /* GDBRemoteSignals.cpp */,
E73A15A51B548EC500786197 /* GDBRemoteSignals.h */,
B5EFAE841AE53B1D007059F3 /* RegisterContextFreeBSD_arm.cpp */,
B5EFAE851AE53B1D007059F3 /* RegisterContextFreeBSD_arm.h */,
256CBDBE1ADD11C000BC6CDC /* RegisterContextPOSIX_arm.cpp */,
Expand Down Expand Up @@ -6448,6 +6453,7 @@
94BA8B6D176F8C9B005A91B5 /* Range.cpp in Sources */,
26DAED6315D327C200E15819 /* OptionValuePathMappings.cpp in Sources */,
B2B7CCEB15D1BD6700EEFB57 /* CommandObjectWatchpointCommand.cpp in Sources */,
E7E94ABC1B54961F00D0AE30 /* GDBRemoteSignals.cpp in Sources */,
AF25AB26188F685C0030DEC3 /* AppleGetQueuesHandler.cpp in Sources */,
B2B7CCF015D1C20F00EEFB57 /* WatchpointOptions.cpp in Sources */,
2640E19F15DC78FD00F23B50 /* Property.cpp in Sources */,
Expand Down
3 changes: 3 additions & 0 deletions lldb/scripts/interface/SBPlatform.i
Expand Up @@ -188,6 +188,9 @@ public:
lldb::SBError
SetFilePermissions (const char *path, uint32_t file_permissions);

lldb::SBUnixSignals
GetUnixSignals();

};

} // namespace lldb
9 changes: 9 additions & 0 deletions lldb/source/API/SBPlatform.cpp
Expand Up @@ -11,6 +11,7 @@
#include "lldb/API/SBError.h"
#include "lldb/API/SBFileSpec.h"
#include "lldb/API/SBLaunchInfo.h"
#include "lldb/API/SBUnixSignals.h"
#include "lldb/Core/ArchSpec.h"
#include "lldb/Core/Error.h"
#include "lldb/Host/File.h"
Expand Down Expand Up @@ -638,3 +639,11 @@ SBPlatform::SetFilePermissions (const char *path, uint32_t file_permissions)

}

SBUnixSignals
SBPlatform::GetUnixSignals() const
{
if (auto platform_sp = GetSP())
return SBUnixSignals{platform_sp};

return {};
}
10 changes: 3 additions & 7 deletions lldb/source/API/SBProcess.cpp
Expand Up @@ -912,14 +912,10 @@ SBProcess::Signal (int signo)
SBUnixSignals
SBProcess::GetUnixSignals()
{
SBUnixSignals sb_unix_signals;
ProcessSP process_sp(GetSP());
if (process_sp)
{
sb_unix_signals.SetSP(process_sp);
}
if (auto process_sp = GetSP())
return SBUnixSignals{process_sp};

return sb_unix_signals;
return {};
}

void
Expand Down
2 changes: 1 addition & 1 deletion lldb/source/API/SBThread.cpp
Expand Up @@ -392,7 +392,7 @@ SBThread::GetStopDescription (char *dst, size_t dst_len)

case eStopReasonSignal:
{
stop_desc = exe_ctx.GetProcessPtr()->GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue());
stop_desc = exe_ctx.GetProcessPtr()->GetUnixSignals()->GetSignalAsCString(stop_info_sp->GetValue());
if (stop_desc == NULL || stop_desc[0] == '\0')
{
static char signal_desc[] = "signal";
Expand Down

0 comments on commit 98d0a4b

Please sign in to comment.