Skip to content

Commit 4a491ec

Browse files
committed
[Reproducer] Move the command loader into the reproducer (NFC)
This just moves the CommandLoader utility into the reproducer namespace and makes it accessible outside the API layer. This is setting things up for a bigger change. llvm-svn: 371689
1 parent d9aec34 commit 4a491ec

File tree

3 files changed

+53
-48
lines changed

3 files changed

+53
-48
lines changed

lldb/include/lldb/Utility/Reproducer.h

+13
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,19 @@ class Reproducer {
327327
mutable std::mutex m_mutex;
328328
};
329329

330+
/// Helper class for replaying commands through the reproducer.
331+
class CommandLoader {
332+
public:
333+
CommandLoader(std::vector<std::string> files) : m_files(files) {}
334+
335+
static std::unique_ptr<CommandLoader> Create(Loader *loader);
336+
llvm::Optional<std::string> GetNextFile();
337+
338+
private:
339+
std::vector<std::string> m_files;
340+
unsigned m_index = 0;
341+
};
342+
330343
} // namespace repro
331344
} // namespace lldb_private
332345

lldb/source/API/SBDebugger.cpp

+6-48
Original file line numberDiff line numberDiff line change
@@ -57,51 +57,6 @@
5757
using namespace lldb;
5858
using namespace lldb_private;
5959

60-
/// Helper class for replaying commands through the reproducer.
61-
class CommandLoader {
62-
public:
63-
CommandLoader(std::vector<std::string> files) : m_files(files) {}
64-
65-
static std::unique_ptr<CommandLoader> Create() {
66-
repro::Loader *loader = repro::Reproducer::Instance().GetLoader();
67-
if (!loader)
68-
return {};
69-
70-
FileSpec file = loader->GetFile<repro::CommandProvider::Info>();
71-
if (!file)
72-
return {};
73-
74-
auto error_or_file = llvm::MemoryBuffer::getFile(file.GetPath());
75-
if (auto err = error_or_file.getError())
76-
return {};
77-
78-
std::vector<std::string> files;
79-
llvm::yaml::Input yin((*error_or_file)->getBuffer());
80-
yin >> files;
81-
82-
if (auto err = yin.error())
83-
return {};
84-
85-
for (auto &file : files) {
86-
FileSpec absolute_path =
87-
loader->GetRoot().CopyByAppendingPathComponent(file);
88-
file = absolute_path.GetPath();
89-
}
90-
91-
return std::make_unique<CommandLoader>(std::move(files));
92-
}
93-
94-
FILE *GetNextFile() {
95-
if (m_index >= m_files.size())
96-
return nullptr;
97-
return FileSystem::Instance().Fopen(m_files[m_index++].c_str(), "r");
98-
}
99-
100-
private:
101-
std::vector<std::string> m_files;
102-
unsigned m_index = 0;
103-
};
104-
10560
static llvm::sys::DynamicLibrary LoadPlugin(const lldb::DebuggerSP &debugger_sp,
10661
const FileSpec &spec,
10762
Status &error) {
@@ -344,9 +299,12 @@ void SBDebugger::SetInputFileHandle(FILE *fh, bool transfer_ownership) {
344299
if (repro::Generator *g = repro::Reproducer::Instance().GetGenerator())
345300
recorder = g->GetOrCreate<repro::CommandProvider>().GetNewDataRecorder();
346301

347-
static std::unique_ptr<CommandLoader> loader = CommandLoader::Create();
348-
if (loader)
349-
fh = loader->GetNextFile();
302+
static std::unique_ptr<repro::CommandLoader> loader =
303+
repro::CommandLoader::Create(repro::Reproducer::Instance().GetLoader());
304+
if (loader) {
305+
llvm::Optional<std::string> file = loader->GetNextFile();
306+
fh = file ? FileSystem::Instance().Fopen(file->c_str(), "r") : nullptr;
307+
}
350308

351309
m_opaque_sp->SetInputFileHandle(fh, transfer_ownership, recorder);
352310
}

lldb/source/Utility/Reproducer.cpp

+34
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,40 @@ llvm::raw_ostream *ProcessGDBRemoteProvider::GetHistoryStream() {
281281
return m_stream_up.get();
282282
}
283283

284+
std::unique_ptr<CommandLoader> CommandLoader::Create(Loader *loader) {
285+
if (!loader)
286+
return {};
287+
288+
FileSpec file = loader->GetFile<repro::CommandProvider::Info>();
289+
if (!file)
290+
return {};
291+
292+
auto error_or_file = llvm::MemoryBuffer::getFile(file.GetPath());
293+
if (auto err = error_or_file.getError())
294+
return {};
295+
296+
std::vector<std::string> files;
297+
llvm::yaml::Input yin((*error_or_file)->getBuffer());
298+
yin >> files;
299+
300+
if (auto err = yin.error())
301+
return {};
302+
303+
for (auto &file : files) {
304+
FileSpec absolute_path =
305+
loader->GetRoot().CopyByAppendingPathComponent(file);
306+
file = absolute_path.GetPath();
307+
}
308+
309+
return std::make_unique<CommandLoader>(std::move(files));
310+
}
311+
312+
llvm::Optional<std::string> CommandLoader::GetNextFile() {
313+
if (m_index >= m_files.size())
314+
return {};
315+
return m_files[m_index++];
316+
}
317+
284318
void ProviderBase::anchor() {}
285319
char CommandProvider::ID = 0;
286320
char FileProvider::ID = 0;

0 commit comments

Comments
 (0)