diff options
-rw-r--r-- | lldb/include/lldb/API/SBDebugger.h | 3 | ||||
-rw-r--r-- | lldb/include/lldb/Core/ValueObject.h | 6 | ||||
-rw-r--r-- | lldb/include/lldb/Core/ValueObjectRegister.h | 3 | ||||
-rw-r--r-- | lldb/include/lldb/Interpreter/CommandInterpreter.h | 7 | ||||
-rw-r--r-- | lldb/source/API/SBDebugger.cpp | 7 | ||||
-rw-r--r-- | lldb/source/API/SBError.cpp | 2 | ||||
-rw-r--r-- | lldb/source/API/SBValue.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Breakpoint/BreakpointSite.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Core/ValueObject.cpp | 159 | ||||
-rw-r--r-- | lldb/source/Core/ValueObjectChild.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Core/ValueObjectRegister.cpp | 18 | ||||
-rw-r--r-- | lldb/source/Interpreter/CommandInterpreter.cpp | 31 | ||||
-rw-r--r-- | lldb/source/Target/ThreadPlanCallFunction.cpp | 4 |
13 files changed, 151 insertions, 95 deletions
diff --git a/lldb/include/lldb/API/SBDebugger.h b/lldb/include/lldb/API/SBDebugger.h index 92ea113b57c..91486a03374 100644 --- a/lldb/include/lldb/API/SBDebugger.h +++ b/lldb/include/lldb/API/SBDebugger.h @@ -55,6 +55,9 @@ public: SkipLLDBInitFiles (bool b); void + SkipAppInitFiles (bool b); + + void SetInputFileHandle (FILE *f, bool transfer_ownership); void diff --git a/lldb/include/lldb/Core/ValueObject.h b/lldb/include/lldb/Core/ValueObject.h index 4df9e2a255c..f4c20d7e043 100644 --- a/lldb/include/lldb/Core/ValueObject.h +++ b/lldb/include/lldb/Core/ValueObject.h @@ -343,6 +343,9 @@ public: return m_update_point.GetExecutionContextScope(); } + void + SetNeedsUpdate (); + virtual ~ValueObject(); //------------------------------------------------------------------ @@ -543,9 +546,6 @@ public: DataExtractor & GetDataExtractor (); - bool - Write (); - lldb::ValueObjectSP GetSP () { diff --git a/lldb/include/lldb/Core/ValueObjectRegister.h b/lldb/include/lldb/Core/ValueObjectRegister.h index 22fc647d961..99af035afdd 100644 --- a/lldb/include/lldb/Core/ValueObjectRegister.h +++ b/lldb/include/lldb/Core/ValueObjectRegister.h @@ -156,6 +156,9 @@ public: virtual uint32_t CalculateNumChildren(); + + virtual bool + SetValueFromCString (const char *value_str); protected: virtual bool diff --git a/lldb/include/lldb/Interpreter/CommandInterpreter.h b/lldb/include/lldb/Interpreter/CommandInterpreter.h index c7f9643db01..8680c1dd3be 100644 --- a/lldb/include/lldb/Interpreter/CommandInterpreter.h +++ b/lldb/include/lldb/Interpreter/CommandInterpreter.h @@ -346,6 +346,12 @@ public: m_skip_lldbinit_files = skip_lldbinit_files; } + void + SkipAppInitFiles (bool skip_app_init_files) + { + m_skip_app_init_files = m_skip_lldbinit_files; + } + bool GetSynchronous (); @@ -433,6 +439,7 @@ private: ExecutionContext m_exe_ctx; // The current execution context to use when handling commands bool m_synchronous_execution; bool m_skip_lldbinit_files; + bool m_skip_app_init_files; CommandObject::CommandMap m_command_dict; // Stores basic built-in commands (they cannot be deleted, removed or overwritten). CommandObject::CommandMap m_alias_dict; // Stores user aliases/abbreviations for commands CommandObject::CommandMap m_user_dict; // Stores user-defined commands diff --git a/lldb/source/API/SBDebugger.cpp b/lldb/source/API/SBDebugger.cpp index 35a66ae55d0..827892453a0 100644 --- a/lldb/source/API/SBDebugger.cpp +++ b/lldb/source/API/SBDebugger.cpp @@ -149,6 +149,13 @@ SBDebugger::SkipLLDBInitFiles (bool b) m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b); } +void +SBDebugger::SkipAppInitFiles (bool b) +{ + if (m_opaque_sp) + m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b); +} + // Shouldn't really be settable after initialization as this could cause lots of problems; don't want users // trying to switch modes in the middle of a debugging session. void diff --git a/lldb/source/API/SBError.cpp b/lldb/source/API/SBError.cpp index bcbb734cea7..d4827175761 100644 --- a/lldb/source/API/SBError.cpp +++ b/lldb/source/API/SBError.cpp @@ -86,7 +86,7 @@ bool SBError::Success () const { LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - bool ret_value = false; + bool ret_value = true; if (m_opaque_ap.get()) ret_value = m_opaque_ap->Success(); diff --git a/lldb/source/API/SBValue.cpp b/lldb/source/API/SBValue.cpp index 58eb9794729..a7bc91d958a 100644 --- a/lldb/source/API/SBValue.cpp +++ b/lldb/source/API/SBValue.cpp @@ -629,6 +629,7 @@ SBValue::GetValueForExpressionPath(const char* expr_path) int64_t SBValue::GetValueAsSigned(SBError& error, int64_t fail_value) { + error.Clear(); if (m_opaque_sp) { if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) @@ -650,6 +651,7 @@ SBValue::GetValueAsSigned(SBError& error, int64_t fail_value) uint64_t SBValue::GetValueAsUnsigned(SBError& error, uint64_t fail_value) { + error.Clear(); if (m_opaque_sp) { if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) diff --git a/lldb/source/Breakpoint/BreakpointSite.cpp b/lldb/source/Breakpoint/BreakpointSite.cpp index 1852fd2f5ae..40489c86ab8 100644 --- a/lldb/source/Breakpoint/BreakpointSite.cpp +++ b/lldb/source/Breakpoint/BreakpointSite.cpp @@ -95,7 +95,7 @@ void BreakpointSite::GetDescription (Stream *s, lldb::DescriptionLevel level) { if (level != lldb::eDescriptionLevelBrief) - s->Printf ("breakpoint site: %d ", GetID()); + s->Printf ("breakpoint site: %d at 0x%8.8llx", GetID(), GetLoadAddress()); m_owners.GetDescription (s, level); } diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp index 46feb995573..e02dda7f7e3 100644 --- a/lldb/source/Core/ValueObject.cpp +++ b/lldb/source/Core/ValueObject.cpp @@ -252,6 +252,15 @@ ValueObject::UpdateFormatsIfNeeded(lldb::DynamicValueType use_dynamic) } } +void +ValueObject::SetNeedsUpdate () +{ + m_update_point.SetNeedsUpdate(); + // We have to clear the value string here so ConstResult children will notice if their values are + // changed by hand (i.e. with SetValueAsCString). + m_value_str.clear(); +} + DataExtractor & ValueObject::GetDataExtractor () { @@ -338,7 +347,8 @@ ValueObject::ResolveValue (Scalar &scalar) ExecutionContextScope *exe_scope = GetExecutionContextScope(); if (exe_scope) exe_scope->CalculateExecutionContext(exe_ctx); - scalar = m_value.ResolveValue(&exe_ctx, GetClangAST ()); + Value tmp_value(m_value); + scalar = tmp_value.ResolveValue(&exe_ctx, GetClangAST ()); return scalar.IsValid(); } else @@ -1220,104 +1230,83 @@ ValueObject::SetValueFromCString (const char *value_str) uint32_t count = 0; lldb::Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count); - char *end = NULL; const size_t byte_size = GetByteSize(); - switch (encoding) - { - case eEncodingInvalid: - return false; - case eEncodingUint: - if (byte_size > sizeof(unsigned long long)) - { - return false; - } - else + Value::ValueType value_type = m_value.GetValueType(); + + if (value_type == Value::eValueTypeScalar) + { + // If the value is already a scalar, then let the scalar change itself: + m_value.GetScalar().SetValueFromCString (value_str, encoding, byte_size); + } + else if (byte_size <= Scalar::GetMaxByteSize()) + { + // If the value fits in a scalar, then make a new scalar and again let the + // scalar code do the conversion, then figure out where to put the new value. + Scalar new_scalar; + Error error; + error = new_scalar.SetValueFromCString (value_str, encoding, byte_size); + if (error.Success()) { - unsigned long long ull_val = strtoull(value_str, &end, 0); - if (end && *end != '\0') - return false; - Value::ValueType value_type = m_value.GetValueType(); switch (value_type) { - case Value::eValueTypeLoadAddress: - case Value::eValueTypeHostAddress: - // The value in these cases lives in the data. So update the data: - - break; - case Value::eValueTypeScalar: - m_value.GetScalar() = ull_val; + case Value::eValueTypeLoadAddress: + { + // If it is a load address, then the scalar value is the storage location + // of the data, and we have to shove this value down to that load location. + ProcessSP process_sp = GetUpdatePoint().GetProcessSP(); + if (process_sp) + { + lldb::addr_t target_addr = m_value.GetScalar().GetRawBits64(LLDB_INVALID_ADDRESS); + size_t bytes_written = process_sp->WriteScalarToMemory (target_addr, + new_scalar, + byte_size, + error); + if (!error.Success() || bytes_written != byte_size) + return false; + } + } break; - case Value::eValueTypeFileAddress: - // Try to convert the file address to a load address and then write the new value there. + case Value::eValueTypeHostAddress: + { + // If it is a host address, then we stuff the scalar as a DataBuffer into the Value's data. + DataExtractor new_data; + new_data.SetByteOrder (m_data.GetByteOrder()); + + DataBufferSP buffer_sp (new DataBufferHeap(byte_size, 0)); + m_data.SetData(buffer_sp, 0); + bool success = new_scalar.GetData(new_data); + if (success) + { + new_data.CopyByteOrderedData(0, + byte_size, + const_cast<uint8_t *>(m_data.GetDataStart()), + byte_size, + m_data.GetByteOrder()); + } + m_value.GetScalar() = (uintptr_t)m_data.GetDataStart(); + + } break; + case Value::eValueTypeFileAddress: + case Value::eValueTypeScalar: + break; } - // Limit the bytes in our m_data appropriately. - m_value.GetScalar().GetData (m_data, byte_size); - } - break; - - case eEncodingSint: - if (byte_size > sizeof(long long)) - { - return false; } else { - long long sll_val = strtoll(value_str, &end, 0); - if (end && *end != '\0') - return false; - m_value.GetScalar() = sll_val; - // Limit the bytes in our m_data appropriately. - m_value.GetScalar().GetData (m_data, byte_size); - } - break; - - case eEncodingIEEE754: - { - const off_t byte_offset = GetByteOffset(); - uint8_t *dst = const_cast<uint8_t *>(m_data.PeekData(byte_offset, byte_size)); - if (dst != NULL) - { - // We are decoding a float into host byte order below, so make - // sure m_data knows what it contains. - m_data.SetByteOrder(lldb::endian::InlHostByteOrder()); - const size_t converted_byte_size = ClangASTContext::ConvertStringToFloatValue ( - GetClangAST(), - GetClangType(), - value_str, - dst, - byte_size); - - if (converted_byte_size == byte_size) - { - } - } + return false; } - break; - - case eEncodingVector: - return false; - - default: + } + else + { + // We don't support setting things bigger than a scalar at present. return false; } - - // If we have made it here the value is in m_data and we should write it - // out to the target - return Write (); -} - -bool -ValueObject::Write () -{ - // Clear the update ID so the next time we try and read the value - // we try and read it again. - m_update_point.SetNeedsUpdate(); - - // TODO: when Value has a method to write a value back, call it from here. - return false; - + + // If we have reached this point, then we have successfully changed the value. + SetNeedsUpdate(); + return true; } lldb::LanguageType diff --git a/lldb/source/Core/ValueObjectChild.cpp b/lldb/source/Core/ValueObjectChild.cpp index 2ded7b50e82..989386eea68 100644 --- a/lldb/source/Core/ValueObjectChild.cpp +++ b/lldb/source/Core/ValueObjectChild.cpp @@ -150,7 +150,7 @@ ValueObjectChild::UpdateValue () else { // Set this object's scalar value to the address of its - // value be adding its byte offset to the parent address + // value by adding its byte offset to the parent address m_value.GetScalar() += GetByteOffset(); } } diff --git a/lldb/source/Core/ValueObjectRegister.cpp b/lldb/source/Core/ValueObjectRegister.cpp index 203347e8816..f25652791d2 100644 --- a/lldb/source/Core/ValueObjectRegister.cpp +++ b/lldb/source/Core/ValueObjectRegister.cpp @@ -385,4 +385,22 @@ ValueObjectRegister::UpdateValue () return false; } +bool +ValueObjectRegister::SetValueFromCString (const char *value_str) +{ + // The new value will be in the m_data. Copy that into our register value. + Error error = m_reg_value.SetValueFromCString (&m_reg_info, value_str); + if (error.Success()) + { + if (m_reg_ctx_sp->WriteRegister (&m_reg_info, m_reg_value)) + { + SetNeedsUpdate(); + return true; + } + else + return false; + } + else + return false; +} diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp index 5d6792804af..0b77607906e 100644 --- a/lldb/source/Interpreter/CommandInterpreter.cpp +++ b/lldb/source/Interpreter/CommandInterpreter.cpp @@ -68,6 +68,7 @@ CommandInterpreter::CommandInterpreter m_debugger (debugger), m_synchronous_execution (synchronous_execution), m_skip_lldbinit_files (false), + m_skip_app_init_files (false), m_script_interpreter_ap (), m_comment_char ('#'), m_repeat_char ('!'), @@ -1762,11 +1763,37 @@ void CommandInterpreter::SourceInitFile (bool in_cwd, CommandReturnObject &result) { // Don't parse any .lldbinit files if we were asked not to - if (m_skip_lldbinit_files) + if (m_skip_lldbinit_files && m_skip_app_init_files) return; const char *init_file_path = in_cwd ? "./.lldbinit" : "~/.lldbinit"; - FileSpec init_file (init_file_path, true); + + std::string app_specific_init; + + if (!m_skip_app_init_files) + { + FileSpec host_spec = Host::GetProgramFileSpec(); + const char *host_name = host_spec.GetFilename().AsCString(); + + if (host_name != NULL && strcmp (host_name, "lldb") != 0) + { + app_specific_init += init_file_path; + app_specific_init += "-"; + app_specific_init += host_name; + } + } + + FileSpec init_file; + if (!app_specific_init.empty()) + { + init_file.SetFile (app_specific_init.c_str(), true); + } + + if (!m_skip_lldbinit_files && !init_file.Exists()) + { + init_file.SetFile (init_file_path, true); + } + // If the file exists, tell HandleCommand to 'source' it; this will do the actual broadcasting // of the commands back to any appropriate listener (see CommandObjectSource::Execute for more details). diff --git a/lldb/source/Target/ThreadPlanCallFunction.cpp b/lldb/source/Target/ThreadPlanCallFunction.cpp index b1d859ee7cf..583ff43d0cc 100644 --- a/lldb/source/Target/ThreadPlanCallFunction.cpp +++ b/lldb/source/Target/ThreadPlanCallFunction.cpp @@ -45,6 +45,7 @@ ThreadPlanCallFunction::ThreadPlanCallFunction (Thread &thread, ThreadPlan (ThreadPlan::eKindCallFunction, "Call function plan", thread, eVoteNoOpinion, eVoteNoOpinion), m_valid (false), m_stop_other_threads (stop_other_threads), + m_function_addr (function), m_function_sp (NULL), m_process (thread.GetProcess()), m_thread (thread), @@ -108,7 +109,6 @@ ThreadPlanCallFunction::ThreadPlanCallFunction (Thread &thread, // Now set the thread state to "no reason" so we don't run with whatever signal was outstanding... thread.SetStopInfoToNothing(); - m_function_addr = function; addr_t FunctionLoadAddr = m_function_addr.GetLoadAddress(&target); if (this_arg && cmd_arg) @@ -161,6 +161,7 @@ ThreadPlanCallFunction::ThreadPlanCallFunction (Thread &thread, ThreadPlan (ThreadPlan::eKindCallFunction, "Call function plan", thread, eVoteNoOpinion, eVoteNoOpinion), m_valid (false), m_stop_other_threads (stop_other_threads), + m_function_addr (function), m_function_sp(NULL), m_process (thread.GetProcess()), m_thread (thread), @@ -224,7 +225,6 @@ ThreadPlanCallFunction::ThreadPlanCallFunction (Thread &thread, // Now set the thread state to "no reason" so we don't run with whatever signal was outstanding... thread.SetStopInfoToNothing(); - m_function_addr = function; addr_t FunctionLoadAddr = m_function_addr.GetLoadAddress(&target); if (!abi->PrepareTrivialCall (thread, |