@jimingham You had suggested to @clayborg that we should call DidFork(), DidVFork() and DidVForkDone() after a corresponding stop in expression evaluation. Those functions require parameters that are private to the specific child StopInfo class. I went with reusing the existing StopInfo::PerformAction() virtual function, rather than create a new one just for this purpose.
311 lines
8.1 KiB
C++
311 lines
8.1 KiB
C++
//===-- SBExpressionOptions.cpp -------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/API/SBExpressionOptions.h"
|
|
#include "Utils.h"
|
|
#include "lldb/API/SBError.h"
|
|
#include "lldb/API/SBStream.h"
|
|
#include "lldb/Target/Target.h"
|
|
#include "lldb/Utility/Instrumentation.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
SBExpressionOptions::SBExpressionOptions()
|
|
: m_opaque_up(new EvaluateExpressionOptions()) {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
}
|
|
|
|
SBExpressionOptions::SBExpressionOptions(const SBExpressionOptions &rhs) {
|
|
LLDB_INSTRUMENT_VA(this, rhs);
|
|
|
|
m_opaque_up = clone(rhs.m_opaque_up);
|
|
}
|
|
|
|
const SBExpressionOptions &SBExpressionOptions::
|
|
operator=(const SBExpressionOptions &rhs) {
|
|
LLDB_INSTRUMENT_VA(this, rhs);
|
|
|
|
if (this != &rhs)
|
|
m_opaque_up = clone(rhs.m_opaque_up);
|
|
return *this;
|
|
}
|
|
|
|
SBExpressionOptions::~SBExpressionOptions() = default;
|
|
|
|
bool SBExpressionOptions::GetCoerceResultToId() const {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->DoesCoerceToId();
|
|
}
|
|
|
|
void SBExpressionOptions::SetCoerceResultToId(bool coerce) {
|
|
LLDB_INSTRUMENT_VA(this, coerce);
|
|
|
|
m_opaque_up->SetCoerceToId(coerce);
|
|
}
|
|
|
|
bool SBExpressionOptions::GetUnwindOnError() const {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->DoesUnwindOnError();
|
|
}
|
|
|
|
void SBExpressionOptions::SetUnwindOnError(bool unwind) {
|
|
LLDB_INSTRUMENT_VA(this, unwind);
|
|
|
|
m_opaque_up->SetUnwindOnError(unwind);
|
|
}
|
|
|
|
bool SBExpressionOptions::GetIgnoreBreakpoints() const {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->DoesIgnoreBreakpoints();
|
|
}
|
|
|
|
void SBExpressionOptions::SetIgnoreBreakpoints(bool ignore) {
|
|
LLDB_INSTRUMENT_VA(this, ignore);
|
|
|
|
m_opaque_up->SetIgnoreBreakpoints(ignore);
|
|
}
|
|
|
|
lldb::DynamicValueType SBExpressionOptions::GetFetchDynamicValue() const {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->GetUseDynamic();
|
|
}
|
|
|
|
void SBExpressionOptions::SetFetchDynamicValue(lldb::DynamicValueType dynamic) {
|
|
LLDB_INSTRUMENT_VA(this, dynamic);
|
|
|
|
m_opaque_up->SetUseDynamic(dynamic);
|
|
}
|
|
|
|
uint32_t SBExpressionOptions::GetTimeoutInMicroSeconds() const {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->GetTimeout() ? m_opaque_up->GetTimeout()->count() : 0;
|
|
}
|
|
|
|
void SBExpressionOptions::SetTimeoutInMicroSeconds(uint32_t timeout) {
|
|
LLDB_INSTRUMENT_VA(this, timeout);
|
|
|
|
m_opaque_up->SetTimeout(timeout == 0 ? Timeout<std::micro>(std::nullopt)
|
|
: std::chrono::microseconds(timeout));
|
|
}
|
|
|
|
uint32_t SBExpressionOptions::GetOneThreadTimeoutInMicroSeconds() const {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->GetOneThreadTimeout()
|
|
? m_opaque_up->GetOneThreadTimeout()->count()
|
|
: 0;
|
|
}
|
|
|
|
void SBExpressionOptions::SetOneThreadTimeoutInMicroSeconds(uint32_t timeout) {
|
|
LLDB_INSTRUMENT_VA(this, timeout);
|
|
|
|
m_opaque_up->SetOneThreadTimeout(timeout == 0
|
|
? Timeout<std::micro>(std::nullopt)
|
|
: std::chrono::microseconds(timeout));
|
|
}
|
|
|
|
bool SBExpressionOptions::GetTryAllThreads() const {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->GetTryAllThreads();
|
|
}
|
|
|
|
void SBExpressionOptions::SetTryAllThreads(bool run_others) {
|
|
LLDB_INSTRUMENT_VA(this, run_others);
|
|
|
|
m_opaque_up->SetTryAllThreads(run_others);
|
|
}
|
|
|
|
bool SBExpressionOptions::GetStopOthers() const {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->GetStopOthers();
|
|
}
|
|
|
|
void SBExpressionOptions::SetStopOthers(bool run_others) {
|
|
LLDB_INSTRUMENT_VA(this, run_others);
|
|
|
|
m_opaque_up->SetStopOthers(run_others);
|
|
}
|
|
|
|
bool SBExpressionOptions::GetTrapExceptions() const {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->GetTrapExceptions();
|
|
}
|
|
|
|
void SBExpressionOptions::SetTrapExceptions(bool trap_exceptions) {
|
|
LLDB_INSTRUMENT_VA(this, trap_exceptions);
|
|
|
|
m_opaque_up->SetTrapExceptions(trap_exceptions);
|
|
}
|
|
|
|
bool SBExpressionOptions::GetStopOnFork() const {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->GetStopOnFork();
|
|
}
|
|
|
|
void SBExpressionOptions::SetStopOnFork(bool stop_on_fork) {
|
|
LLDB_INSTRUMENT_VA(this, stop_on_fork);
|
|
|
|
m_opaque_up->SetStopOnFork(stop_on_fork);
|
|
}
|
|
|
|
void SBExpressionOptions::SetLanguage(lldb::LanguageType language) {
|
|
LLDB_INSTRUMENT_VA(this, language);
|
|
|
|
m_opaque_up->SetLanguage(language);
|
|
}
|
|
|
|
void SBExpressionOptions::SetLanguage(lldb::SBSourceLanguageName name,
|
|
uint32_t version) {
|
|
LLDB_INSTRUMENT_VA(this, name, version);
|
|
|
|
m_opaque_up->SetLanguage(name, version);
|
|
}
|
|
|
|
void SBExpressionOptions::SetCancelCallback(
|
|
lldb::ExpressionCancelCallback callback, void *baton) {
|
|
LLDB_INSTRUMENT_VA(this, callback, baton);
|
|
|
|
m_opaque_up->SetCancelCallback(callback, baton);
|
|
}
|
|
|
|
bool SBExpressionOptions::GetGenerateDebugInfo() {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->GetGenerateDebugInfo();
|
|
}
|
|
|
|
void SBExpressionOptions::SetGenerateDebugInfo(bool b) {
|
|
LLDB_INSTRUMENT_VA(this, b);
|
|
|
|
return m_opaque_up->SetGenerateDebugInfo(b);
|
|
}
|
|
|
|
bool SBExpressionOptions::GetSuppressPersistentResult() {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->GetSuppressPersistentResult();
|
|
}
|
|
|
|
void SBExpressionOptions::SetSuppressPersistentResult(bool b) {
|
|
LLDB_INSTRUMENT_VA(this, b);
|
|
|
|
return m_opaque_up->SetSuppressPersistentResult(b);
|
|
}
|
|
|
|
const char *SBExpressionOptions::GetPrefix() const {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return ConstString(m_opaque_up->GetPrefix()).GetCString();
|
|
}
|
|
|
|
void SBExpressionOptions::SetPrefix(const char *prefix) {
|
|
LLDB_INSTRUMENT_VA(this, prefix);
|
|
|
|
return m_opaque_up->SetPrefix(prefix);
|
|
}
|
|
|
|
bool SBExpressionOptions::GetAutoApplyFixIts() {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->GetAutoApplyFixIts();
|
|
}
|
|
|
|
void SBExpressionOptions::SetAutoApplyFixIts(bool b) {
|
|
LLDB_INSTRUMENT_VA(this, b);
|
|
|
|
return m_opaque_up->SetAutoApplyFixIts(b);
|
|
}
|
|
|
|
uint64_t SBExpressionOptions::GetRetriesWithFixIts() {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->GetRetriesWithFixIts();
|
|
}
|
|
|
|
void SBExpressionOptions::SetRetriesWithFixIts(uint64_t retries) {
|
|
LLDB_INSTRUMENT_VA(this, retries);
|
|
|
|
return m_opaque_up->SetRetriesWithFixIts(retries);
|
|
}
|
|
|
|
bool SBExpressionOptions::GetTopLevel() {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->GetExecutionPolicy() == eExecutionPolicyTopLevel;
|
|
}
|
|
|
|
void SBExpressionOptions::SetTopLevel(bool b) {
|
|
LLDB_INSTRUMENT_VA(this, b);
|
|
|
|
m_opaque_up->SetExecutionPolicy(b ? eExecutionPolicyTopLevel
|
|
: m_opaque_up->default_execution_policy);
|
|
}
|
|
|
|
bool SBExpressionOptions::GetAllowJIT() {
|
|
LLDB_INSTRUMENT_VA(this);
|
|
|
|
return m_opaque_up->GetExecutionPolicy() != eExecutionPolicyNever;
|
|
}
|
|
|
|
void SBExpressionOptions::SetAllowJIT(bool allow) {
|
|
LLDB_INSTRUMENT_VA(this, allow);
|
|
|
|
m_opaque_up->SetExecutionPolicy(allow ? m_opaque_up->default_execution_policy
|
|
: eExecutionPolicyNever);
|
|
}
|
|
|
|
// FIXME: the language plugin should expression options dynamically and
|
|
// we should validate here (by asking the language plugin) that the options
|
|
// being set/retrieved are actually valid options.
|
|
|
|
bool SBExpressionOptions::GetBooleanLanguageOption(const char *option_name,
|
|
SBError &error) const {
|
|
LLDB_INSTRUMENT_VA(this, option_name, error);
|
|
|
|
error.Clear();
|
|
|
|
auto value_or_err = m_opaque_up->GetBooleanLanguageOption(option_name);
|
|
if (!value_or_err) {
|
|
error.SetErrorString(llvm::toString(value_or_err.takeError()).c_str());
|
|
return false;
|
|
}
|
|
|
|
return *value_or_err;
|
|
}
|
|
|
|
SBError SBExpressionOptions::SetBooleanLanguageOption(const char *option_name,
|
|
bool value) {
|
|
LLDB_INSTRUMENT_VA(this, option_name, value);
|
|
|
|
SBError error;
|
|
|
|
if (llvm::Error err =
|
|
m_opaque_up->SetBooleanLanguageOption(option_name, value))
|
|
error.SetErrorString(llvm::toString(std::move(err)).c_str());
|
|
|
|
return error;
|
|
}
|
|
|
|
EvaluateExpressionOptions *SBExpressionOptions::get() const {
|
|
return m_opaque_up.get();
|
|
}
|
|
|
|
EvaluateExpressionOptions &SBExpressionOptions::ref() const {
|
|
return *m_opaque_up;
|
|
}
|