https://github.com/adrian-prantl updated https://github.com/llvm/llvm-project/pull/106774
>From 992600a058c8dffb0d39a3c840ed03087181376c Mon Sep 17 00:00:00 2001 From: Adrian Prantl <apra...@apple.com> Date: Thu, 29 Aug 2024 17:29:10 -0700 Subject: [PATCH] [lldb] Change the implementation of Status to store an llvm::Error (NFC) 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). This patch makes the transition to llvm::Error easier by making the places that cannot switch to llvm::Error explicit: They are marked with a call to Status::clone(). Every other API can and should be refactored to use llvm::Expected. In the end Status should only be used in very few places. Whenever an unchecked Error is dropped by Status it logs this to the verbose API channel. Implementation notes: This patch introduces two new kinds of error_category as well as new llvm::Error types. Here is the mapping of lldb::ErrorType to llvm::Errors: (eErrorTypeInvalid) eErrorTypeGeneric llvm::StringError eErrorTypePOSIX llvm::ECError eErrorTypeMachKernel MachKernelError eErrorTypeExpression llvm::ErrorList<ExpressionError> eErrorTypeWin32 Win32Error --- lldb/bindings/python/python-swigsafecast.swig | 2 +- lldb/include/lldb/API/SBError.h | 4 +- lldb/include/lldb/API/SBValueList.h | 2 +- .../lldb/Core/ValueObjectConstResult.h | 4 +- lldb/include/lldb/Target/Process.h | 2 - lldb/include/lldb/Utility/Status.h | 70 ++++- lldb/source/API/SBBreakpoint.cpp | 6 +- lldb/source/API/SBBreakpointLocation.cpp | 4 +- lldb/source/API/SBBreakpointName.cpp | 17 +- lldb/source/API/SBDebugger.cpp | 4 +- lldb/source/API/SBError.cpp | 15 +- lldb/source/API/SBFile.cpp | 15 +- lldb/source/API/SBFormat.cpp | 2 +- lldb/source/API/SBFrame.cpp | 9 +- lldb/source/API/SBPlatform.cpp | 4 +- lldb/source/API/SBProcess.cpp | 2 +- lldb/source/API/SBSaveCoreOptions.cpp | 3 +- lldb/source/API/SBStructuredData.cpp | 2 +- lldb/source/API/SBTarget.cpp | 7 +- lldb/source/API/SBThread.cpp | 2 +- lldb/source/API/SBValue.cpp | 4 +- lldb/source/API/SBValueList.cpp | 13 +- lldb/source/API/SBWatchpoint.cpp | 2 +- .../source/Commands/CommandObjectCommands.cpp | 4 +- .../Commands/CommandObjectMemoryTag.cpp | 10 +- lldb/source/Core/Debugger.cpp | 2 +- lldb/source/Core/ModuleList.cpp | 5 +- lldb/source/Core/PluginManager.cpp | 2 +- lldb/source/Core/ThreadedCommunication.cpp | 2 +- lldb/source/Core/ValueObject.cpp | 4 +- lldb/source/Core/ValueObjectCast.cpp | 2 +- lldb/source/Core/ValueObjectConstResult.cpp | 9 +- lldb/source/Core/ValueObjectDynamicValue.cpp | 2 +- .../Core/ValueObjectSyntheticFilter.cpp | 2 +- lldb/source/DataFormatters/VectorType.cpp | 2 +- lldb/source/Expression/FunctionCaller.cpp | 3 +- lldb/source/Expression/LLVMUserExpression.cpp | 6 +- lldb/source/Expression/Materializer.cpp | 2 +- lldb/source/Expression/UserExpression.cpp | 8 +- lldb/source/Host/common/LockFileBase.cpp | 4 +- .../Host/common/NativeProcessProtocol.cpp | 10 +- lldb/source/Host/common/TCPSocket.cpp | 4 +- lldb/source/Host/macosx/objcxx/Host.mm | 2 +- .../posix/ConnectionFileDescriptorPosix.cpp | 12 +- .../source/Interpreter/CommandInterpreter.cpp | 2 +- lldb/source/Interpreter/OptionValueRegex.cpp | 2 +- lldb/source/Interpreter/ScriptInterpreter.cpp | 2 +- .../Language/CPlusPlus/BlockPointer.cpp | 2 +- .../Plugins/Platform/Android/AdbClient.cpp | 8 +- .../PlatformAndroidRemoteGDBServer.cpp | 4 +- ...PlatformiOSSimulatorCoreSimulatorSupport.h | 2 +- ...latformiOSSimulatorCoreSimulatorSupport.mm | 14 +- .../Plugins/Platform/POSIX/PlatformPOSIX.cpp | 4 +- .../Platform/Windows/PlatformWindows.cpp | 4 +- .../NativeRegisterContextDBReg_arm64.cpp | 10 +- .../Process/elf-core/ProcessElfCore.cpp | 2 +- .../gdb-remote/GDBRemoteCommunication.cpp | 2 +- .../GDBRemoteCommunicationClient.cpp | 2 +- .../GDBRemoteCommunicationServer.cpp | 2 +- .../GDBRemoteCommunicationServerLLGS.cpp | 8 +- .../GDBRemoteCommunicationServerPlatform.cpp | 2 +- .../Process/minidump/ProcessMinidump.cpp | 2 +- .../ScriptedProcessPythonInterface.cpp | 6 +- .../Interfaces/ScriptedPythonInterface.h | 10 +- .../Python/PythonDataObjects.cpp | 22 +- .../Python/ScriptInterpreterPython.cpp | 4 +- .../DarwinLog/StructuredDataDarwinLog.cpp | 2 +- .../Plugins/SymbolFile/DWARF/DWARFUnit.h | 2 +- .../SymbolFile/DWARF/SymbolFileDWARF.cpp | 2 +- .../DWARF/SymbolFileDWARFDebugMap.cpp | 2 +- lldb/source/Target/ModuleCache.cpp | 4 +- lldb/source/Target/Platform.cpp | 6 +- lldb/source/Target/Process.cpp | 45 +-- lldb/source/Target/StackFrame.cpp | 2 +- lldb/source/Target/Target.cpp | 12 +- lldb/source/Target/Thread.cpp | 3 +- lldb/source/Utility/Status.cpp | 262 +++++++++++++----- lldb/source/Utility/StructuredData.cpp | 2 +- .../Target/RemoteAwarePlatformTest.cpp | 9 +- .../Host/NativeProcessTestUtils.h | 4 +- lldb/unittests/Utility/StatusTest.cpp | 11 +- 81 files changed, 457 insertions(+), 319 deletions(-) diff --git a/lldb/bindings/python/python-swigsafecast.swig b/lldb/bindings/python/python-swigsafecast.swig index 34f8c6f0ff8d35..c46c247da87278 100644 --- a/lldb/bindings/python/python-swigsafecast.swig +++ b/lldb/bindings/python/python-swigsafecast.swig @@ -34,7 +34,7 @@ PythonObject SWIGBridge::ToSWIGWrapper(lldb::BreakpointSP breakpoint_sp) { } PythonObject SWIGBridge::ToSWIGWrapper(const Status& status) { - return ToSWIGHelper(new lldb::SBError(status), SWIGTYPE_p_lldb__SBError); + return ToSWIGHelper(new lldb::SBError(status.clone()), 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/Target/Process.h b/lldb/include/lldb/Target/Process.h index a7de991104434d..c66cfb2c245efd 100644 --- a/lldb/include/lldb/Target/Process.h +++ b/lldb/include/lldb/Target/Process.h @@ -1296,8 +1296,6 @@ class Process : public std::enable_shared_from_this<Process>, const EvaluateExpressionOptions &options, DiagnosticManager &diagnostic_manager); - static const char *ExecutionResultAsCString(lldb::ExpressionResults result); - void GetStatus(Stream &ostrm); size_t GetThreadStatus(Stream &ostrm, bool only_threads_with_stop_reason, diff --git a/lldb/include/lldb/Utility/Status.h b/lldb/include/lldb/Utility/Status.h index b304291ffae00e..ea53225a3450a3 100644 --- a/lldb/include/lldb/Utility/Status.h +++ b/lldb/include/lldb/Utility/Status.h @@ -26,6 +26,36 @@ class raw_ostream; namespace lldb_private { +class MachKernelError + : public llvm::ErrorInfo<MachKernelError, llvm::StringError> { +public: + using llvm::ErrorInfo<MachKernelError, llvm::StringError>::ErrorInfo; + MachKernelError(std::error_code ec, const llvm::Twine &msg = {}) + : ErrorInfo(msg, ec) {} + std::string message() const override; + static char ID; +}; + +class Win32Error : public llvm::ErrorInfo<Win32Error, llvm::StringError> { +public: + using llvm::ErrorInfo<Win32Error, llvm::StringError>::ErrorInfo; + Win32Error(std::error_code ec, const llvm::Twine &msg = {}) + : ErrorInfo(msg, ec) {} + std::string message() const override; + static char ID; +}; + +class ExpressionError + : public llvm::ErrorInfo<ExpressionError, llvm::StringError> { +public: + using llvm::ErrorInfo<ExpressionError, llvm::StringError>::ErrorInfo; + ExpressionError(std::error_code ec, std::string msg = {}) + : ErrorInfo(msg, ec) {} + static char ID; +}; + +const char *ExecutionResultAsCString(lldb::ExpressionResults result); + /// \class Status Status.h "lldb/Utility/Status.h" An error handling class. /// /// This class is designed to be able to hold any error code that can be @@ -41,13 +71,32 @@ namespace lldb_private { /// 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. /// @@ -79,9 +128,7 @@ class Status { } static Status FromExpressionError(lldb::ExpressionResults result, - std::string msg) { - return Status(result, lldb::eErrorTypeExpression, msg); - } + std::string msg); /// Set the current error to errno. /// @@ -91,10 +138,14 @@ class Status { ~Status(); - // llvm::Error support - explicit Status(llvm::Error error) { *this = std::move(error); } + /// Avoid using this in new code. Migrate APIs to llvm::Expected instead. + static Status FromError(llvm::Error &&error); const Status &operator=(llvm::Error error); + Status &operator=(Status &&); + /// FIXME: Replace this with a takeError() method. llvm::Error ToError() const; + /// Don't call this function in new code. Redesign the API instead. + Status clone() const { return Status(ToError()); } /// Get the error string associated with the current error. // @@ -145,11 +196,8 @@ class Status { bool Success() const; protected: - /// Status code as an integer value. - ValueType m_code = 0; - /// The type of the above error code. - lldb::ErrorType m_type = lldb::eErrorTypeInvalid; - /// A string representation of the error code. + Status(llvm::Error &&error) : m_error(std::move(error)) {} + mutable llvm::Error m_error; mutable std::string m_string; }; 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 72501570320d57..b21d7e67290073 100644 --- a/lldb/source/API/SBDebugger.cpp +++ b/lldb/source/API/SBDebugger.cpp @@ -220,7 +220,7 @@ lldb::SBError SBDebugger::InitializeWithErrorHandling() { SBError error; if (auto e = g_debugger_lifetime->Initialize( std::make_unique<SystemInitializerFull>(), LoadPlugin)) { - error.SetError(Status(std::move(e))); + error.SetError(Status::FromError(std::move(e))); } return error; } @@ -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..287fa6c499dd2f 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..10ed653500d9f8 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 e927cb854cd88c..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); } @@ -1658,7 +1658,7 @@ SBError SBTarget::SetLabel(const char *label) { if (!target_sp) return Status::FromErrorString("Couldn't get internal target object."); - return Status(target_sp->SetLabel(label)); + return Status::FromError(target_sp->SetLabel(label)); } uint32_t SBTarget::GetDataByteSize() { @@ -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..13400732488b5f 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..4dc981c75adf50 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..94a3d9c6d015da 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..ae05628f56c5f7 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/Commands/CommandObjectMemoryTag.cpp b/lldb/source/Commands/CommandObjectMemoryTag.cpp index f45d6eacab3d0e..bc76319018da96 100644 --- a/lldb/source/Commands/CommandObjectMemoryTag.cpp +++ b/lldb/source/Commands/CommandObjectMemoryTag.cpp @@ -77,7 +77,7 @@ class CommandObjectMemoryTagRead : public CommandObjectParsed { process->GetMemoryTagManager(); if (!tag_manager_or_err) { - result.SetError(Status(tag_manager_or_err.takeError())); + result.SetError(Status::FromError(tag_manager_or_err.takeError())); return; } @@ -102,7 +102,7 @@ class CommandObjectMemoryTagRead : public CommandObjectParsed { tag_manager->MakeTaggedRange(start_addr, end_addr, memory_regions); if (!tagged_range) { - result.SetError(Status(tagged_range.takeError())); + result.SetError(Status::FromError(tagged_range.takeError())); return; } @@ -110,7 +110,7 @@ class CommandObjectMemoryTagRead : public CommandObjectParsed { tagged_range->GetRangeBase(), tagged_range->GetByteSize()); if (!tags) { - result.SetError(Status(tags.takeError())); + result.SetError(Status::FromError(tags.takeError())); return; } @@ -230,7 +230,7 @@ class CommandObjectMemoryTagWrite : public CommandObjectParsed { process->GetMemoryTagManager(); if (!tag_manager_or_err) { - result.SetError(Status(tag_manager_or_err.takeError())); + result.SetError(Status::FromError(tag_manager_or_err.takeError())); return; } @@ -282,7 +282,7 @@ class CommandObjectMemoryTagWrite : public CommandObjectParsed { memory_regions); if (!tagged_range) { - result.SetError(Status(tagged_range.takeError())); + result.SetError(Status::FromError(tagged_range.takeError())); return; } 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/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp index fd5cb792c101a4..a5219025495a91 100644 --- a/lldb/source/Core/PluginManager.cpp +++ b/lldb/source/Core/PluginManager.cpp @@ -723,7 +723,7 @@ Status PluginManager::SaveCore(const lldb::ProcessSP &process_sp, llvm::Expected<bool> ret = process_sp->SaveCore(options.GetOutputFile()->GetPath()); if (!ret) - return Status(ret.takeError()); + return Status::FromError(ret.takeError()); if (ret.get()) return Status(); } diff --git a/lldb/source/Core/ThreadedCommunication.cpp b/lldb/source/Core/ThreadedCommunication.cpp index d8b567c9bd0de6..649ce71c293740 100644 --- a/lldb/source/Core/ThreadedCommunication.cpp +++ b/lldb/source/Core/ThreadedCommunication.cpp @@ -178,7 +178,7 @@ bool ThreadedCommunication::StartReadThread(Status *error_ptr) { m_read_thread = *maybe_thread; } else { if (error_ptr) - *error_ptr = Status(maybe_thread.takeError()); + *error_ptr = Status::FromError(maybe_thread.takeError()); else { LLDB_LOG_ERROR(GetLog(LLDBLog::Host), maybe_thread.takeError(), "failed to launch host thread: {0}"); diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp index d56bd004e63c7e..b057298b0b07d5 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..8a23bd1e1aab17 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..d7caaa54423a9a 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..369d5d00736585 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/DataFormatters/VectorType.cpp b/lldb/source/DataFormatters/VectorType.cpp index 19de204c24353a..f6c38f76fea31f 100644 --- a/lldb/source/DataFormatters/VectorType.cpp +++ b/lldb/source/DataFormatters/VectorType.cpp @@ -233,7 +233,7 @@ class VectorTypeSyntheticFrontEnd : public SyntheticChildrenFrontEnd { auto num_children_or_err = CalculateNumChildren(); if (!num_children_or_err) return ValueObjectConstResult::Create( - nullptr, Status(num_children_or_err.takeError())); + nullptr, Status::FromError(num_children_or_err.takeError())); if (idx >= *num_children_or_err) return {}; std::optional<uint64_t> size = m_child_type.GetByteSize(nullptr); diff --git a/lldb/source/Expression/FunctionCaller.cpp b/lldb/source/Expression/FunctionCaller.cpp index 5ac2b0681ebbec..bf5573d35f53e0 100644 --- a/lldb/source/Expression/FunctionCaller.cpp +++ b/lldb/source/Expression/FunctionCaller.cpp @@ -390,8 +390,7 @@ lldb::ExpressionResults FunctionCaller::ExecuteFunction( LLDB_LOGF(log, "== [FunctionCaller::ExecuteFunction] Execution of \"%s\" " "completed abnormally: %s ==", - m_name.c_str(), - Process::ExecutionResultAsCString(return_value)); + m_name.c_str(), ExecutionResultAsCString(return_value)); } else { LLDB_LOGF(log, "== [FunctionCaller::ExecuteFunction] Execution of \"%s\" " diff --git a/lldb/source/Expression/LLVMUserExpression.cpp b/lldb/source/Expression/LLVMUserExpression.cpp index b4fdfc4d1fa8ba..1f9ba1ece439ee 100644 --- a/lldb/source/Expression/LLVMUserExpression.cpp +++ b/lldb/source/Expression/LLVMUserExpression.cpp @@ -235,9 +235,9 @@ LLVMUserExpression::DoExecute(DiagnosticManager &diagnostic_manager, expr_thread_id); return execution_result; } else if (execution_result != lldb::eExpressionCompleted) { - diagnostic_manager.Printf( - lldb::eSeverityError, "Couldn't execute function; result was %s", - Process::ExecutionResultAsCString(execution_result)); + diagnostic_manager.Printf(lldb::eSeverityError, + "Couldn't execute function; result was %s", + ExecutionResultAsCString(execution_result)); return execution_result; } } diff --git a/lldb/source/Expression/Materializer.cpp b/lldb/source/Expression/Materializer.cpp index fa0edad1fa583f..a3617e6e2dca62 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 d3b9dde368db09..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 & @@ -350,7 +350,7 @@ Status NativeProcessProtocol::SetSoftwareBreakpoint(lldb::addr_t addr, } auto expected_bkpt = EnableSoftwareBreakpoint(addr, size_hint); if (!expected_bkpt) - return Status(expected_bkpt.takeError()); + return Status::FromError(expected_bkpt.takeError()); m_software_breakpoints.emplace(addr, std::move(*expected_bkpt)); return Status(); diff --git a/lldb/source/Host/common/TCPSocket.cpp b/lldb/source/Host/common/TCPSocket.cpp index fc005814308d90..dfe7280842c900 100644 --- a/lldb/source/Host/common/TCPSocket.cpp +++ b/lldb/source/Host/common/TCPSocket.cpp @@ -156,7 +156,7 @@ Status TCPSocket::Connect(llvm::StringRef name) { Status error; llvm::Expected<HostAndPort> host_port = DecodeHostAndPort(name); if (!host_port) - return Status(host_port.takeError()); + return Status::FromError(host_port.takeError()); std::vector<SocketAddress> addresses = SocketAddress::GetAddressInfo(host_port->hostname.c_str(), nullptr, @@ -195,7 +195,7 @@ Status TCPSocket::Listen(llvm::StringRef name, int backlog) { Status error; llvm::Expected<HostAndPort> host_port = DecodeHostAndPort(name); if (!host_port) - return Status(host_port.takeError()); + return Status::FromError(host_port.takeError()); if (host_port->hostname == "*") host_port->hostname = "0.0.0.0"; diff --git a/lldb/source/Host/macosx/objcxx/Host.mm b/lldb/source/Host/macosx/objcxx/Host.mm index 94a2b916574c64..fe63cc16c64990 100644 --- a/lldb/source/Host/macosx/objcxx/Host.mm +++ b/lldb/source/Host/macosx/objcxx/Host.mm @@ -316,7 +316,7 @@ repeat with the_window in (get windows)\n\ unix_socket_name, [&] { return AcceptPIDFromInferior(connect_url); }); if (!accept_thread) - return Status(accept_thread.takeError()); + return Status::FromError(accept_thread.takeError()); [applescript executeAndReturnError:nil]; diff --git a/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp b/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp index 6a40f66be39b18..f89246fc080aae 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..663d0e0883d26e 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/OptionValueRegex.cpp b/lldb/source/Interpreter/OptionValueRegex.cpp index d810df503f589f..91ec41df6ee507 100644 --- a/lldb/source/Interpreter/OptionValueRegex.cpp +++ b/lldb/source/Interpreter/OptionValueRegex.cpp @@ -51,7 +51,7 @@ Status OptionValueRegex::SetValueFromString(llvm::StringRef value, m_value_was_set = true; NotifyValueChanged(); } else if (llvm::Error err = m_regex.GetError()) { - return Status(std::move(err)); + return Status::FromError(std::move(err)); } else { return Status::FromErrorString("regex error"); } diff --git a/lldb/source/Interpreter/ScriptInterpreter.cpp b/lldb/source/Interpreter/ScriptInterpreter.cpp index 079ab9044de63a..df27d3f61180ea 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/Language/CPlusPlus/BlockPointer.cpp b/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp index 2c9b3c425397a0..f3c137d99703bf 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp @@ -114,7 +114,7 @@ class BlockPointerSyntheticFrontEnd : public SyntheticChildrenFrontEnd { if (!child_type_or_err) return ValueObjectConstResult::Create( exe_ctx.GetBestExecutionContextScope(), - Status(child_type_or_err.takeError())); + Status::FromError(child_type_or_err.takeError())); CompilerType child_type = *child_type_or_err; ValueObjectSP struct_pointer_sp = 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..d3d8f0db4add9c 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 2825db6e3a6b55..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() {} @@ -408,7 +408,7 @@ static Status HandleFileAction(ProcessLaunchInfo &launch_info, launch_info.GetPTY().GetSecondaryFileDescriptor(); if (secondary_fd == PseudoTerminal::invalid_fd) { if (llvm::Error Err = launch_info.GetPTY().OpenSecondary(O_RDWR)) - return Status(std::move(Err)); + return Status::FromError(std::move(Err)); } secondary_fd = launch_info.GetPTY().GetSecondaryFileDescriptor(); assert(secondary_fd != PseudoTerminal::invalid_fd); @@ -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..d62390b2d32d41 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..1bffeebe8080a8 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/Process/Utility/NativeRegisterContextDBReg_arm64.cpp b/lldb/source/Plugins/Process/Utility/NativeRegisterContextDBReg_arm64.cpp index 4bec3de586685e..f1d0756b3ed9c5 100644 --- a/lldb/source/Plugins/Process/Utility/NativeRegisterContextDBReg_arm64.cpp +++ b/lldb/source/Plugins/Process/Utility/NativeRegisterContextDBReg_arm64.cpp @@ -172,7 +172,7 @@ Status NativeRegisterContextDBReg_arm64::ClearAllHardwareBreakpoints() { // Read hardware breakpoint and watchpoint information. llvm::Error error = ReadHardwareDebugInfo(); if (error) - return Status(std::move(error)); + return Status::FromError(std::move(error)); for (uint32_t i = 0; i < m_max_hbp_supported; i++) { if (BreakpointIsEnabled(i)) { @@ -191,7 +191,7 @@ Status NativeRegisterContextDBReg_arm64::ClearAllHardwareBreakpoints() { m_hbp_regs[i].control = tempControl; m_hbp_regs[i].address = tempAddr; - return Status(std::move(error)); + return Status::FromError(std::move(error)); } } } @@ -356,7 +356,7 @@ Status NativeRegisterContextDBReg_arm64::ClearAllHardwareWatchpoints() { // Read hardware breakpoint and watchpoint information. llvm::Error error = ReadHardwareDebugInfo(); if (error) - return Status(std::move(error)); + return Status::FromError(std::move(error)); for (uint32_t i = 0; i < m_max_hwp_supported; i++) { if (WatchpointIsEnabled(i)) { @@ -375,7 +375,7 @@ Status NativeRegisterContextDBReg_arm64::ClearAllHardwareWatchpoints() { m_hwp_regs[i].control = tempControl; m_hwp_regs[i].address = tempAddr; - return Status(std::move(error)); + return Status::FromError(std::move(error)); } } } @@ -420,7 +420,7 @@ Status NativeRegisterContextDBReg_arm64::GetWatchpointHitIndex( // Read hardware breakpoint and watchpoint information. llvm::Error error = ReadHardwareDebugInfo(); if (error) - return Status(std::move(error)); + return Status::FromError(std::move(error)); // Mask off ignored bits from watchpoint trap address. trap_addr = FixWatchpointHitAddress(trap_addr); diff --git a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp index 0e8407fc46edf6..7955594bf5d94c 100644 --- a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp +++ b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp @@ -194,7 +194,7 @@ Status ProcessElfCore::DoLoadCore() { // Parse thread contexts and auxv structure if (H.p_type == llvm::ELF::PT_NOTE) { if (llvm::Error error = ParseThreadContextsFromNoteSegment(H, data)) - return Status(std::move(error)); + return Status::FromError(std::move(error)); } // PT_LOAD segments contains address map if (H.p_type == llvm::ELF::PT_LOAD) { diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp index 50fa11e916c5f5..1f1e5113468798 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp @@ -847,7 +847,7 @@ Status GDBRemoteCommunication::StartListenThread(const char *hostname, llvm::Expected<HostThread> listen_thread = ThreadLauncher::LaunchThread( listen_url, [this] { return GDBRemoteCommunication::ListenThread(); }); if (!listen_thread) - return Status(listen_thread.takeError()); + return Status::FromError(listen_thread.takeError()); m_listen_thread = *listen_thread; return Status(); diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp index 0297fe363f69e1..5c8e0cc5feda13 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp @@ -1743,7 +1743,7 @@ Status GDBRemoteCommunicationClient::LoadQXferMemoryMap() { llvm::Expected<std::string> xml = ReadExtFeature("memory-map", ""); if (!xml) - return Status(xml.takeError()); + return Status::FromError(xml.takeError()); XMLDocument xml_document; diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.cpp index 9d08a5d3411f14..9b72cb00352821 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.cpp @@ -123,7 +123,7 @@ GDBRemoteCommunicationServer::SendErrorResponse(llvm::Error error) { [&](std::unique_ptr<llvm::ErrorInfoBase> E) { EIB = std::move(E); }); if (EIB) - return SendErrorResponse(Status(llvm::Error(std::move(EIB)))); + return SendErrorResponse(Status::FromError(llvm::Error(std::move(EIB)))); return SendUnimplementedResponse(""); } diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp index 504c994f980cff..35fa93e53bc66f 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp @@ -277,7 +277,7 @@ Status GDBRemoteCommunicationServerLLGS::LaunchProcess() { // lldb-server on Windows. #if !defined(_WIN32) if (llvm::Error Err = m_process_launch_info.SetUpPtyRedirection()) - return Status(std::move(Err)); + return Status::FromError(std::move(Err)); #endif } @@ -287,7 +287,7 @@ Status GDBRemoteCommunicationServerLLGS::LaunchProcess() { "process but one already exists"); auto process_or = m_process_manager.Launch(m_process_launch_info, *this); if (!process_or) - return Status(process_or.takeError()); + return Status::FromError(process_or.takeError()); m_continue_process = m_current_process = process_or->get(); m_debugged_processes.emplace( m_current_process->GetID(), @@ -356,7 +356,7 @@ Status GDBRemoteCommunicationServerLLGS::AttachToProcess(lldb::pid_t pid) { // Try to attach. auto process_or = m_process_manager.Attach(pid, *this); if (!process_or) { - Status status(process_or.takeError()); + Status status = Status::FromError(process_or.takeError()); llvm::errs() << llvm::formatv("failed to attach to process {0}: {1}\n", pid, status); return status; @@ -1367,7 +1367,7 @@ GDBRemoteCommunicationServerLLGS::Handle_jLLDBTraceGetBinaryData( llvm::json::parse<TraceGetBinaryDataRequest>(packet.Peek(), "TraceGetBinaryDataRequest"); if (!request) - return SendErrorResponse(Status(request.takeError())); + return SendErrorResponse(Status::FromError(request.takeError())); if (Expected<std::vector<uint8_t>> bytes = m_current_process->TraceGetBinaryData(*request)) { diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp index 30e782e3be1846..2f2750ec2b9209 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerPlatform.cpp @@ -167,7 +167,7 @@ Status GDBRemoteCommunicationServerPlatform::LaunchGDBServer( if (available_port) port = *available_port; else - return Status(available_port.takeError()); + return Status::FromError(available_port.takeError()); } // Spawn a new thread to accept the port that gets bound after binding to diff --git a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp index 7a326a557547df..ac1ecbfc0e2e70 100644 --- a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp +++ b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp @@ -186,7 +186,7 @@ void ProcessMinidump::Terminate() { Status ProcessMinidump::DoLoadCore() { auto expected_parser = MinidumpParser::Create(m_core_data); if (!expected_parser) - return Status(expected_parser.takeError()); + return Status::FromError(expected_parser.takeError()); m_minidump_parser = std::move(*expected_parser); Status error; 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 cbb6cd41aa867e..cc14815fb15c97 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h @@ -269,7 +269,7 @@ class ScriptedPythonInterface : virtual public ScriptedInterface { transformed_args); if (llvm::Error e = expected_return_object.takeError()) { - error = Status(std::move(e)); + error = Status::FromError(std::move(e)); return ErrorWithMessage<T>(caller_signature, "Python method could not be called.", error); } @@ -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/PythonDataObjects.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp index ce14b531ea29c3..24cf3430006329 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp @@ -1105,7 +1105,7 @@ template <typename Base> class OwnedPythonFile : public Base { if (!m_borrowed) { auto r = m_py_obj.CallMethod("close"); if (!r) - py_error = Status(r.takeError()); + py_error = Status::FromError(r.takeError()); } base_error = Base::Close(); if (py_error.Fail()) @@ -1196,7 +1196,7 @@ class PythonIOFile : public OwnedPythonFile<File> { return Flush(); auto r = m_py_obj.CallMethod("close"); if (!r) - return Status(r.takeError()); + return Status::FromError(r.takeError()); return Status(); } @@ -1204,7 +1204,7 @@ class PythonIOFile : public OwnedPythonFile<File> { GIL takeGIL; auto r = m_py_obj.CallMethod("flush"); if (!r) - return Status(r.takeError()); + return Status::FromError(r.takeError()); return Status(); } @@ -1240,12 +1240,12 @@ class BinaryPythonFile : public PythonIOFile { PyObject *pybuffer_p = PyMemoryView_FromMemory( const_cast<char *>((const char *)buf), num_bytes, PyBUF_READ); if (!pybuffer_p) - return Status(llvm::make_error<PythonException>()); + return Status::FromError(llvm::make_error<PythonException>()); auto pybuffer = Take<PythonObject>(pybuffer_p); num_bytes = 0; auto bytes_written = As<long long>(m_py_obj.CallMethod("write", pybuffer)); if (!bytes_written) - return Status(bytes_written.takeError()); + return Status::FromError(bytes_written.takeError()); if (bytes_written.get() < 0) return Status::FromErrorString( ".write() method returned a negative number!"); @@ -1260,7 +1260,7 @@ class BinaryPythonFile : public PythonIOFile { auto pybuffer_obj = m_py_obj.CallMethod("read", (unsigned long long)num_bytes); if (!pybuffer_obj) - return Status(pybuffer_obj.takeError()); + return Status::FromError(pybuffer_obj.takeError()); num_bytes = 0; if (pybuffer_obj.get().IsNone()) { // EOF @@ -1269,7 +1269,7 @@ class BinaryPythonFile : public PythonIOFile { } auto pybuffer = PythonBuffer::Create(pybuffer_obj.get()); if (!pybuffer) - return Status(pybuffer.takeError()); + return Status::FromError(pybuffer.takeError()); memcpy(buf, pybuffer.get().get().buf, pybuffer.get().get().len); num_bytes = pybuffer.get().get().len; return Status(); @@ -1295,12 +1295,12 @@ class TextPythonFile : public PythonIOFile { auto pystring = PythonString::FromUTF8(llvm::StringRef((const char *)buf, num_bytes)); if (!pystring) - return Status(pystring.takeError()); + return Status::FromError(pystring.takeError()); num_bytes = 0; auto bytes_written = As<long long>(m_py_obj.CallMethod("write", pystring.get())); if (!bytes_written) - return Status(bytes_written.takeError()); + return Status::FromError(bytes_written.takeError()); if (bytes_written.get() < 0) return Status::FromErrorString( ".write() method returned a negative number!"); @@ -1321,14 +1321,14 @@ class TextPythonFile : public PythonIOFile { auto pystring = As<PythonString>( m_py_obj.CallMethod("read", (unsigned long long)num_chars)); if (!pystring) - return Status(pystring.takeError()); + return Status::FromError(pystring.takeError()); if (pystring.get().IsNone()) { // EOF return Status(); } auto stringref = pystring.get().AsUTF8(); if (!stringref) - return Status(stringref.takeError()); + return Status::FromError(stringref.takeError()); num_bytes = stringref.get().size(); memcpy(buf, stringref.get().begin(), num_bytes); return Status(); diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp index 76f2640a3ea692..82c4273c891bea 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp @@ -1110,7 +1110,7 @@ Status ScriptInterpreterPythonImpl::ExecuteMultipleLines( options.GetEnableIO(), m_debugger, /*result=*/nullptr); if (!io_redirect_or_error) - return Status(io_redirect_or_error.takeError()); + return Status::FromError(io_redirect_or_error.takeError()); ScriptInterpreterIORedirect &io_redirect = **io_redirect_or_error; @@ -1144,7 +1144,7 @@ Status ScriptInterpreterPythonImpl::ExecuteMultipleLines( E.Restore(); return error; }); - return Status(std::move(error)); + return Status::FromError(std::move(error)); } return Status(); diff --git a/lldb/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.cpp b/lldb/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.cpp index 1137f24451d28b..4ca8bd2f9085df 100644 --- a/lldb/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.cpp +++ b/lldb/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.cpp @@ -289,7 +289,7 @@ class RegexFilterRule : public FilterRule { // Instantiate the regex so we can report any errors. auto regex = RegularExpression(op_arg); if (llvm::Error err = regex.GetError()) { - error = Status(std::move(err)); + error = Status::FromError(std::move(err)); return FilterRuleSP(); } 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..567d72e7f2464e 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..640be9ac274964 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 ce009f9b2fafe4..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; @@ -166,7 +166,7 @@ ModuleLock::ModuleLock(const FileSpec &root_dir_spec, const UUID &uuid, m_file_up = std::move(file.get()); else { m_file_up.reset(); - error = Status(file.takeError()); + error = Status::FromError(file.takeError()); return; } diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp index b65a27dedc0814..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; @@ -1131,7 +1131,7 @@ Status Platform::PutFile(const FileSpec &source, const FileSpec &destination, auto source_file = FileSystem::Instance().Open(source, source_open_options, lldb::eFilePermissionsUserRW); if (!source_file) - return Status(source_file.takeError()); + return Status::FromError(source_file.takeError()); Status error; bool requires_upload = true; @@ -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 ae64f6f261bad7..2c4edd92def47c 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -2174,7 +2174,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; @@ -2185,10 +2184,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; } @@ -5741,43 +5741,6 @@ Process::RunThreadPlan(ExecutionContext &exe_ctx, return return_value; } -const char *Process::ExecutionResultAsCString(ExpressionResults result) { - const char *result_name = "<unknown>"; - - switch (result) { - case eExpressionCompleted: - result_name = "eExpressionCompleted"; - break; - case eExpressionDiscarded: - result_name = "eExpressionDiscarded"; - break; - case eExpressionInterrupted: - result_name = "eExpressionInterrupted"; - break; - case eExpressionHitBreakpoint: - result_name = "eExpressionHitBreakpoint"; - break; - case eExpressionSetupError: - result_name = "eExpressionSetupError"; - break; - case eExpressionParseError: - result_name = "eExpressionParseError"; - break; - case eExpressionResultUnavailable: - result_name = "eExpressionResultUnavailable"; - break; - case eExpressionTimedOut: - result_name = "eExpressionTimedOut"; - break; - case eExpressionStoppedForDebug: - result_name = "eExpressionStoppedForDebug"; - break; - case eExpressionThreadVanished: - result_name = "eExpressionThreadVanished"; - } - return result_name; -} - void Process::GetStatus(Stream &strm) { const StateType state = GetState(); if (StateIsStoppedState(state, false)) { @@ -6484,13 +6447,13 @@ Status Process::WriteMemoryTags(lldb::addr_t addr, size_t len, llvm::Expected<const MemoryTagManager *> tag_manager_or_err = GetMemoryTagManager(); if (!tag_manager_or_err) - return Status(tag_manager_or_err.takeError()); + return Status::FromError(tag_manager_or_err.takeError()); const MemoryTagManager *tag_manager = *tag_manager_or_err; llvm::Expected<std::vector<uint8_t>> packed_tags = tag_manager->PackTags(tags); if (!packed_tags) { - return Status(packed_tags.takeError()); + return Status::FromError(packed_tags.takeError()); } return DoWriteMemoryTags(addr, len, tag_manager->GetAllocationTagType(), diff --git a/lldb/source/Target/StackFrame.cpp b/lldb/source/Target/StackFrame.cpp index e35a4c318d358f..9c7cd3250c34ea 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/Target/Thread.cpp b/lldb/source/Target/Thread.cpp index 899e822851d81d..902fbb2b519ef7 100644 --- a/lldb/source/Target/Thread.cpp +++ b/lldb/source/Target/Thread.cpp @@ -2078,7 +2078,8 @@ lldb::ValueObjectSP Thread::GetSiginfoValue() { llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>> data = GetSiginfo(*type_size); if (!data) - return ValueObjectConstResult::Create(&target, Status(data.takeError())); + return ValueObjectConstResult::Create(&target, + Status::FromError(data.takeError())); DataExtractor data_extractor{data.get()->getBufferStart(), data.get()->getBufferSize(), process_sp->GetByteOrder(), arch.GetAddressByteSize()}; diff --git a/lldb/source/Utility/Status.cpp b/lldb/source/Utility/Status.cpp index 7260b7b3e0a03e..378df6186358db 100644 --- a/lldb/source/Utility/Status.cpp +++ b/lldb/source/Utility/Status.cpp @@ -8,9 +8,11 @@ #include "lldb/Utility/Status.h" +#include "lldb/Utility/LLDBLog.h" +#include "lldb/Utility/Log.h" #include "lldb/Utility/VASPrintf.h" -#include "lldb/lldb-defines.h" #include "lldb/lldb-enumerations.h" +#include "lldblldb-defines.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Errno.h" @@ -37,49 +39,79 @@ class raw_ostream; using namespace lldb; using namespace lldb_private; -Status::Status() {} +char MachKernelError::ID; +char Win32Error::ID; +char ExpressionError::ID; + +namespace { +/// A std::error_code category for eErrorTypeGeneric. +class GenericCategory : public std::error_category { + const char *name() const override { return "LLDBGenericCategory"; } + std::string message(int __ev) const override { return "generic LLDB error"; }; +}; +GenericCategory &generic_category() { + static GenericCategory g_generic_category; + return g_generic_category; +} + +/// A std::error_code category for eErrorTypeExpression. +class ExpressionCategory : public std::error_category { + const char *name() const override { return "LLDBExpressionCategory"; } + std::string message(int __ev) const override { + return ExecutionResultAsCString(static_cast<lldb::ExpressionResults>(__ev)); + }; +}; +ExpressionCategory &expression_category() { + static ExpressionCategory g_expression_category; + return g_expression_category; +} +} // namespace + +Status::Status() : m_error(llvm::Error::success()) {} + +static llvm::Error ErrorFromEnums(Status::ValueType err, ErrorType type, + std::string msg) { + switch (type) { + case eErrorTypeMachKernel: + return llvm::make_error<MachKernelError>( + std::error_code(err, std::system_category()), msg); + case eErrorTypePOSIX: + return llvm::errorCodeToError( + std::error_code(err, std::generic_category())); + case eErrorTypeWin32: + return llvm::make_error<Win32Error>( + std::error_code(err, std::system_category()), msg); + default: + return llvm::createStringError(std::move(msg), + std::error_code(err, generic_category())); + } +} Status::Status(ValueType err, ErrorType type, std::string msg) - : m_code(err), m_type(type), m_string(std::move(msg)) {} + : m_error(ErrorFromEnums(err, type, msg)) {} -// This logic is confusing because c++ calls the traditional (posix) errno codes +// This logic is confusing because C++ calls the traditional (posix) errno codes // "generic errors", while we use the term "generic" to mean completely // arbitrary (text-based) errors. Status::Status(std::error_code EC) - : m_code(EC.value()), - m_type(EC.category() == std::generic_category() ? eErrorTypePOSIX - : eErrorTypeGeneric), - m_string(EC.message()) {} + : m_error(!EC ? llvm::Error::success() + : (EC.category() == std::generic_category() + ? llvm::errorCodeToError(EC) + : llvm::createStringError(EC, "generic error"))) {} Status::Status(std::string err_str) - : m_code(LLDB_GENERIC_ERROR), m_type(eErrorTypeGeneric), - m_string(std::move(err_str)) {} + : m_error( + llvm::createStringError(llvm::inconvertibleErrorCode(), err_str)) {} const Status &Status::operator=(llvm::Error error) { - if (!error) { - Clear(); - return *this; - } - - // if the error happens to be a errno error, preserve the error code - error = llvm::handleErrors( - std::move(error), [&](std::unique_ptr<llvm::ECError> e) -> llvm::Error { - std::error_code ec = e->convertToErrorCode(); - if (ec.category() == std::generic_category()) { - m_code = ec.value(); - m_type = ErrorType::eErrorTypePOSIX; - return llvm::Error::success(); - } - return llvm::Error(std::move(e)); - }); - - // Otherwise, just preserve the message - if (error) { - m_code = LLDB_GENERIC_ERROR; - m_type = eErrorTypeGeneric; - m_string = llvm::toString(std::move(error)); - } + Clear(); + m_error = std::move(error); + return *this; +} +Status &Status::operator=(Status &&other) { + Clear(); + m_error = std::move(other.m_error); return *this; } @@ -96,16 +128,54 @@ Status Status::FromErrorStringWithFormat(const char *format, ...) { return Status(string); } -llvm::Error Status::ToError() const { - if (Success()) +Status Status::FromExpressionError(lldb::ExpressionResults result, + std::string msg) { + return Status(llvm::make_error<ExpressionError>( + std::error_code(result, expression_category()), msg)); +} + +/// Creates a deep copy of all known errors and converts all other +/// errors to a new llvm::StringError. +static llvm::Error cloneError(llvm::Error &error) { + std::vector<std::unique_ptr<llvm::ErrorInfoBase>> info; + llvm::visitErrors(error, [&](const llvm::ErrorInfoBase &error) { + if (error.isA<MachKernelError>()) + info.push_back( + std::make_unique<MachKernelError>(error.convertToErrorCode())); + else if (error.isA<Win32Error>()) + info.push_back(std::make_unique<Win32Error>(error.convertToErrorCode())); + else if (error.isA<ExpressionError>()) + info.push_back(std::make_unique<ExpressionError>( + error.convertToErrorCode(), error.message())); + else + info.push_back(std::make_unique<llvm::StringError>( + error.message(), error.convertToErrorCode(), true)); + }); + if (info.size() == 0) return llvm::Error::success(); - if (m_type == ErrorType::eErrorTypePOSIX) - return llvm::errorCodeToError( - std::error_code(m_code, std::generic_category())); - return llvm::createStringError(AsCString()); + llvm::Error e(std::move(info.front())); + for (auto it = std::next(info.begin()); it != info.end(); ++it) + e = llvm::joinErrors(std::move(e), llvm::Error(std::move(*it))); + return e; +} + +Status Status::FromError(llvm::Error &&error) { + // FIXME: Existing clients assume that the conversion to Status + // consumes and destroys the error. Particularly the scripting + // bridge errors refer to python state that may no longer be + // available when converting the rror to a string later on in the + // Status object's lifetime. + // + // As a workaround, using cloneError() to convert all unknown errors + // to strings here. + llvm::Error clone = cloneError(error); + llvm::consumeError(std::move(error)); + return Status(std::move(clone)); } -Status::~Status() = default; +llvm::Error Status::ToError() const { return cloneError(m_error); } + +Status::~Status() { llvm::consumeError(std::move(m_error)); } #ifdef _WIN32 static std::string RetrieveWin32ErrorString(uint32_t error_code) { @@ -133,6 +203,21 @@ static std::string RetrieveWin32ErrorString(uint32_t error_code) { } #endif +std::string MachKernelError::message() const { +#if defined(__APPLE__) + if (const char *s = ::mach_error_string(convertToErrorCode().value())) + return s; +#endif + return "MachKernelError"; +} + +std::string Win32Error::message() const { +#if defined(_WIN32) + return RetrieveWin32ErrorString(convertToErrorCode().value()); +#endif + return "Win32Error"; +} + // Get the error value as a NULL C string. The error string will be fetched and // cached on demand. The cached error string value will remain until the error // value is changed or cleared. @@ -140,29 +225,8 @@ const char *Status::AsCString(const char *default_error_str) const { if (Success()) return nullptr; - if (m_string.empty()) { - switch (m_type) { - case eErrorTypeMachKernel: -#if defined(__APPLE__) - if (const char *s = ::mach_error_string(m_code)) - m_string.assign(s); -#endif - break; - - case eErrorTypePOSIX: - m_string = llvm::sys::StrError(m_code); - break; + m_string = llvm::toStringWithoutConsuming(m_error); - case eErrorTypeWin32: -#if defined(_WIN32) - m_string = RetrieveWin32ErrorString(m_code); -#endif - break; - - default: - break; - } - } if (m_string.empty()) { if (default_error_str) m_string.assign(default_error_str); @@ -174,29 +238,61 @@ const char *Status::AsCString(const char *default_error_str) const { // Clear the error and any cached error string that it might contain. void Status::Clear() { - m_code = 0; - m_type = eErrorTypeInvalid; - m_string.clear(); + if (m_error) + LLDB_LOG_ERRORV(GetLog(LLDBLog::API), std::move(m_error), + "dropping error {0}"); + m_error = llvm::Error::success(); + llvm::consumeError(std::move(m_error)); } // Access the error value. -Status::ValueType Status::GetError() const { return m_code; } +Status::ValueType Status::GetError() const { + Status::ValueType result = 0; + llvm::visitErrors(m_error, [&](const llvm::ErrorInfoBase &error) { + std::error_code ec = error.convertToErrorCode(); + if (ec.category() == std::generic_category() || + ec.category() == generic_category() || + ec.category() == expression_category()) + result = ec.value(); + else + result = 0xff; + }); + return result; +} // Access the error type. -ErrorType Status::GetType() const { return m_type; } +ErrorType Status::GetType() const { + ErrorType result = eErrorTypeInvalid; + llvm::visitErrors(m_error, [&](const llvm::ErrorInfoBase &error) { + if (error.isA<MachKernelError>()) + result = eErrorTypeMachKernel; + else if (error.isA<Win32Error>()) + result = eErrorTypeWin32; + else if (error.isA<ExpressionError>()) + result = eErrorTypeExpression; + else if (error.convertToErrorCode().category() == std::generic_category()) + result = eErrorTypePOSIX; + else if (error.convertToErrorCode().category() == generic_category() || + error.convertToErrorCode() == llvm::inconvertibleErrorCode()) + result = eErrorTypeGeneric; + else + result = eErrorTypeInvalid; + }); + return result; +} // Returns true if this object contains a value that describes an error or // otherwise non-success result. -bool Status::Fail() const { return m_code != 0; } +bool Status::Fail() const { return (bool)m_error; } Status Status::FromErrno() { // Update the error value to be "errno" and update the type to be "POSIX". - return Status(errno, eErrorTypePOSIX); + return Status(llvm::errorCodeToError(llvm::errnoAsErrorCode())); } // Returns true if the error code in this object is considered a successful // return value. -bool Status::Success() const { return m_code == 0; } +bool Status::Success() const { return !m_error; } void llvm::format_provider<lldb_private::Status>::format( const lldb_private::Status &error, llvm::raw_ostream &OS, @@ -204,3 +300,29 @@ void llvm::format_provider<lldb_private::Status>::format( llvm::format_provider<llvm::StringRef>::format(error.AsCString(), OS, Options); } + +const char *lldb_private::ExecutionResultAsCString(ExpressionResults result) { + switch (result) { + case eExpressionCompleted: + return "eExpressionCompleted"; + case eExpressionDiscarded: + return "eExpressionDiscarded"; + case eExpressionInterrupted: + return "eExpressionInterrupted"; + case eExpressionHitBreakpoint: + return "eExpressionHitBreakpoint"; + case eExpressionSetupError: + return "eExpressionSetupError"; + case eExpressionParseError: + return "eExpressionParseError"; + case eExpressionResultUnavailable: + return "eExpressionResultUnavailable"; + case eExpressionTimedOut: + return "eExpressionTimedOut"; + case eExpressionStoppedForDebug: + return "eExpressionStoppedForDebug"; + case eExpressionThreadVanished: + return "eExpressionThreadVanished"; + } + return "<unknown>"; +} diff --git a/lldb/source/Utility/StructuredData.cpp b/lldb/source/Utility/StructuredData.cpp index 5f9821b979c079..fb4f6920d62eb8 100644 --- a/lldb/source/Utility/StructuredData.cpp +++ b/lldb/source/Utility/StructuredData.cpp @@ -46,7 +46,7 @@ StructuredData::ParseJSONFromFile(const FileSpec &input_spec, Status &error) { json::parse(buffer_or_error.get()->getBuffer().str()); if (value) return ParseJSONValue(*value); - error = Status(value.takeError()); + error = Status::FromError(value.takeError()); return StructuredData::ObjectSP(); } diff --git a/lldb/unittests/Target/RemoteAwarePlatformTest.cpp b/lldb/unittests/Target/RemoteAwarePlatformTest.cpp index d7810b20af95d5..82c68a8ca2d5ca 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) { @@ -80,8 +80,9 @@ TEST_F(RemoteAwarePlatformTest, TestResolveExecutabelOnClientByPlatform) { static const ArchSpec process_host_arch; EXPECT_CALL(platform, GetSupportedArchitectures(process_host_arch)) .WillRepeatedly(Return(std::vector<ArchSpec>())); + Status success; 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)); diff --git a/lldb/unittests/TestingSupport/Host/NativeProcessTestUtils.h b/lldb/unittests/TestingSupport/Host/NativeProcessTestUtils.h index a610b37a6b38e3..1a017122411a83 100644 --- a/lldb/unittests/TestingSupport/Host/NativeProcessTestUtils.h +++ b/lldb/unittests/TestingSupport/Host/NativeProcessTestUtils.h @@ -75,7 +75,7 @@ template <typename T> class MockProcess : public T { auto ExpectedMemory = this->ReadMemory(Addr, Size); if (!ExpectedMemory) { BytesRead = 0; - return Status(ExpectedMemory.takeError()); + return Status::FromError(ExpectedMemory.takeError()); } BytesRead = ExpectedMemory->size(); assert(BytesRead <= Size); @@ -89,7 +89,7 @@ template <typename T> class MockProcess : public T { Addr, llvm::ArrayRef(static_cast<const uint8_t *>(Buf), Size)); if (!ExpectedBytes) { BytesWritten = 0; - return Status(ExpectedBytes.takeError()); + return Status::FromError(ExpectedBytes.takeError()); } BytesWritten = *ExpectedBytes; return Status(); diff --git a/lldb/unittests/Utility/StatusTest.cpp b/lldb/unittests/Utility/StatusTest.cpp index d33909ea897275..1d275ebfaab605 100644 --- a/lldb/unittests/Utility/StatusTest.cpp +++ b/lldb/unittests/Utility/StatusTest.cpp @@ -27,15 +27,15 @@ TEST(StatusTest, Formatv) { } TEST(StatusTest, ErrorConstructor) { - EXPECT_TRUE(Status(llvm::Error::success()).Success()); + EXPECT_TRUE(Status::FromError(llvm::Error::success()).Success()); - Status eagain( + Status eagain = Status::FromError( llvm::errorCodeToError(std::error_code(EAGAIN, std::generic_category()))); EXPECT_TRUE(eagain.Fail()); EXPECT_EQ(eErrorTypePOSIX, eagain.GetType()); EXPECT_EQ(Status::ValueType(EAGAIN), eagain.GetError()); - Status foo(llvm::make_error<llvm::StringError>( + Status foo = Status::FromError(llvm::make_error<llvm::StringError>( "foo", llvm::inconvertibleErrorCode())); EXPECT_TRUE(foo.Fail()); EXPECT_EQ(eErrorTypeGeneric, foo.GetType()); @@ -52,6 +52,11 @@ TEST(StatusTest, ErrorCodeConstructor) { EXPECT_TRUE(eagain.Fail()); EXPECT_EQ(eErrorTypePOSIX, eagain.GetType()); EXPECT_EQ(Status::ValueType(EAGAIN), eagain.GetError()); + + llvm::Error list = llvm::joinErrors(llvm::createStringError("foo"), + llvm::createStringError("bar")); + Status foobar = Status::FromError(std::move(list)); + EXPECT_EQ(std::string("foo\nbar"), std::string(foobar.AsCString())); } TEST(StatusTest, ErrorConversion) { _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits