Author: Adrian Prantl Date: 2024-09-05T12:44:13-07:00 New Revision: b798f4bd50bbf0f5eb46804afad10629797c73aa
URL: https://github.com/llvm/llvm-project/commit/b798f4bd50bbf0f5eb46804afad10629797c73aa DIFF: https://github.com/llvm/llvm-project/commit/b798f4bd50bbf0f5eb46804afad10629797c73aa.diff LOG: [lldb] Make deep copies of Status explicit (NFC) (#107170) Added: Modified: lldb/bindings/python/python-swigsafecast.swig lldb/include/lldb/API/SBError.h lldb/include/lldb/API/SBValueList.h lldb/include/lldb/Core/ValueObjectConstResult.h lldb/include/lldb/Utility/Status.h lldb/source/API/SBBreakpoint.cpp lldb/source/API/SBBreakpointLocation.cpp lldb/source/API/SBBreakpointName.cpp lldb/source/API/SBDebugger.cpp lldb/source/API/SBError.cpp lldb/source/API/SBFile.cpp lldb/source/API/SBFormat.cpp lldb/source/API/SBFrame.cpp lldb/source/API/SBPlatform.cpp lldb/source/API/SBProcess.cpp lldb/source/API/SBSaveCoreOptions.cpp lldb/source/API/SBStructuredData.cpp lldb/source/API/SBTarget.cpp lldb/source/API/SBThread.cpp lldb/source/API/SBValue.cpp lldb/source/API/SBValueList.cpp lldb/source/API/SBWatchpoint.cpp lldb/source/Commands/CommandObjectCommands.cpp lldb/source/Core/Debugger.cpp lldb/source/Core/ModuleList.cpp lldb/source/Core/ValueObject.cpp lldb/source/Core/ValueObjectCast.cpp lldb/source/Core/ValueObjectConstResult.cpp lldb/source/Core/ValueObjectDynamicValue.cpp lldb/source/Core/ValueObjectSyntheticFilter.cpp lldb/source/Expression/Materializer.cpp lldb/source/Expression/UserExpression.cpp lldb/source/Host/common/LockFileBase.cpp lldb/source/Host/common/NativeProcessProtocol.cpp lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp lldb/source/Interpreter/CommandInterpreter.cpp lldb/source/Interpreter/ScriptInterpreter.cpp lldb/source/Plugins/Platform/Android/AdbClient.cpp lldb/source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.cpp lldb/source/Plugins/Platform/MacOSX/objcxx/PlatformiOSSimulatorCoreSimulatorSupport.h lldb/source/Plugins/Platform/MacOSX/objcxx/PlatformiOSSimulatorCoreSimulatorSupport.mm lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.cpp lldb/source/Plugins/Platform/Windows/PlatformWindows.cpp lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.cpp lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp lldb/source/Target/ModuleCache.cpp lldb/source/Target/Platform.cpp lldb/source/Target/Process.cpp lldb/source/Target/StackFrame.cpp lldb/source/Target/Target.cpp lldb/source/Utility/Status.cpp lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp lldb/unittests/Target/RemoteAwarePlatformTest.cpp Removed: ################################################################################ diff --git a/lldb/bindings/python/python-swigsafecast.swig b/lldb/bindings/python/python-swigsafecast.swig index 34f8c6f0ff8d35..0127ac6bfa4681 100644 --- a/lldb/bindings/python/python-swigsafecast.swig +++ b/lldb/bindings/python/python-swigsafecast.swig @@ -33,8 +33,8 @@ PythonObject SWIGBridge::ToSWIGWrapper(lldb::BreakpointSP breakpoint_sp) { SWIGTYPE_p_lldb__SBBreakpoint); } -PythonObject SWIGBridge::ToSWIGWrapper(const Status& status) { - return ToSWIGHelper(new lldb::SBError(status), SWIGTYPE_p_lldb__SBError); +PythonObject SWIGBridge::ToSWIGWrapper(Status status) { + return ToSWIGHelper(new lldb::SBError(std::move(status)), SWIGTYPE_p_lldb__SBError); } PythonObject SWIGBridge::ToSWIGWrapper(std::unique_ptr<lldb::SBStructuredData> data_sb) { diff --git a/lldb/include/lldb/API/SBError.h b/lldb/include/lldb/API/SBError.h index 17f2c6c3027af7..9f55f92131c06e 100644 --- a/lldb/include/lldb/API/SBError.h +++ b/lldb/include/lldb/API/SBError.h @@ -97,7 +97,7 @@ class LLDB_API SBError { friend class lldb_private::ScriptInterpreter; friend class lldb_private::python::SWIGBridge; - SBError(const lldb_private::Status &error); + SBError(lldb_private::Status &&error); lldb_private::Status *get(); @@ -107,7 +107,7 @@ class LLDB_API SBError { lldb_private::Status &ref(); - void SetError(const lldb_private::Status &lldb_error); + void SetError(lldb_private::Status &&lldb_error); private: std::unique_ptr<lldb_private::Status> m_opaque_up; diff --git a/lldb/include/lldb/API/SBValueList.h b/lldb/include/lldb/API/SBValueList.h index a5017bccc50533..52a86f989e153a 100644 --- a/lldb/include/lldb/API/SBValueList.h +++ b/lldb/include/lldb/API/SBValueList.h @@ -96,7 +96,7 @@ class LLDB_API SBValueList { std::unique_ptr<ValueListImpl> m_opaque_up; - void SetError(const lldb_private::Status &status); + void SetError(lldb_private::Status &&status); }; } // namespace lldb diff --git a/lldb/include/lldb/Core/ValueObjectConstResult.h b/lldb/include/lldb/Core/ValueObjectConstResult.h index d3b3362bd0e9ec..9c34617af71d0d 100644 --- a/lldb/include/lldb/Core/ValueObjectConstResult.h +++ b/lldb/include/lldb/Core/ValueObjectConstResult.h @@ -61,7 +61,7 @@ class ValueObjectConstResult : public ValueObject { // When an expression fails to evaluate, we return an error static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, - const Status &error); + Status &&error); std::optional<uint64_t> GetByteSize() override; @@ -146,7 +146,7 @@ class ValueObjectConstResult : public ValueObject { ConstString name, Module *module = nullptr); ValueObjectConstResult(ExecutionContextScope *exe_scope, - ValueObjectManager &manager, const Status &error); + ValueObjectManager &manager, Status &&error); ValueObject *CreateChildAtIndex(size_t idx) override { return m_impl.CreateChildAtIndex(idx); diff --git a/lldb/include/lldb/Utility/Status.h b/lldb/include/lldb/Utility/Status.h index 308532e7c633dc..795c830b965173 100644 --- a/lldb/include/lldb/Utility/Status.h +++ b/lldb/include/lldb/Utility/Status.h @@ -43,13 +43,32 @@ const char *ExpressionResultAsCString(lldb::ExpressionResults result); /// of themselves for printing results and error codes. The string value will /// be fetched on demand and its string value will be cached until the error /// is cleared of the value of the error changes. +/// +/// API design notes: +/// +/// Most APIs that currently vend a Status would be better served by +/// returning llvm::Expected<> instead. If possibles APIs should be +/// refactored to avoid Status. The only legitimate long-term uses of +/// Status are objects that need to store an error for a long time +/// (which should be questioned as a design decision, too). +/// +/// Implementation notes: +/// +/// Internally, Status stores an llvm::Error. +/// eErrorTypeInvalid +/// eErrorTypeGeneric llvm::StringError +/// eErrorTypePOSIX llvm::ECError +/// eErrorTypeMachKernel MachKernelError +/// eErrorTypeExpression llvm::ErrorList<ExpressionError> +/// eErrorTypeWin32 Win32Error + class Status { public: - /// Every error value that this object can contain needs to be able to fit /// into ValueType. typedef uint32_t ValueType; Status(); + Status(Status &&other) = default; /// Initialize the error object with a generic success value. /// @@ -93,10 +112,14 @@ class Status { ~Status(); + const Status &operator=(Status &&); /// Avoid using this in new code. Migrate APIs to llvm::Expected instead. static Status FromError(llvm::Error error); - /// FIXME: Replace this with a takeError method. + /// FIXME: Replace this with a takeError() method. llvm::Error ToError() const; + /// Don't call this function in new code. Instead, redesign the API + /// to use llvm::Expected instead of Status. + Status Clone() const { return Status(ToError()); } /// Get the error string associated with the current error. // diff --git a/lldb/source/API/SBBreakpoint.cpp b/lldb/source/API/SBBreakpoint.cpp index 3e9c01080588e5..b2ed034d19983c 100644 --- a/lldb/source/API/SBBreakpoint.cpp +++ b/lldb/source/API/SBBreakpoint.cpp @@ -622,7 +622,7 @@ SBError SBBreakpoint::SetScriptCallbackFunction( callback_function_name, extra_args.m_impl_up ->GetObjectSP()); - sb_error.SetError(error); + sb_error.SetError(std::move(error)); } else sb_error = Status::FromErrorString("invalid breakpoint"); @@ -645,7 +645,7 @@ SBError SBBreakpoint::SetScriptCallbackBody(const char *callback_body_text) { .GetScriptInterpreter() ->SetBreakpointCommandCallback(bp_options, callback_body_text, /*is_callback=*/false); - sb_error.SetError(error); + sb_error.SetError(std::move(error)); } else sb_error = Status::FromErrorString("invalid breakpoint"); @@ -670,7 +670,7 @@ SBError SBBreakpoint::AddNameWithErrorHandling(const char *new_name) { bkpt_sp->GetTarget().GetAPIMutex()); Status error; bkpt_sp->GetTarget().AddNameToBreakpoint(bkpt_sp, new_name, error); - status.SetError(error); + status.SetError(std::move(error)); } else { status = Status::FromErrorString("invalid breakpoint"); } diff --git a/lldb/source/API/SBBreakpointLocation.cpp b/lldb/source/API/SBBreakpointLocation.cpp index e5c96b81e80904..b2d1da3927c6ea 100644 --- a/lldb/source/API/SBBreakpointLocation.cpp +++ b/lldb/source/API/SBBreakpointLocation.cpp @@ -239,7 +239,7 @@ SBError SBBreakpointLocation::SetScriptCallbackFunction( callback_function_name, extra_args.m_impl_up ->GetObjectSP()); - sb_error.SetError(error); + sb_error.SetError(std::move(error)); } else sb_error = Status::FromErrorString("invalid breakpoint"); @@ -264,7 +264,7 @@ SBBreakpointLocation::SetScriptCallbackBody(const char *callback_body_text) { .GetScriptInterpreter() ->SetBreakpointCommandCallback(bp_options, callback_body_text, /*is_callback=*/false); - sb_error.SetError(error); + sb_error.SetError(std::move(error)); } else sb_error = Status::FromErrorString("invalid breakpoint"); diff --git a/lldb/source/API/SBBreakpointName.cpp b/lldb/source/API/SBBreakpointName.cpp index 7dc8dee19f43d2..831260d44e8e7f 100644 --- a/lldb/source/API/SBBreakpointName.cpp +++ b/lldb/source/API/SBBreakpointName.cpp @@ -570,14 +570,13 @@ SBError SBBreakpointName::SetScriptCallbackFunction( m_impl_up->GetTarget()->GetAPIMutex()); BreakpointOptions &bp_options = bp_name->GetOptions(); - Status error; - error = m_impl_up->GetTarget() - ->GetDebugger() - .GetScriptInterpreter() - ->SetBreakpointCommandCallbackFunction( - bp_options, callback_function_name, - extra_args.m_impl_up->GetObjectSP()); - sb_error.SetError(error); + Status error = m_impl_up->GetTarget() + ->GetDebugger() + .GetScriptInterpreter() + ->SetBreakpointCommandCallbackFunction( + bp_options, callback_function_name, + extra_args.m_impl_up->GetObjectSP()); + sb_error.SetError(std::move(error)); UpdateName(*bp_name); return sb_error; } @@ -600,7 +599,7 @@ SBBreakpointName::SetScriptCallbackBody(const char *callback_body_text) { .GetScriptInterpreter() ->SetBreakpointCommandCallback( bp_options, callback_body_text, /*is_callback=*/false); - sb_error.SetError(error); + sb_error.SetError(std::move(error)); if (!sb_error.Fail()) UpdateName(*bp_name); diff --git a/lldb/source/API/SBDebugger.cpp b/lldb/source/API/SBDebugger.cpp index c226acc15018ef..b21d7e67290073 100644 --- a/lldb/source/API/SBDebugger.cpp +++ b/lldb/source/API/SBDebugger.cpp @@ -1360,7 +1360,7 @@ SBError SBDebugger::SetInternalVariable(const char *var_name, const char *value, "invalid debugger instance name '%s'", debugger_instance_name); } if (error.Fail()) - sb_error.SetError(error); + sb_error.SetError(std::move(error)); return sb_error; } diff --git a/lldb/source/API/SBError.cpp b/lldb/source/API/SBError.cpp index 30d9ccc78ee376..31964931649db3 100644 --- a/lldb/source/API/SBError.cpp +++ b/lldb/source/API/SBError.cpp @@ -23,7 +23,8 @@ SBError::SBError() { LLDB_INSTRUMENT_VA(this); } SBError::SBError(const SBError &rhs) { LLDB_INSTRUMENT_VA(this, rhs); - m_opaque_up = clone(rhs.m_opaque_up); + if (rhs.m_opaque_up) + m_opaque_up = std::make_unique<Status>(rhs.m_opaque_up->Clone()); } SBError::SBError(const char *message) { @@ -32,8 +33,8 @@ SBError::SBError(const char *message) { SetErrorString(message); } -SBError::SBError(const lldb_private::Status &status) - : m_opaque_up(new Status(status)) { +SBError::SBError(lldb_private::Status &&status) + : m_opaque_up(new Status(std::move(status))) { LLDB_INSTRUMENT_VA(this, status); } @@ -43,7 +44,9 @@ const SBError &SBError::operator=(const SBError &rhs) { LLDB_INSTRUMENT_VA(this, rhs); if (this != &rhs) - m_opaque_up = clone(rhs.m_opaque_up); + if (rhs.m_opaque_up) + m_opaque_up = std::make_unique<Status>(rhs.m_opaque_up->Clone()); + return *this; } @@ -111,9 +114,9 @@ void SBError::SetError(uint32_t err, ErrorType type) { *m_opaque_up = Status(err, type); } -void SBError::SetError(const Status &lldb_error) { +void SBError::SetError(Status &&lldb_error) { CreateIfNeeded(); - *m_opaque_up = lldb_error; + *m_opaque_up = std::move(lldb_error); } void SBError::SetErrorToErrno() { diff --git a/lldb/source/API/SBFile.cpp b/lldb/source/API/SBFile.cpp index 623708780f4c67..2ae4b1481afbf2 100644 --- a/lldb/source/API/SBFile.cpp +++ b/lldb/source/API/SBFile.cpp @@ -62,8 +62,7 @@ SBError SBFile::Read(uint8_t *buf, size_t num_bytes, size_t *bytes_read) { error = Status::FromErrorString("invalid SBFile"); *bytes_read = 0; } else { - Status status = m_opaque_sp->Read(buf, num_bytes); - error.SetError(status); + error.SetError(m_opaque_sp->Read(buf, num_bytes)); *bytes_read = num_bytes; } return error; @@ -78,8 +77,7 @@ SBError SBFile::Write(const uint8_t *buf, size_t num_bytes, error = Status::FromErrorString("invalid SBFile"); *bytes_written = 0; } else { - Status status = m_opaque_sp->Write(buf, num_bytes); - error.SetError(status); + error.SetError(m_opaque_sp->Write(buf, num_bytes)); *bytes_written = num_bytes; } return error; @@ -92,8 +90,7 @@ SBError SBFile::Flush() { if (!m_opaque_sp) { error = Status::FromErrorString("invalid SBFile"); } else { - Status status = m_opaque_sp->Flush(); - error.SetError(status); + error.SetError(m_opaque_sp->Flush()); } return error; } @@ -106,10 +103,8 @@ bool SBFile::IsValid() const { SBError SBFile::Close() { LLDB_INSTRUMENT_VA(this); SBError error; - if (m_opaque_sp) { - Status status = m_opaque_sp->Close(); - error.SetError(status); - } + if (m_opaque_sp) + error.SetError(m_opaque_sp->Close()); return error; } diff --git a/lldb/source/API/SBFormat.cpp b/lldb/source/API/SBFormat.cpp index 51cddceea0372e..080e219d64a362 100644 --- a/lldb/source/API/SBFormat.cpp +++ b/lldb/source/API/SBFormat.cpp @@ -36,7 +36,7 @@ SBFormat::SBFormat(const char *format, lldb::SBError &error) { FormatEntrySP format_entry_sp = std::make_shared<FormatEntity::Entry>(); Status status = FormatEntity::Parse(format, *format_entry_sp); - error.SetError(status); + error.SetError(std::move(status)); if (error.Success()) m_opaque_sp = format_entry_sp; } diff --git a/lldb/source/API/SBFrame.cpp b/lldb/source/API/SBFrame.cpp index b1360e88bcd3af..30c44b974988d0 100644 --- a/lldb/source/API/SBFrame.cpp +++ b/lldb/source/API/SBFrame.cpp @@ -809,7 +809,7 @@ SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) { Status var_error; variable_list = frame->GetVariableList(true, &var_error); if (var_error.Fail()) - value_list.SetError(var_error); + value_list.SetError(std::move(var_error)); if (variable_list) { const size_t num_variables = variable_list->GetSize(); if (num_variables) { @@ -1033,7 +1033,8 @@ SBValue SBFrame::EvaluateExpression(const char *expr) { Status error; error = Status::FromErrorString("can't evaluate expressions when the " "process is running."); - ValueObjectSP error_val_sp = ValueObjectConstResult::Create(nullptr, error); + ValueObjectSP error_val_sp = + ValueObjectConstResult::Create(nullptr, std::move(error)); result.SetSP(error_val_sp, false); } return result; @@ -1129,13 +1130,13 @@ lldb::SBValue SBFrame::EvaluateExpression(const char *expr, Status error; error = Status::FromErrorString("can't evaluate expressions when the " "process is running."); - expr_value_sp = ValueObjectConstResult::Create(nullptr, error); + expr_value_sp = ValueObjectConstResult::Create(nullptr, std::move(error)); expr_result.SetSP(expr_value_sp, false); } } else { Status error; error = Status::FromErrorString("sbframe object is not valid."); - expr_value_sp = ValueObjectConstResult::Create(nullptr, error); + expr_value_sp = ValueObjectConstResult::Create(nullptr, std::move(error)); expr_result.SetSP(expr_value_sp, false); } diff --git a/lldb/source/API/SBPlatform.cpp b/lldb/source/API/SBPlatform.cpp index 2f0f925302f16e..394268b77aa21f 100644 --- a/lldb/source/API/SBPlatform.cpp +++ b/lldb/source/API/SBPlatform.cpp @@ -586,7 +586,7 @@ SBProcess SBPlatform::Attach(SBAttachInfo &attach_info, Status status; ProcessSP process_sp = platform_sp->Attach(info, debugger.ref(), target.GetSP().get(), status); - error.SetError(status); + error.SetError(std::move(status)); return SBProcess(process_sp); } @@ -728,7 +728,7 @@ SBError SBPlatform::SetLocateModuleCallback( symbol_file_spec = symbol_file_spec_sb.ref(); } - return error.ref(); + return error.ref().Clone(); }); return SBError(); } diff --git a/lldb/source/API/SBProcess.cpp b/lldb/source/API/SBProcess.cpp index 3eed51f0245f6f..9773144723c34c 100644 --- a/lldb/source/API/SBProcess.cpp +++ b/lldb/source/API/SBProcess.cpp @@ -1450,7 +1450,7 @@ lldb::SBError SBProcess::DeallocateMemory(lldb::addr_t ptr) { std::lock_guard<std::recursive_mutex> guard( process_sp->GetTarget().GetAPIMutex()); Status error = process_sp->DeallocateMemory(ptr); - sb_error.SetError(error); + sb_error.SetError(std::move(error)); } else { sb_error = Status::FromErrorString("process is running"); } diff --git a/lldb/source/API/SBSaveCoreOptions.cpp b/lldb/source/API/SBSaveCoreOptions.cpp index 2cd431611ef558..ef82b0253f1199 100644 --- a/lldb/source/API/SBSaveCoreOptions.cpp +++ b/lldb/source/API/SBSaveCoreOptions.cpp @@ -40,8 +40,7 @@ SBSaveCoreOptions::operator=(const SBSaveCoreOptions &rhs) { SBError SBSaveCoreOptions::SetPluginName(const char *name) { LLDB_INSTRUMENT_VA(this, name); - lldb_private::Status error = m_opaque_up->SetPluginName(name); - return SBError(error); + return SBError(m_opaque_up->SetPluginName(name)); } void SBSaveCoreOptions::SetStyle(lldb::SaveCoreStyle style) { diff --git a/lldb/source/API/SBStructuredData.cpp b/lldb/source/API/SBStructuredData.cpp index 801ebf45e0e524..b891a34bd7c76a 100644 --- a/lldb/source/API/SBStructuredData.cpp +++ b/lldb/source/API/SBStructuredData.cpp @@ -133,7 +133,7 @@ lldb::SBError SBStructuredData::GetDescription(lldb::SBStream &stream) const { Status error = m_impl_up->GetDescription(stream.ref()); SBError sb_error; - sb_error.SetError(error); + sb_error.SetError(std::move(error)); return sb_error; } diff --git a/lldb/source/API/SBTarget.cpp b/lldb/source/API/SBTarget.cpp index 41eb77e5506bc5..1c1f7e2a03def8 100644 --- a/lldb/source/API/SBTarget.cpp +++ b/lldb/source/API/SBTarget.cpp @@ -1369,7 +1369,7 @@ SBTarget::WatchpointCreateByAddress(lldb::addr_t addr, size_t size, CompilerType *type = nullptr; watchpoint_sp = target_sp->CreateWatchpoint(addr, size, type, watch_type, cw_error); - error.SetError(cw_error); + error.SetError(std::move(cw_error)); sb_watchpoint.SetSP(watchpoint_sp); } @@ -2326,7 +2326,8 @@ lldb::SBValue SBTarget::EvaluateExpression(const char *expr, Status error; error = Status::FromErrorString("can't evaluate expressions when the " "process is running."); - expr_value_sp = ValueObjectConstResult::Create(nullptr, error); + expr_value_sp = + ValueObjectConstResult::Create(nullptr, std::move(error)); } } else { target->EvaluateExpression(expr, frame, expr_value_sp, options.ref()); diff --git a/lldb/source/API/SBThread.cpp b/lldb/source/API/SBThread.cpp index 92868130f6222c..7508eed5d6fdbd 100644 --- a/lldb/source/API/SBThread.cpp +++ b/lldb/source/API/SBThread.cpp @@ -958,7 +958,7 @@ SBError SBThread::JumpToLine(lldb::SBFileSpec &file_spec, uint32_t line) { Thread *thread = exe_ctx.GetThreadPtr(); Status err = thread->JumpToLine(file_spec.ref(), line, true); - sb_error.SetError(err); + sb_error.SetError(std::move(err)); return sb_error; } diff --git a/lldb/source/API/SBValue.cpp b/lldb/source/API/SBValue.cpp index df0e82b6523fbd..273aac5ad47989 100644 --- a/lldb/source/API/SBValue.cpp +++ b/lldb/source/API/SBValue.cpp @@ -270,7 +270,7 @@ SBError SBValue::GetError() { ValueLocker locker; lldb::ValueObjectSP value_sp(GetSP(locker)); if (value_sp) - sb_error.SetError(value_sp->GetError()); + sb_error.SetError(value_sp->GetError().Clone()); else sb_error = Status::FromErrorStringWithFormat("error: %s", locker.GetError().AsCString()); @@ -1476,7 +1476,7 @@ lldb::SBWatchpoint SBValue::Watch(bool resolve_location, bool read, bool write, CompilerType type(value_sp->GetCompilerType()); WatchpointSP watchpoint_sp = target_sp->CreateWatchpoint(addr, byte_size, &type, watch_type, rc); - error.SetError(rc); + error.SetError(std::move(rc)); if (watchpoint_sp) { sb_watchpoint.SetSP(watchpoint_sp); diff --git a/lldb/source/API/SBValueList.cpp b/lldb/source/API/SBValueList.cpp index ba7e06971dc366..63b915094baf2c 100644 --- a/lldb/source/API/SBValueList.cpp +++ b/lldb/source/API/SBValueList.cpp @@ -22,13 +22,14 @@ class ValueListImpl { public: ValueListImpl() = default; - ValueListImpl(const ValueListImpl &rhs) = default; + ValueListImpl(const ValueListImpl &rhs) + : m_values(rhs.m_values), m_error(rhs.m_error.Clone()) {} ValueListImpl &operator=(const ValueListImpl &rhs) { if (this == &rhs) return *this; m_values = rhs.m_values; - m_error = rhs.m_error; + m_error = rhs.m_error.Clone(); return *this; } @@ -67,7 +68,7 @@ class ValueListImpl { const Status &GetError() const { return m_error; } - void SetError(const Status &error) { m_error = error; } + void SetError(Status &&error) { m_error = std::move(error); } private: std::vector<lldb::SBValue> m_values; @@ -205,10 +206,10 @@ lldb::SBError SBValueList::GetError() { LLDB_INSTRUMENT_VA(this); SBError sb_error; if (m_opaque_up) - sb_error.SetError(m_opaque_up->GetError()); + sb_error.SetError(m_opaque_up->GetError().Clone()); return sb_error; } -void SBValueList::SetError(const lldb_private::Status &status) { - ref().SetError(status); +void SBValueList::SetError(lldb_private::Status &&status) { + ref().SetError(std::move(status)); } diff --git a/lldb/source/API/SBWatchpoint.cpp b/lldb/source/API/SBWatchpoint.cpp index 9664bbe618600c..21e2dcc01968e7 100644 --- a/lldb/source/API/SBWatchpoint.cpp +++ b/lldb/source/API/SBWatchpoint.cpp @@ -86,7 +86,7 @@ SBError SBWatchpoint::GetError() { SBError sb_error; lldb::WatchpointSP watchpoint_sp(GetSP()); if (watchpoint_sp) { - sb_error.SetError(watchpoint_sp->GetError()); + sb_error.SetError(watchpoint_sp->GetError().Clone()); } return sb_error; } diff --git a/lldb/source/Commands/CommandObjectCommands.cpp b/lldb/source/Commands/CommandObjectCommands.cpp index f8f2b97eb898fa..e3291640fa9352 100644 --- a/lldb/source/Commands/CommandObjectCommands.cpp +++ b/lldb/source/Commands/CommandObjectCommands.cpp @@ -1874,8 +1874,8 @@ class CommandObjectScriptingObjectParsed : public CommandObjectParsed { ~CommandObjectScriptingObjectParsed() override = default; - Status GetOptionsError() { return m_options_error; } - Status GetArgsError() { return m_args_error; } + Status GetOptionsError() { return m_options_error.Clone(); } + Status GetArgsError() { return m_args_error.Clone(); } bool WantsCompletion() override { return true; } bool IsRemovable() const override { return true; } diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index 1266355578e321..9bdc5a3949751d 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -258,7 +258,7 @@ Status Debugger::SetPropertyValue(const ExecutionContext *exe_ctx, StreamString feedback_stream; if (!target_sp->LoadScriptingResources(errors, feedback_stream)) { Stream &s = GetErrorStream(); - for (auto error : errors) { + for (auto &error : errors) { s.Printf("%s\n", error.AsCString()); } if (feedback_stream.GetSize()) diff --git a/lldb/source/Core/ModuleList.cpp b/lldb/source/Core/ModuleList.cpp index bba4199ce9e837..2b8ccab2406c6b 100644 --- a/lldb/source/Core/ModuleList.cpp +++ b/lldb/source/Core/ModuleList.cpp @@ -1046,8 +1046,8 @@ bool ModuleList::LoadScriptingResourcesInTarget(Target *target, return false; std::lock_guard<std::recursive_mutex> guard(m_modules_mutex); for (auto module : m_modules) { - Status error; if (module) { + Status error; if (!module->LoadScriptingResourceInTarget(target, error, feedback_stream)) { if (error.Fail() && error.AsCString()) { @@ -1058,8 +1058,7 @@ bool ModuleList::LoadScriptingResourcesInTarget(Target *target, .GetFileNameStrippingExtension() .GetCString(), error.AsCString()); - errors.push_back(error); - + errors.push_back(std::move(error)); if (!continue_on_error) return false; } diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp index d56bd004e63c7e..1bedd87e943dc3 100644 --- a/lldb/source/Core/ValueObject.cpp +++ b/lldb/source/Core/ValueObject.cpp @@ -2763,7 +2763,7 @@ ValueObjectSP ValueObject::CreateConstantValue(ConstString name) { if (!valobj_sp) { ExecutionContext exe_ctx(GetExecutionContextRef()); valobj_sp = ValueObjectConstResult::Create( - exe_ctx.GetBestExecutionContextScope(), m_error); + exe_ctx.GetBestExecutionContextScope(), m_error.Clone()); } return valobj_sp; } @@ -2974,7 +2974,7 @@ ValueObjectSP ValueObject::Cast(const CompilerType &compiler_type) { return ValueObjectConstResult::Create( ExecutionContext(GetExecutionContextRef()).GetBestExecutionContextScope(), - error); + std::move(error)); } lldb::ValueObjectSP ValueObject::Clone(ConstString new_name) { diff --git a/lldb/source/Core/ValueObjectCast.cpp b/lldb/source/Core/ValueObjectCast.cpp index c8e31641514170..308fa161180d41 100644 --- a/lldb/source/Core/ValueObjectCast.cpp +++ b/lldb/source/Core/ValueObjectCast.cpp @@ -86,7 +86,7 @@ bool ValueObjectCast::UpdateValue() { // The dynamic value failed to get an error, pass the error along if (m_error.Success() && m_parent->GetError().Fail()) - m_error = m_parent->GetError(); + m_error = m_parent->GetError().Clone(); SetValueIsValid(false); return false; } diff --git a/lldb/source/Core/ValueObjectConstResult.cpp b/lldb/source/Core/ValueObjectConstResult.cpp index 879d3c3f6b0372..60850c15e6a832 100644 --- a/lldb/source/Core/ValueObjectConstResult.cpp +++ b/lldb/source/Core/ValueObjectConstResult.cpp @@ -169,16 +169,17 @@ ValueObjectConstResult::ValueObjectConstResult( } ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope, - const Status &error) { + Status &&error) { auto manager_sp = ValueObjectManager::Create(); - return (new ValueObjectConstResult(exe_scope, *manager_sp, error))->GetSP(); + return (new ValueObjectConstResult(exe_scope, *manager_sp, std::move(error))) + ->GetSP(); } ValueObjectConstResult::ValueObjectConstResult(ExecutionContextScope *exe_scope, ValueObjectManager &manager, - const Status &error) + Status &&error) : ValueObject(exe_scope, manager), m_impl(this) { - m_error = error; + m_error = std::move(error); SetIsConstant(); } diff --git a/lldb/source/Core/ValueObjectDynamicValue.cpp b/lldb/source/Core/ValueObjectDynamicValue.cpp index d6c523e99f10d2..67311ea6e3be45 100644 --- a/lldb/source/Core/ValueObjectDynamicValue.cpp +++ b/lldb/source/Core/ValueObjectDynamicValue.cpp @@ -118,7 +118,7 @@ bool ValueObjectDynamicValue::UpdateValue() { if (!m_parent->UpdateValueIfNeeded(false)) { // The dynamic value failed to get an error, pass the error along if (m_error.Success() && m_parent->GetError().Fail()) - m_error = m_parent->GetError(); + m_error = m_parent->GetError().Clone(); return false; } diff --git a/lldb/source/Core/ValueObjectSyntheticFilter.cpp b/lldb/source/Core/ValueObjectSyntheticFilter.cpp index adac1b400705e2..091b8f883b6050 100644 --- a/lldb/source/Core/ValueObjectSyntheticFilter.cpp +++ b/lldb/source/Core/ValueObjectSyntheticFilter.cpp @@ -169,7 +169,7 @@ bool ValueObjectSynthetic::UpdateValue() { // our parent could not update.. as we are meaningless without a parent, // just stop if (m_parent->GetError().Fail()) - m_error = m_parent->GetError(); + m_error = m_parent->GetError().Clone(); return false; } diff --git a/lldb/source/Expression/Materializer.cpp b/lldb/source/Expression/Materializer.cpp index fa0edad1fa583f..8097e38919b047 100644 --- a/lldb/source/Expression/Materializer.cpp +++ b/lldb/source/Expression/Materializer.cpp @@ -462,7 +462,7 @@ class EntityVariableBase : public Materializer::Entity { return; } - Status valobj_error = valobj_sp->GetError(); + Status valobj_error = valobj_sp->GetError().Clone(); if (valobj_error.Fail()) { err = Status::FromErrorStringWithFormat( diff --git a/lldb/source/Expression/UserExpression.cpp b/lldb/source/Expression/UserExpression.cpp index c2889e4c986bfe..872f6304f91baa 100644 --- a/lldb/source/Expression/UserExpression.cpp +++ b/lldb/source/Expression/UserExpression.cpp @@ -268,10 +268,10 @@ UserExpression::Evaluate(ExecutionContext &exe_ctx, const bool generate_debug_info = options.GetGenerateDebugInfo(); if (options.InvokeCancelCallback(lldb::eExpressionEvaluationParse)) { - error = Status::FromErrorString( + Status error = Status::FromErrorString( "expression interrupted by callback before parse"); result_valobj_sp = ValueObjectConstResult::Create( - exe_ctx.GetBestExecutionContextScope(), error); + exe_ctx.GetBestExecutionContextScope(), std::move(error)); return lldb::eExpressionInterrupted; } @@ -364,7 +364,7 @@ UserExpression::Evaluate(ExecutionContext &exe_ctx, lldb::eExpressionInterrupted, "expression interrupted by callback before execution"); result_valobj_sp = ValueObjectConstResult::Create( - exe_ctx.GetBestExecutionContextScope(), error); + exe_ctx.GetBestExecutionContextScope(), std::move(error)); return lldb::eExpressionInterrupted; } @@ -415,7 +415,7 @@ UserExpression::Evaluate(ExecutionContext &exe_ctx, if (result_valobj_sp.get() == nullptr) { result_valobj_sp = ValueObjectConstResult::Create( - exe_ctx.GetBestExecutionContextScope(), error); + exe_ctx.GetBestExecutionContextScope(), std::move(error)); } return execution_results; diff --git a/lldb/source/Host/common/LockFileBase.cpp b/lldb/source/Host/common/LockFileBase.cpp index 01a8c38cef58ef..6ef684e6d622c1 100644 --- a/lldb/source/Host/common/LockFileBase.cpp +++ b/lldb/source/Host/common/LockFileBase.cpp @@ -50,7 +50,7 @@ Status LockFileBase::Unlock() { if (!IsLocked()) return NotLocked(); - const auto error = DoUnlock(); + Status error = DoUnlock(); if (error.Success()) { m_locked = false; m_start = 0; @@ -69,7 +69,7 @@ Status LockFileBase::DoLock(const Locker &locker, const uint64_t start, if (IsLocked()) return AlreadyLocked(); - const auto error = locker(start, len); + Status error = locker(start, len); if (error.Success()) { m_locked = true; m_start = start; diff --git a/lldb/source/Host/common/NativeProcessProtocol.cpp b/lldb/source/Host/common/NativeProcessProtocol.cpp index a84d8db1c8794a..e36eefaa6f4a49 100644 --- a/lldb/source/Host/common/NativeProcessProtocol.cpp +++ b/lldb/source/Host/common/NativeProcessProtocol.cpp @@ -215,17 +215,17 @@ Status NativeProcessProtocol::RemoveWatchpoint(lldb::addr_t addr) { for (const auto &thread : m_threads) { assert(thread && "thread list should not have a NULL thread!"); - const Status thread_error = thread->RemoveWatchpoint(addr); + Status thread_error = thread->RemoveWatchpoint(addr); if (thread_error.Fail()) { // Keep track of the first thread error if any threads fail. We want to // try to remove the watchpoint from every thread, though, even if one or // more have errors. if (!overall_error.Fail()) - overall_error = thread_error; + overall_error = std::move(thread_error); } } - const Status error = m_watchpoint_list.Remove(addr); - return overall_error.Fail() ? overall_error : error; + Status error = m_watchpoint_list.Remove(addr); + return overall_error.Fail() ? std::move(overall_error) : std::move(error); } const HardwareBreakpointMap & diff --git a/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp b/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp index 2a2fcf00c0adfe..d0cc68826d4bb7 100644 --- a/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp +++ b/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp @@ -233,7 +233,7 @@ ConnectionStatus ConnectionFileDescriptor::Disconnect(Status *error_ptr) { if (error.Fail()) status = eConnectionStatusError; if (error_ptr) - *error_ptr = error; + *error_ptr = std::move(error); // Close any pipes we were using for async interrupts m_pipe.Close(); @@ -295,7 +295,7 @@ size_t ConnectionFileDescriptor::Read(void *dst, size_t dst_len, } if (error_ptr) - *error_ptr = error; + *error_ptr = error.Clone(); if (error.Fail()) { uint32_t error_value = error.GetError(); @@ -393,7 +393,7 @@ size_t ConnectionFileDescriptor::Write(const void *src, size_t src_len, } if (error_ptr) - *error_ptr = error; + *error_ptr = error.Clone(); if (error.Fail()) { switch (error.GetError()) { @@ -476,7 +476,7 @@ ConnectionFileDescriptor::BytesAvailable(const Timeout<std::micro> &timeout, Status error = select_helper.Select(); if (error_ptr) - *error_ptr = error; + *error_ptr = error.Clone(); if (error.Fail()) { switch (error.GetError()) { @@ -557,7 +557,7 @@ lldb::ConnectionStatus ConnectionFileDescriptor::AcceptSocket( } if (error_ptr) - *error_ptr = error; + *error_ptr = error.Clone(); return eConnectionStatusError; } @@ -579,7 +579,7 @@ ConnectionFileDescriptor::ConnectSocket(Socket::SocketProtocol socket_protocol, } if (error_ptr) - *error_ptr = error; + *error_ptr = error.Clone(); return eConnectionStatusError; } diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp index df539d5f5bcee9..b93f47a8a8d5ec 100644 --- a/lldb/source/Interpreter/CommandInterpreter.cpp +++ b/lldb/source/Interpreter/CommandInterpreter.cpp @@ -1861,7 +1861,7 @@ CommandInterpreter::PreprocessToken(std::string &expr_str) { // But if for some reason we didn't get a value object at all, then we will // make up some helpful errors from the expression result. if (expr_result_valobj_sp) - error = expr_result_valobj_sp->GetError(); + error = expr_result_valobj_sp->GetError().Clone(); if (error.Success()) { std::string result = lldb_private::toString(expr_result) + diff --git a/lldb/source/Interpreter/ScriptInterpreter.cpp b/lldb/source/Interpreter/ScriptInterpreter.cpp index 079ab9044de63a..8b55221da6e761 100644 --- a/lldb/source/Interpreter/ScriptInterpreter.cpp +++ b/lldb/source/Interpreter/ScriptInterpreter.cpp @@ -96,7 +96,7 @@ lldb::ProcessLaunchInfoSP ScriptInterpreter::GetOpaqueTypeFromSBLaunchInfo( Status ScriptInterpreter::GetStatusFromSBError(const lldb::SBError &error) const { if (error.m_opaque_up) - return *error.m_opaque_up; + return error.m_opaque_up->Clone(); return Status(); } diff --git a/lldb/source/Plugins/Platform/Android/AdbClient.cpp b/lldb/source/Plugins/Platform/Android/AdbClient.cpp index 00e66f8818f077..a179260ca15f60 100644 --- a/lldb/source/Plugins/Platform/Android/AdbClient.cpp +++ b/lldb/source/Plugins/Platform/Android/AdbClient.cpp @@ -173,7 +173,7 @@ Status AdbClient::SetPortForwarding(const uint16_t local_port, snprintf(message, sizeof(message), "forward:tcp:%d;tcp:%d", local_port, remote_port); - const auto error = SendDeviceMessage(message); + Status error = SendDeviceMessage(message); if (error.Fail()) return error; @@ -192,7 +192,7 @@ AdbClient::SetPortForwarding(const uint16_t local_port, snprintf(message, sizeof(message), "forward:tcp:%d;%s:%s", local_port, sock_namespace_str, remote_socket_name.str().c_str()); - const auto error = SendDeviceMessage(message); + Status error = SendDeviceMessage(message); if (error.Fail()) return error; @@ -203,7 +203,7 @@ Status AdbClient::DeletePortForwarding(const uint16_t local_port) { char message[32]; snprintf(message, sizeof(message), "killforward:tcp:%d", local_port); - const auto error = SendDeviceMessage(message); + Status error = SendDeviceMessage(message); if (error.Fail()) return error; @@ -588,7 +588,7 @@ AdbClient::SyncService::executeCommand(const std::function<Status()> &cmd) { if (!m_conn) return Status::FromErrorString("SyncService is disconnected"); - const auto error = cmd(); + Status error = cmd(); if (error.Fail()) m_conn.reset(); diff --git a/lldb/source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.cpp b/lldb/source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.cpp index de7031701df4d8..d18b718d4a56cf 100644 --- a/lldb/source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.cpp +++ b/lldb/source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.cpp @@ -189,8 +189,8 @@ Status PlatformAndroidRemoteGDBServer::MakeConnectURL( Status error; auto forward = [&](const uint16_t local, const uint16_t remote) { - error = ForwardPortWithAdb(local, remote, remote_socket_name, - m_socket_namespace, m_device_id); + Status error = ForwardPortWithAdb(local, remote, remote_socket_name, + m_socket_namespace, m_device_id); if (error.Success()) { m_port_forwards[pid] = local; std::ostringstream url_str; diff --git a/lldb/source/Plugins/Platform/MacOSX/objcxx/PlatformiOSSimulatorCoreSimulatorSupport.h b/lldb/source/Plugins/Platform/MacOSX/objcxx/PlatformiOSSimulatorCoreSimulatorSupport.h index b2956054d50bf4..57dd32f587a652 100644 --- a/lldb/source/Plugins/Platform/MacOSX/objcxx/PlatformiOSSimulatorCoreSimulatorSupport.h +++ b/lldb/source/Plugins/Platform/MacOSX/objcxx/PlatformiOSSimulatorCoreSimulatorSupport.h @@ -34,7 +34,7 @@ class Process { explicit operator bool() { return m_pid != LLDB_INVALID_PROCESS_ID; } - lldb_private::Status GetError() { return m_error; } + lldb_private::Status GetError() { return m_error.Clone(); } private: Process(lldb::pid_t p); diff --git a/lldb/source/Plugins/Platform/MacOSX/objcxx/PlatformiOSSimulatorCoreSimulatorSupport.mm b/lldb/source/Plugins/Platform/MacOSX/objcxx/PlatformiOSSimulatorCoreSimulatorSupport.mm index 303a5409c6fe4b..f3e79d3d56154e 100644 --- a/lldb/source/Plugins/Platform/MacOSX/objcxx/PlatformiOSSimulatorCoreSimulatorSupport.mm +++ b/lldb/source/Plugins/Platform/MacOSX/objcxx/PlatformiOSSimulatorCoreSimulatorSupport.mm @@ -61,10 +61,10 @@ - (BOOL)spawnWithPath:(NSString *)path CoreSimulatorSupport::Process::Process(lldb::pid_t p) : m_pid(p), m_error() {} CoreSimulatorSupport::Process::Process(Status error) - : m_pid(LLDB_INVALID_PROCESS_ID), m_error(error) {} + : m_pid(LLDB_INVALID_PROCESS_ID), m_error(std::move(error)) {} CoreSimulatorSupport::Process::Process(lldb::pid_t p, Status error) - : m_pid(p), m_error(error) {} + : m_pid(p), m_error(std::move(error)) {} CoreSimulatorSupport::DeviceType::DeviceType() : m_model_identifier() {} @@ -498,19 +498,19 @@ static Status HandleFileAction(ProcessLaunchInfo &launch_info, STDIN_FILENO, stdin_file); if (error.Fail()) - return CoreSimulatorSupport::Process(error); + return CoreSimulatorSupport::Process(std::move(error)); error = HandleFileAction(launch_info, options, kSimDeviceSpawnStdout, STDOUT_FILENO, stdout_file); if (error.Fail()) - return CoreSimulatorSupport::Process(error); + return CoreSimulatorSupport::Process(std::move(error)); error = HandleFileAction(launch_info, options, kSimDeviceSpawnStderr, STDERR_FILENO, stderr_file); if (error.Fail()) - return CoreSimulatorSupport::Process(error); + return CoreSimulatorSupport::Process(std::move(error)); #undef kSimDeviceSpawnEnvironment #undef kSimDeviceSpawnStdin @@ -539,7 +539,7 @@ static Status HandleFileAction(ProcessLaunchInfo &launch_info, : "unable to launch"); } - return CoreSimulatorSupport::Process(pid, error); + return CoreSimulatorSupport::Process(pid, std::move(error)); } CoreSimulatorSupport::DeviceSet diff --git a/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.cpp b/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.cpp index 70b49c0424bbbf..31315e46ca168d 100644 --- a/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.cpp +++ b/lldb/source/Plugins/Platform/POSIX/PlatformPOSIX.cpp @@ -544,7 +544,7 @@ Status PlatformPOSIX::EvaluateLibdlExpression( return expr_error; if (result_valobj_sp->GetError().Fail()) - return result_valobj_sp->GetError(); + return result_valobj_sp->GetError().Clone(); return Status(); } @@ -976,7 +976,7 @@ Status PlatformPOSIX::UnloadImage(lldb_private::Process *process, return error; if (result_valobj_sp->GetError().Fail()) - return result_valobj_sp->GetError(); + return result_valobj_sp->GetError().Clone(); Scalar scalar; if (result_valobj_sp->ResolveValue(scalar)) { diff --git a/lldb/source/Plugins/Platform/Windows/PlatformWindows.cpp b/lldb/source/Plugins/Platform/Windows/PlatformWindows.cpp index 8173b7c3b50035..7352d6f33f2174 100644 --- a/lldb/source/Plugins/Platform/Windows/PlatformWindows.cpp +++ b/lldb/source/Plugins/Platform/Windows/PlatformWindows.cpp @@ -444,7 +444,7 @@ Status PlatformWindows::UnloadImage(Process *process, uint32_t image_token) { return result; if (value->GetError().Fail()) - return value->GetError(); + return value->GetError().Clone(); Scalar scalar; if (value->ResolveValue(scalar)) { @@ -805,7 +805,7 @@ extern "C" { return error; if (value->GetError().Fail()) - return value->GetError(); + return value->GetError().Clone(); return Status(); } diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.cpp index 8ba31b31e8dc1c..f5fc337a8028ef 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.cpp @@ -111,7 +111,7 @@ bool ScriptedProcessPythonInterface::CreateBreakpoint(lldb::addr_t addr, // If there was an error on the python call, surface it to the user. if (py_error.Fail()) - error = py_error; + error = std::move(py_error); if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) @@ -128,7 +128,7 @@ lldb::DataExtractorSP ScriptedProcessPythonInterface::ReadMemoryAtAddress( // If there was an error on the python call, surface it to the user. if (py_error.Fail()) - error = py_error; + error = std::move(py_error); return data_sp; } @@ -145,7 +145,7 @@ lldb::offset_t ScriptedProcessPythonInterface::WriteMemoryAtAddress( // If there was an error on the python call, surface it to the user. if (py_error.Fail()) - error = py_error; + error = std::move(py_error); return obj->GetUnsignedIntegerValue(LLDB_INVALID_OFFSET); } diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h index c1dcdc7df6cee3..cb6f6ec3989260 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h @@ -309,8 +309,12 @@ class ScriptedPythonInterface : virtual public ScriptedInterface { return python::PythonBoolean(arg); } - python::PythonObject Transform(Status arg) { - return python::SWIGBridge::ToSWIGWrapper(arg); + python::PythonObject Transform(const Status &arg) { + return python::SWIGBridge::ToSWIGWrapper(arg.Clone()); + } + + python::PythonObject Transform(Status &&arg) { + return python::SWIGBridge::ToSWIGWrapper(std::move(arg)); } python::PythonObject Transform(const StructuredDataImpl &arg) { diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h b/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h index 5351c1a698b4a7..97a3837fd7aa62 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h @@ -86,7 +86,7 @@ class SWIGBridge { static PythonObject ToSWIGWrapper(lldb::ProcessSP process_sp); static PythonObject ToSWIGWrapper(lldb::ThreadPlanSP thread_plan_sp); static PythonObject ToSWIGWrapper(lldb::BreakpointSP breakpoint_sp); - static PythonObject ToSWIGWrapper(const Status &status); + static PythonObject ToSWIGWrapper(Status status); static PythonObject ToSWIGWrapper(const StructuredDataImpl &data_impl); static PythonObject ToSWIGWrapper(lldb::ThreadSP thread_sp); static PythonObject ToSWIGWrapper(lldb::StackFrameSP frame_sp); diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h index 148932d67b908c..1267e20f087121 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h @@ -268,7 +268,7 @@ class DWARFUnit : public UserID { /// .dwo file. Things like a missing .dwo file, DWO ID mismatch, and other /// .dwo errors can be stored in each compile unit so the issues can be /// communicated to the user. - void SetDwoError(const Status &error) { m_dwo_error = error; } + void SetDwoError(Status &&error) { m_dwo_error = std::move(error); } protected: DWARFUnit(SymbolFileDWARF &dwarf, lldb::user_id_t uid, diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index ff44329d081caa..f721ca00fd3559 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -4480,7 +4480,7 @@ Status SymbolFileDWARF::CalculateFrameVariableError(StackFrame &frame) { dwarf_cu->ExtractUnitDIEIfNeeded(); const Status &dwo_error = dwarf_cu->GetDwoError(); if (dwo_error.Fail()) - return dwo_error; + return dwo_error.Clone(); // Don't return an error for assembly files as they typically don't have // varaible information. diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index 0cd2d06cd708cc..08ea4c6d1645ad 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -1574,7 +1574,7 @@ Status SymbolFileDWARFDebugMap::CalculateFrameVariableError(StackFrame &frame) { // we weren't able to open the .o file. Display an appropriate // error if (comp_unit_info->oso_load_error.Fail()) - return comp_unit_info->oso_load_error; + return comp_unit_info->oso_load_error.Clone(); else return Status::FromErrorStringWithFormat( "unable to load debug map object file \"%s\" " diff --git a/lldb/source/Target/ModuleCache.cpp b/lldb/source/Target/ModuleCache.cpp index ccae7ea106c974..f737836e0d9712 100644 --- a/lldb/source/Target/ModuleCache.cpp +++ b/lldb/source/Target/ModuleCache.cpp @@ -139,7 +139,7 @@ Status CreateHostSysRootModuleLink(const FileSpec &root_dir_spec, DecrementRefExistingModule(root_dir_spec, sysroot_module_path_spec); } - const auto error = MakeDirectory( + Status error = MakeDirectory( FileSpec(sysroot_module_path_spec.GetDirectory().AsCString())); if (error.Fail()) return error; diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp index 7792edcc2cb582..3e7546048e5862 100644 --- a/lldb/source/Target/Platform.cpp +++ b/lldb/source/Target/Platform.cpp @@ -549,7 +549,7 @@ Status Platform::Install(const FileSpec &src, const FileSpec &dst) { RecurseCopyBaton baton = {recurse_dst, this, Status()}; FileSystem::Instance().EnumerateDirectory( src_dir_path, true, true, true, RecurseCopy_Callback, &baton); - return baton.error; + return std::move(baton.error); } } break; @@ -1566,7 +1566,7 @@ Status Platform::GetRemoteSharedModule(const ModuleSpec &module_spec, // resolved_module_spec. // Trying to find a module by UUID on local file system. - const Status error = module_resolver(resolved_module_spec); + Status error = module_resolver(resolved_module_spec); if (error.Success()) { if (module_sp && symbol_file_spec) { // Set the symbol file to the module if the locate modudle callback was diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index f2a631a466b35d..40f3115f1ff6de 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -2147,7 +2147,6 @@ size_t Process::ReadCStringFromMemory(addr_t addr, char *dst, result_error.Clear(); // NULL out everything just to be safe memset(dst, 0, dst_max_len); - Status error; addr_t curr_addr = addr; const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize(); size_t bytes_left = dst_max_len - 1; @@ -2158,10 +2157,11 @@ size_t Process::ReadCStringFromMemory(addr_t addr, char *dst, cache_line_size - (curr_addr % cache_line_size); addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left); + Status error; size_t bytes_read = ReadMemory(curr_addr, curr_dst, bytes_to_read, error); if (bytes_read == 0) { - result_error = error; + result_error = std::move(error); dst[total_cstr_len] = '\0'; break; } diff --git a/lldb/source/Target/StackFrame.cpp b/lldb/source/Target/StackFrame.cpp index 1610971a34148b..fe0d4c93c50627 100644 --- a/lldb/source/Target/StackFrame.cpp +++ b/lldb/source/Target/StackFrame.cpp @@ -1117,7 +1117,7 @@ bool StackFrame::GetFrameBaseValue(Scalar &frame_base, Status *error_ptr) { frame_base = m_frame_base; if (error_ptr) - *error_ptr = m_frame_base_error; + *error_ptr = m_frame_base_error.Clone(); return m_frame_base_error.Success(); } diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index fcac0a48f46e6d..f1c378b968d2ba 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -1986,7 +1986,6 @@ size_t Target::ReadCStringFromMemory(const Address &addr, char *dst, result_error.Clear(); // NULL out everything just to be safe memset(dst, 0, dst_max_len); - Status error; addr_t curr_addr = addr.GetLoadAddress(this); Address address(addr); @@ -2003,11 +2002,12 @@ size_t Target::ReadCStringFromMemory(const Address &addr, char *dst, cache_line_size - (curr_addr % cache_line_size); addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left); + Status error; size_t bytes_read = ReadMemory(address, curr_dst, bytes_to_read, error, force_live_memory); if (bytes_read == 0) { - result_error = error; + result_error = std::move(error); dst[total_cstr_len] = '\0'; break; } @@ -2401,7 +2401,7 @@ ModuleSP Target::GetOrCreateModule(const ModuleSpec &orig_module_spec, } } if (error_ptr) - *error_ptr = error; + *error_ptr = std::move(error); return module_sp; } @@ -2730,7 +2730,7 @@ ExpressionResults Target::EvaluateExpression( // Pass up the error by wrapping it inside an error result. if (error.Fail() && !result_valobj_sp) result_valobj_sp = ValueObjectConstResult::Create( - exe_ctx.GetBestExecutionContextScope(), error); + exe_ctx.GetBestExecutionContextScope(), std::move(error)); } if (execution_results == eExpressionCompleted) @@ -3348,10 +3348,8 @@ Status Target::Launch(ProcessLaunchInfo &launch_info, Stream *stream) { else error = m_process_sp->Resume(); if (!error.Success()) { - Status error2; - error2 = Status::FromErrorStringWithFormat( + error = Status::FromErrorStringWithFormat( "process resume at entry point failed: %s", error.AsCString()); - error = error2; } } break; case eStateExited: { diff --git a/lldb/source/Utility/Status.cpp b/lldb/source/Utility/Status.cpp index 40e1fbf3fab1bb..4af3af5fba0185 100644 --- a/lldb/source/Utility/Status.cpp +++ b/lldb/source/Utility/Status.cpp @@ -107,6 +107,13 @@ llvm::Error Status::ToError() const { Status::~Status() = default; +const Status &Status::operator=(Status &&other) { + m_code = other.m_code; + m_type = other.m_type; + m_string = std::move(other.m_string); + return *this; +} + #ifdef _WIN32 static std::string RetrieveWin32ErrorString(uint32_t error_code) { char *buffer = nullptr; diff --git a/lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp b/lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp index 0edde54d310fdd..f2746c3e2516fd 100644 --- a/lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp +++ b/lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp @@ -283,7 +283,7 @@ bool lldb_private::python::SWIGBridge::LLDBSwigPythonStopHookCallHandleStop( } python::PythonObject -lldb_private::python::SWIGBridge::ToSWIGWrapper(const Status &status) { +lldb_private::python::SWIGBridge::ToSWIGWrapper(Status status) { return python::PythonObject(); } diff --git a/lldb/unittests/Target/RemoteAwarePlatformTest.cpp b/lldb/unittests/Target/RemoteAwarePlatformTest.cpp index d7810b20af95d5..3278674ed0a057 100644 --- a/lldb/unittests/Target/RemoteAwarePlatformTest.cpp +++ b/lldb/unittests/Target/RemoteAwarePlatformTest.cpp @@ -33,8 +33,8 @@ class RemoteAwarePlatformTester : public RemoteAwarePlatform { MOCK_METHOD0(CalculateTrapHandlerSymbolNames, void()); MOCK_METHOD2(ResolveExecutable, - std::pair<Status, ModuleSP>(const ModuleSpec &, - const FileSpecList *)); + std::pair<bool, ModuleSP>(const ModuleSpec &, + const FileSpecList *)); Status ResolveExecutable(const ModuleSpec &module_spec, lldb::ModuleSP &exe_module_sp, @@ -42,7 +42,7 @@ class RemoteAwarePlatformTester : public RemoteAwarePlatform { { // NOLINT(modernize-use-override) auto pair = ResolveExecutable(module_spec, module_search_paths_ptr); exe_module_sp = pair.second; - return pair.first; + return pair.first ? Status() : Status::FromErrorString("error"); } void SetRemotePlatform(lldb::PlatformSP platform) { @@ -81,7 +81,7 @@ TEST_F(RemoteAwarePlatformTest, TestResolveExecutabelOnClientByPlatform) { EXPECT_CALL(platform, GetSupportedArchitectures(process_host_arch)) .WillRepeatedly(Return(std::vector<ArchSpec>())); EXPECT_CALL(platform, ResolveExecutable(_, _)) - .WillRepeatedly(Return(std::make_pair(Status(), expected_executable))); + .WillRepeatedly(Return(std::make_pair(true, expected_executable))); platform.SetRemotePlatform(std::make_shared<TargetPlatformTester>(false)); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits