2012-08-23 01:17:09 +08:00
|
|
|
//===-- OptionValueFileSpec.cpp ---------------------------------*- C++ -*-===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "lldb/Interpreter/OptionValueFileSpec.h"
|
|
|
|
|
2013-01-29 07:47:25 +08:00
|
|
|
#include "lldb/DataFormatters/FormatManager.h"
|
2016-11-02 00:11:14 +08:00
|
|
|
#include "lldb/Host/FileSystem.h"
|
2012-08-23 01:17:09 +08:00
|
|
|
#include "lldb/Interpreter/CommandCompletions.h"
|
2016-08-12 07:51:28 +08:00
|
|
|
#include "lldb/Interpreter/CommandInterpreter.h"
|
2018-04-18 02:53:35 +08:00
|
|
|
#include "lldb/Utility/Args.h"
|
2018-08-07 19:07:21 +08:00
|
|
|
#include "lldb/Utility/State.h"
|
2012-08-23 01:17:09 +08:00
|
|
|
|
|
|
|
using namespace lldb;
|
|
|
|
using namespace lldb_private;
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
OptionValueFileSpec::OptionValueFileSpec(bool resolve)
|
|
|
|
: OptionValue(), m_current_value(), m_default_value(), m_data_sp(),
|
|
|
|
m_data_mod_time(),
|
|
|
|
m_completion_mask(CommandCompletions::eDiskFileCompletion),
|
|
|
|
m_resolve(resolve) {}
|
|
|
|
|
|
|
|
OptionValueFileSpec::OptionValueFileSpec(const FileSpec &value, bool resolve)
|
|
|
|
: OptionValue(), m_current_value(value), m_default_value(value),
|
|
|
|
m_data_sp(), m_data_mod_time(),
|
|
|
|
m_completion_mask(CommandCompletions::eDiskFileCompletion),
|
|
|
|
m_resolve(resolve) {}
|
|
|
|
|
|
|
|
OptionValueFileSpec::OptionValueFileSpec(const FileSpec ¤t_value,
|
|
|
|
const FileSpec &default_value,
|
|
|
|
bool resolve)
|
|
|
|
: OptionValue(), m_current_value(current_value),
|
|
|
|
m_default_value(default_value), m_data_sp(), m_data_mod_time(),
|
|
|
|
m_completion_mask(CommandCompletions::eDiskFileCompletion),
|
|
|
|
m_resolve(resolve) {}
|
|
|
|
|
|
|
|
void OptionValueFileSpec::DumpValue(const ExecutionContext *exe_ctx,
|
|
|
|
Stream &strm, uint32_t dump_mask) {
|
|
|
|
if (dump_mask & eDumpOptionType)
|
|
|
|
strm.Printf("(%s)", GetTypeAsCString());
|
|
|
|
if (dump_mask & eDumpOptionValue) {
|
2012-08-23 01:17:09 +08:00
|
|
|
if (dump_mask & eDumpOptionType)
|
2016-09-07 04:57:50 +08:00
|
|
|
strm.PutCString(" = ");
|
2012-08-23 01:17:09 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
if (m_current_value) {
|
|
|
|
strm << '"' << m_current_value.GetPath().c_str() << '"';
|
2012-08-23 01:17:09 +08:00
|
|
|
}
|
2016-09-07 04:57:50 +08:00
|
|
|
}
|
2012-08-23 01:17:09 +08:00
|
|
|
}
|
|
|
|
|
2017-05-12 12:51:55 +08:00
|
|
|
Status OptionValueFileSpec::SetValueFromString(llvm::StringRef value,
|
|
|
|
VarSetOperationType op) {
|
|
|
|
Status error;
|
2016-09-07 04:57:50 +08:00
|
|
|
switch (op) {
|
|
|
|
case eVarSetOperationClear:
|
|
|
|
Clear();
|
|
|
|
NotifyValueChanged();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case eVarSetOperationReplace:
|
|
|
|
case eVarSetOperationAssign:
|
|
|
|
if (value.size() > 0) {
|
|
|
|
// The setting value may have whitespace, double-quotes, or single-quotes
|
2018-05-01 00:49:04 +08:00
|
|
|
// around the file path to indicate that internal spaces are not word
|
|
|
|
// breaks. Strip off any ws & quotes from the start and end of the file
|
|
|
|
// path - we aren't doing any word // breaking here so the quoting is
|
|
|
|
// unnecessary. NB this will cause a problem if someone tries to specify
|
2016-09-07 04:57:50 +08:00
|
|
|
// a file path that legitimately begins or ends with a " or ' character,
|
|
|
|
// or whitespace.
|
|
|
|
value = value.trim("\"' \t");
|
|
|
|
m_value_was_set = true;
|
2018-11-02 05:05:36 +08:00
|
|
|
m_current_value.SetFile(value.str(), FileSpec::Style::native);
|
|
|
|
if (m_resolve)
|
|
|
|
FileSystem::Instance().Resolve(m_current_value);
|
2016-09-07 04:57:50 +08:00
|
|
|
m_data_sp.reset();
|
2016-11-09 22:33:22 +08:00
|
|
|
m_data_mod_time = llvm::sys::TimePoint<>();
|
2016-09-07 04:57:50 +08:00
|
|
|
NotifyValueChanged();
|
|
|
|
} else {
|
|
|
|
error.SetErrorString("invalid value string");
|
2012-08-23 01:17:09 +08:00
|
|
|
}
|
2016-09-07 04:57:50 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case eVarSetOperationInsertBefore:
|
|
|
|
case eVarSetOperationInsertAfter:
|
|
|
|
case eVarSetOperationRemove:
|
|
|
|
case eVarSetOperationAppend:
|
|
|
|
case eVarSetOperationInvalid:
|
|
|
|
error = OptionValue::SetValueFromString(value, op);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return error;
|
2012-08-23 01:17:09 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
lldb::OptionValueSP OptionValueFileSpec::DeepCopy() const {
|
|
|
|
return OptionValueSP(new OptionValueFileSpec(*this));
|
2012-08-23 01:17:09 +08:00
|
|
|
}
|
|
|
|
|
2018-07-14 02:28:14 +08:00
|
|
|
size_t OptionValueFileSpec::AutoComplete(CommandInterpreter &interpreter,
|
|
|
|
CompletionRequest &request) {
|
|
|
|
request.SetWordComplete(false);
|
2016-09-07 04:57:50 +08:00
|
|
|
CommandCompletions::InvokeCommonCompletionCallbacks(
|
2018-07-14 02:28:14 +08:00
|
|
|
interpreter, m_completion_mask, request, nullptr);
|
2018-07-28 02:42:46 +08:00
|
|
|
return request.GetNumberOfMatches();
|
2012-08-23 01:17:09 +08:00
|
|
|
}
|
|
|
|
|
Make sure DataBufferLLVM contents are writable
Summary:
We sometimes need to write to the object file we've mapped into memory,
generally to apply relocations to debug info sections. We've had that
ability before, but with the introduction of DataBufferLLVM, we have
lost it, as the underlying llvm class (MemoryBuffer) only supports
read-only mappings.
This switches DataBufferLLVM to use the new llvm::WritableMemoryBuffer
class as a back-end, as this one guarantees to return a writable buffer.
This removes the need for the "Private" flag to the DataBufferLLVM
creation functions, as it was really used to mean "writable". The LLVM
function also does not have the NullTerminate flag, so I've modified our
clients to not require this feature and removed that flag as well.
Reviewers: zturner, clayborg, jingham
Subscribers: emaste, aprantl, arichardson, krytarowski, lldb-commits
Differential Revision: https://reviews.llvm.org/D40079
llvm-svn: 321255
2017-12-21 18:54:30 +08:00
|
|
|
const lldb::DataBufferSP &OptionValueFileSpec::GetFileContents() {
|
2016-09-07 04:57:50 +08:00
|
|
|
if (m_current_value) {
|
2018-11-01 05:49:27 +08:00
|
|
|
const auto file_mod_time = FileSystem::Instance().GetModificationTime(m_current_value);
|
2016-09-07 04:57:50 +08:00
|
|
|
if (m_data_sp && m_data_mod_time == file_mod_time)
|
|
|
|
return m_data_sp;
|
2018-11-13 05:24:50 +08:00
|
|
|
m_data_sp =
|
|
|
|
FileSystem::Instance().CreateDataBuffer(m_current_value.GetPath());
|
2016-09-07 04:57:50 +08:00
|
|
|
m_data_mod_time = file_mod_time;
|
|
|
|
}
|
|
|
|
return m_data_sp;
|
2012-08-23 02:39:03 +08:00
|
|
|
}
|