teak-llvm/lldb/source/Target/ThreadPlanCallUserExpression.cpp
Adrian Prantl 05097246f3 Reflow paragraphs in comments.
This is intended as a clean up after the big clang-format commit
(r280751), which unfortunately resulted in many of the comment
paragraphs in LLDB being very hard to read.

FYI, the script I used was:

import textwrap
import commands
import os
import sys
import re
tmp = "%s.tmp"%sys.argv[1]
out = open(tmp, "w+")
with open(sys.argv[1], "r") as f:
  header = ""
  text = ""
  comment = re.compile(r'^( *//) ([^ ].*)$')
  special = re.compile(r'^((([A-Z]+[: ])|([0-9]+ )).*)|(.*;)$')
  for line in f:
      match = comment.match(line)
      if match and not special.match(match.group(2)):
          # skip intentionally short comments.
          if not text and len(match.group(2)) < 40:
              out.write(line)
              continue

          if text:
              text += " " + match.group(2)
          else:
              header = match.group(1)
              text = match.group(2)

          continue

      if text:
          filled = textwrap.wrap(text, width=(78-len(header)),
                                 break_long_words=False)
          for l in filled:
              out.write(header+" "+l+'\n')
              text = ""

      out.write(line)

os.rename(tmp, sys.argv[1])

Differential Revision: https://reviews.llvm.org/D46144

llvm-svn: 331197
2018-04-30 16:49:04 +00:00

127 lines
4.0 KiB
C++

//===-- ThreadPlanCallUserExpression.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/Target/ThreadPlanCallUserExpression.h"
// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/Breakpoint/Breakpoint.h"
#include "lldb/Breakpoint/BreakpointLocation.h"
#include "lldb/Core/Address.h"
#include "lldb/Expression/DiagnosticManager.h"
#include "lldb/Expression/IRDynamicChecks.h"
#include "lldb/Expression/UserExpression.h"
#include "lldb/Host/HostInfo.h"
#include "lldb/Target/LanguageRuntime.h"
#include "lldb/Target/Process.h"
#include "lldb/Target/RegisterContext.h"
#include "lldb/Target/StopInfo.h"
#include "lldb/Target/Target.h"
#include "lldb/Target/Thread.h"
#include "lldb/Target/ThreadPlanRunToAddress.h"
#include "lldb/Utility/Log.h"
#include "lldb/Utility/Stream.h"
using namespace lldb;
using namespace lldb_private;
//----------------------------------------------------------------------
// ThreadPlanCallUserExpression: Plan to call a single function
//----------------------------------------------------------------------
ThreadPlanCallUserExpression::ThreadPlanCallUserExpression(
Thread &thread, Address &function, llvm::ArrayRef<lldb::addr_t> args,
const EvaluateExpressionOptions &options,
lldb::UserExpressionSP &user_expression_sp)
: ThreadPlanCallFunction(thread, function, CompilerType(), args, options),
m_user_expression_sp(user_expression_sp) {
// User expressions are generally "User generated" so we should set them up
// to stop when done.
SetIsMasterPlan(true);
SetOkayToDiscard(false);
}
ThreadPlanCallUserExpression::~ThreadPlanCallUserExpression() {}
void ThreadPlanCallUserExpression::GetDescription(
Stream *s, lldb::DescriptionLevel level) {
if (level == eDescriptionLevelBrief)
s->Printf("User Expression thread plan");
else
ThreadPlanCallFunction::GetDescription(s, level);
}
void ThreadPlanCallUserExpression::DidPush() {
ThreadPlanCallFunction::DidPush();
if (m_user_expression_sp)
m_user_expression_sp->WillStartExecuting();
}
void ThreadPlanCallUserExpression::WillPop() {
ThreadPlanCallFunction::WillPop();
if (m_user_expression_sp)
m_user_expression_sp.reset();
}
bool ThreadPlanCallUserExpression::MischiefManaged() {
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_STEP));
if (IsPlanComplete()) {
if (log)
log->Printf("ThreadPlanCallFunction(%p): Completed call function plan.",
static_cast<void *>(this));
if (m_manage_materialization && PlanSucceeded() && m_user_expression_sp) {
lldb::addr_t function_stack_top;
lldb::addr_t function_stack_bottom;
lldb::addr_t function_stack_pointer = GetFunctionStackPointer();
function_stack_bottom = function_stack_pointer - HostInfo::GetPageSize();
function_stack_top = function_stack_pointer;
DiagnosticManager diagnostics;
ExecutionContext exe_ctx(GetThread());
m_user_expression_sp->FinalizeJITExecution(
diagnostics, exe_ctx, m_result_var_sp, function_stack_bottom,
function_stack_top);
}
ThreadPlan::MischiefManaged();
return true;
} else {
return false;
}
}
StopInfoSP ThreadPlanCallUserExpression::GetRealStopInfo() {
StopInfoSP stop_info_sp = ThreadPlanCallFunction::GetRealStopInfo();
if (stop_info_sp) {
lldb::addr_t addr = GetStopAddress();
DynamicCheckerFunctions *checkers =
m_thread.GetProcess()->GetDynamicCheckers();
StreamString s;
if (checkers && checkers->DoCheckersExplainStop(addr, s))
stop_info_sp->SetDescription(s.GetData());
}
return stop_info_sp;
}
void ThreadPlanCallUserExpression::DoTakedown(bool success) {
ThreadPlanCallFunction::DoTakedown(success);
m_user_expression_sp->DidFinishExecuting();
}