Skip to content

Commit 2f377c5

Browse files
committed
[lldb][NFCI] Remove use of ConstString from UnixSignals
The majority of UnixSignals strings are static in the sense that they do not change. The overwhelming majority of these strings are string literals. Using ConstString to manage their lifetime does not make sense. The only exception to this is one of the subclasses of UnixSignals, for which I have created a StringSet local to that file which will guarantee the lifetimes of these StringRefs. As for the other benefits of ConstString, string uniqueness is not a concern (as many of them are already string literals) and comparing signal names and aliases should not be a hot path. Differential Revision: https://reviews.llvm.org/D159011
1 parent 8c2da6b commit 2f377c5

File tree

3 files changed

+48
-33
lines changed

3 files changed

+48
-33
lines changed

lldb/include/lldb/Target/UnixSignals.h

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
#include <string>
1515
#include <vector>
1616

17-
#include "lldb/Utility/ConstString.h"
1817
#include "lldb/lldb-private.h"
1918
#include "llvm/Support/JSON.h"
2019

@@ -101,9 +100,10 @@ class UnixSignals {
101100
// your subclass of UnixSignals or in your Process Plugin's GetUnixSignals
102101
// method before you return the UnixSignal object.
103102

104-
void AddSignal(int signo, const char *name, bool default_suppress,
103+
void AddSignal(int signo, llvm::StringRef name, bool default_suppress,
105104
bool default_stop, bool default_notify,
106-
const char *description, const char *alias = nullptr);
105+
llvm::StringRef description,
106+
llvm::StringRef alias = llvm::StringRef());
107107

108108
enum SignalCodePrintOption { None, Address, Bounds };
109109

@@ -147,17 +147,20 @@ class UnixSignals {
147147
const SignalCodePrintOption m_print_option;
148148
};
149149

150+
// The StringRefs in Signal are either backed by string literals or reside in
151+
// persistent storage (e.g. a StringSet).
150152
struct Signal {
151-
ConstString m_name;
152-
ConstString m_alias;
153-
std::string m_description;
153+
llvm::StringRef m_name;
154+
llvm::StringRef m_alias;
155+
llvm::StringRef m_description;
154156
std::map<int32_t, SignalCode> m_codes;
155157
uint32_t m_hit_count = 0;
156158
bool m_suppress : 1, m_stop : 1, m_notify : 1;
157159
bool m_default_suppress : 1, m_default_stop : 1, m_default_notify : 1;
158160

159-
Signal(const char *name, bool default_suppress, bool default_stop,
160-
bool default_notify, const char *description, const char *alias);
161+
Signal(llvm::StringRef name, bool default_suppress, bool default_stop,
162+
bool default_notify, llvm::StringRef description,
163+
llvm::StringRef alias);
161164

162165
~Signal() = default;
163166
void Reset(bool reset_stop, bool reset_notify, bool reset_suppress);

lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@
2828
#include "lldb/Utility/Status.h"
2929
#include "lldb/Utility/StreamString.h"
3030
#include "lldb/Utility/UriParser.h"
31+
#include "llvm/ADT/StringSet.h"
3132
#include "llvm/Support/FormatAdapters.h"
3233

3334
#include "Plugins/Process/Utility/GDBRemoteSignals.h"
3435
#include "Plugins/Process/gdb-remote/ProcessGDBRemote.h"
36+
#include <mutex>
3537
#include <optional>
3638

3739
using namespace lldb;
@@ -41,6 +43,11 @@ using namespace lldb_private::platform_gdb_server;
4143
LLDB_PLUGIN_DEFINE_ADV(PlatformRemoteGDBServer, PlatformGDB)
4244

4345
static bool g_initialized = false;
46+
// UnixSignals does not store the signal names or descriptions itself.
47+
// It holds onto StringRefs. Becaue we may get signal information dynamically
48+
// from the remote, these strings need persistent storage client-side.
49+
static std::mutex g_signal_string_mutex;
50+
static llvm::StringSet<> g_signal_string_storage;
4451

4552
void PlatformRemoteGDBServer::Initialize() {
4653
Platform::Initialize();
@@ -749,8 +756,18 @@ const UnixSignalsSP &PlatformRemoteGDBServer::GetRemoteUnixSignals() {
749756
if (object_sp && object_sp->IsValid())
750757
description = std::string(object_sp->GetStringValue());
751758

752-
remote_signals_sp->AddSignal(signo, name.str().c_str(), suppress, stop,
753-
notify, description.c_str());
759+
llvm::StringRef name_backed, description_backed;
760+
{
761+
std::lock_guard<std::mutex> guard(g_signal_string_mutex);
762+
name_backed =
763+
g_signal_string_storage.insert(name).first->getKeyData();
764+
if (!description.empty())
765+
description_backed =
766+
g_signal_string_storage.insert(description).first->getKeyData();
767+
}
768+
769+
remote_signals_sp->AddSignal(signo, name_backed, suppress, stop, notify,
770+
description_backed);
754771
return true;
755772
});
756773

lldb/source/Target/UnixSignals.cpp

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,13 @@
1818
using namespace lldb_private;
1919
using namespace llvm;
2020

21-
UnixSignals::Signal::Signal(const char *name, bool default_suppress,
21+
UnixSignals::Signal::Signal(llvm::StringRef name, bool default_suppress,
2222
bool default_stop, bool default_notify,
23-
const char *description, const char *alias)
24-
: m_name(name), m_alias(alias), m_description(),
23+
llvm::StringRef description, llvm::StringRef alias)
24+
: m_name(name), m_alias(alias), m_description(description),
2525
m_suppress(default_suppress), m_stop(default_stop),
26-
m_notify(default_notify),
27-
m_default_suppress(default_suppress), m_default_stop(default_stop),
28-
m_default_notify(default_notify) {
29-
if (description)
30-
m_description.assign(description);
31-
}
26+
m_notify(default_notify), m_default_suppress(default_suppress),
27+
m_default_stop(default_stop), m_default_notify(default_notify) {}
3228

3329
lldb::UnixSignalsSP UnixSignals::Create(const ArchSpec &arch) {
3430
const auto &triple = arch.GetTriple();
@@ -104,9 +100,10 @@ void UnixSignals::Reset() {
104100
// clang-format on
105101
}
106102

107-
void UnixSignals::AddSignal(int signo, const char *name, bool default_suppress,
108-
bool default_stop, bool default_notify,
109-
const char *description, const char *alias) {
103+
void UnixSignals::AddSignal(int signo, llvm::StringRef name,
104+
bool default_suppress, bool default_stop,
105+
bool default_notify, llvm::StringRef description,
106+
llvm::StringRef alias) {
110107
Signal new_signal(name, default_suppress, default_stop, default_notify,
111108
description, alias);
112109
m_signals.insert(std::make_pair(signo, new_signal));
@@ -135,7 +132,7 @@ llvm::StringRef UnixSignals::GetSignalAsStringRef(int32_t signo) const {
135132
const auto pos = m_signals.find(signo);
136133
if (pos == m_signals.end())
137134
return {};
138-
return pos->second.m_name.GetStringRef();
135+
return pos->second.m_name;
139136
}
140137

141138
std::string
@@ -147,7 +144,7 @@ UnixSignals::GetSignalDescription(int32_t signo, std::optional<int32_t> code,
147144

148145
collection::const_iterator pos = m_signals.find(signo);
149146
if (pos != m_signals.end()) {
150-
str = pos->second.m_name.GetCString();
147+
str = pos->second.m_name.str();
151148

152149
if (code) {
153150
std::map<int32_t, SignalCode>::const_iterator cpos =
@@ -199,14 +196,13 @@ llvm::StringRef UnixSignals::GetShortName(llvm::StringRef name) const {
199196
}
200197

201198
int32_t UnixSignals::GetSignalNumberFromName(const char *name) const {
202-
ConstString const_name(name);
199+
llvm::StringRef name_ref(name);
203200

204201
collection::const_iterator pos, end = m_signals.end();
205202
for (pos = m_signals.begin(); pos != end; pos++) {
206-
if ((const_name == pos->second.m_name) ||
207-
(const_name == pos->second.m_alias) ||
208-
(const_name == GetShortName(pos->second.m_name)) ||
209-
(const_name == GetShortName(pos->second.m_alias)))
203+
if ((name_ref == pos->second.m_name) || (name_ref == pos->second.m_alias) ||
204+
(name_ref == GetShortName(pos->second.m_name)) ||
205+
(name_ref == GetShortName(pos->second.m_alias)))
210206
return pos->first;
211207
}
212208

@@ -373,11 +369,10 @@ void UnixSignals::IncrementSignalHitCount(int signo) {
373369

374370
json::Value UnixSignals::GetHitCountStatistics() const {
375371
json::Array json_signals;
376-
for (const auto &pair: m_signals) {
372+
for (const auto &pair : m_signals) {
377373
if (pair.second.m_hit_count > 0)
378-
json_signals.emplace_back(json::Object{
379-
{ pair.second.m_name.GetCString(), pair.second.m_hit_count }
380-
});
374+
json_signals.emplace_back(
375+
json::Object{{pair.second.m_name, pair.second.m_hit_count}});
381376
}
382377
return std::move(json_signals);
383378
}

0 commit comments

Comments
 (0)