llvm-project/lldb/source/Interpreter/CommandReturnObject.cpp
Greg Clayton c7bece56fa <rdar://problem/13069948>
Major fixed to allow reading files that are over 4GB. The main problems were that the DataExtractor was using 32 bit offsets as a data cursor, and since we mmap all of our object files we could run into cases where if we had a very large core file that was over 4GB, we were running into the 4GB boundary.

So I defined a new "lldb::offset_t" which should be used for all file offsets.

After making this change, I enabled warnings for data loss and for enexpected implicit conversions temporarily and found a ton of things that I fixed.

Any functions that take an index internally, should use "size_t" for any indexes and also should return "size_t" for any sizes of collections.

llvm-svn: 173463
2013-01-25 18:06:21 +00:00

210 lines
4.8 KiB
C++

//===-- CommandReturnObject.cpp ---------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "lldb/Interpreter/CommandReturnObject.h"
// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/Core/Error.h"
#include "lldb/Core/StreamString.h"
using namespace lldb;
using namespace lldb_private;
static void
DumpStringToStreamWithNewline (Stream &strm, const std::string &s, bool add_newline_if_empty)
{
bool add_newline = false;
if (s.empty())
{
add_newline = add_newline_if_empty;
}
else
{
// We already checked for empty above, now make sure there is a newline
// in the error, and if there isn't one, add one.
strm.Write(s.c_str(), s.size());
const char last_char = *s.rbegin();
add_newline = last_char != '\n' && last_char != '\r';
}
if (add_newline)
strm.EOL();
}
CommandReturnObject::CommandReturnObject () :
m_out_stream (),
m_err_stream (),
m_status (eReturnStatusStarted),
m_did_change_process_state (false)
{
}
CommandReturnObject::~CommandReturnObject ()
{
}
void
CommandReturnObject::AppendErrorWithFormat (const char *format, ...)
{
if (!format)
return;
va_list args;
va_start (args, format);
StreamString sstrm;
sstrm.PrintfVarArg(format, args);
va_end (args);
const std::string &s = sstrm.GetString();
if (!s.empty())
{
Stream &error_strm = GetErrorStream();
error_strm.PutCString ("error: ");
DumpStringToStreamWithNewline (error_strm, s, false);
}
}
void
CommandReturnObject::AppendMessageWithFormat (const char *format, ...)
{
if (!format)
return;
va_list args;
va_start (args, format);
StreamString sstrm;
sstrm.PrintfVarArg(format, args);
va_end (args);
GetOutputStream().Printf("%s", sstrm.GetData());
}
void
CommandReturnObject::AppendWarningWithFormat (const char *format, ...)
{
if (!format)
return;
va_list args;
va_start (args, format);
StreamString sstrm;
sstrm.PrintfVarArg(format, args);
va_end (args);
GetErrorStream().Printf("warning: %s", sstrm.GetData());
}
void
CommandReturnObject::AppendMessage (const char *in_string)
{
if (!in_string || *in_string == '\0')
return;
GetOutputStream().Printf("%s\n", in_string);
}
void
CommandReturnObject::AppendWarning (const char *in_string)
{
if (!in_string || *in_string == '\0')
return;
GetErrorStream().Printf("warning: %s\n", in_string);
}
// Similar to AppendWarning, but do not prepend 'warning: ' to message, and
// don't append "\n" to the end of it.
void
CommandReturnObject::AppendRawWarning (const char *in_string)
{
if (in_string && in_string[0])
GetErrorStream().PutCString(in_string);
}
void
CommandReturnObject::AppendError (const char *in_string)
{
if (!in_string || *in_string == '\0')
return;
GetErrorStream().Printf ("error: %s\n", in_string);
}
void
CommandReturnObject::SetError (const Error &error, const char *fallback_error_cstr)
{
const char *error_cstr = error.AsCString();
if (error_cstr == NULL)
error_cstr = fallback_error_cstr;
AppendError (error_cstr);
SetStatus (eReturnStatusFailed);
}
// Similar to AppendError, but do not prepend 'Error: ' to message, and
// don't append "\n" to the end of it.
void
CommandReturnObject::AppendRawError (const char *in_string)
{
if (in_string && in_string[0])
GetErrorStream().PutCString(in_string);
}
void
CommandReturnObject::SetStatus (ReturnStatus status)
{
m_status = status;
}
ReturnStatus
CommandReturnObject::GetStatus ()
{
return m_status;
}
bool
CommandReturnObject::Succeeded ()
{
return m_status <= eReturnStatusSuccessContinuingResult;
}
bool
CommandReturnObject::HasResult ()
{
return (m_status == eReturnStatusSuccessFinishResult ||
m_status == eReturnStatusSuccessContinuingResult);
}
void
CommandReturnObject::Clear()
{
lldb::StreamSP stream_sp;
stream_sp = m_out_stream.GetStreamAtIndex (eStreamStringIndex);
if (stream_sp)
static_cast<StreamString *>(stream_sp.get())->Clear();
stream_sp = m_err_stream.GetStreamAtIndex (eStreamStringIndex);
if (stream_sp)
static_cast<StreamString *>(stream_sp.get())->Clear();
m_status = eReturnStatusStarted;
m_did_change_process_state = false;
}
bool
CommandReturnObject::GetDidChangeProcessState ()
{
return m_did_change_process_state;
}
void
CommandReturnObject::SetDidChangeProcessState (bool b)
{
m_did_change_process_state = b;
}