Please use GitHub pull requests for new patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
source/Target/Target.cpp
Show First 20 Lines • Show All 2,113 Lines • ▼ Show 20 Lines | |||||
void Target::ImageSearchPathsChanged(const PathMappingList &path_list, | void Target::ImageSearchPathsChanged(const PathMappingList &path_list, | ||||
void *baton) { | void *baton) { | ||||
Target *target = (Target *)baton; | Target *target = (Target *)baton; | ||||
ModuleSP exe_module_sp(target->GetExecutableModule()); | ModuleSP exe_module_sp(target->GetExecutableModule()); | ||||
if (exe_module_sp) | if (exe_module_sp) | ||||
target->SetExecutableModule(exe_module_sp, eLoadDependentsYes); | target->SetExecutableModule(exe_module_sp, eLoadDependentsYes); | ||||
} | } | ||||
TypeSystem *Target::GetScratchTypeSystemForLanguage(Status *error, | llvm::Expected<TypeSystem &> | ||||
lldb::LanguageType language, | Target::GetScratchTypeSystemForLanguage(lldb::LanguageType language, | ||||
bool create_on_demand) { | bool create_on_demand) { | ||||
if (!m_valid) | if (!m_valid) | ||||
return nullptr; | return llvm::make_error<llvm::StringError>("Invalid Target", | ||||
llvm::inconvertibleErrorCode()); | |||||
if (error) { | |||||
error->Clear(); | |||||
} | |||||
if (language == eLanguageTypeMipsAssembler // GNU AS and LLVM use it for all | if (language == eLanguageTypeMipsAssembler // GNU AS and LLVM use it for all | ||||
// assembly code | // assembly code | ||||
|| language == eLanguageTypeUnknown) { | || language == eLanguageTypeUnknown) { | ||||
std::set<lldb::LanguageType> languages_for_types; | std::set<lldb::LanguageType> languages_for_types; | ||||
std::set<lldb::LanguageType> languages_for_expressions; | std::set<lldb::LanguageType> languages_for_expressions; | ||||
Language::GetLanguagesSupportingTypeSystems(languages_for_types, | Language::GetLanguagesSupportingTypeSystems(languages_for_types, | ||||
languages_for_expressions); | languages_for_expressions); | ||||
if (languages_for_expressions.count(eLanguageTypeC)) { | if (languages_for_expressions.count(eLanguageTypeC)) { | ||||
language = eLanguageTypeC; // LLDB's default. Override by setting the | language = eLanguageTypeC; // LLDB's default. Override by setting the | ||||
// target language. | // target language. | ||||
} else { | } else { | ||||
if (languages_for_expressions.empty()) { | if (languages_for_expressions.empty()) { | ||||
return nullptr; | return llvm::make_error<llvm::StringError>( | ||||
"No expression support for any languages", | |||||
llvm::inconvertibleErrorCode()); | |||||
} else { | } else { | ||||
language = *languages_for_expressions.begin(); | language = *languages_for_expressions.begin(); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
return m_scratch_type_system_map.GetTypeSystemForLanguage(language, this, | return m_scratch_type_system_map.GetTypeSystemForLanguage(language, this, | ||||
create_on_demand); | create_on_demand); | ||||
} | } | ||||
PersistentExpressionState * | PersistentExpressionState * | ||||
Target::GetPersistentExpressionStateForLanguage(lldb::LanguageType language) { | Target::GetPersistentExpressionStateForLanguage(lldb::LanguageType language) { | ||||
TypeSystem *type_system = | auto type_system_or_err = GetScratchTypeSystemForLanguage(language, true); | ||||
GetScratchTypeSystemForLanguage(nullptr, language, true); | |||||
if (type_system) { | if (auto err = type_system_or_err.takeError()) { | ||||
return type_system->GetPersistentExpressionState(); | LLDB_LOG_ERROR(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET), | ||||
} else { | std::move(err), | ||||
"Unable to get persistent expression state for language {}", | |||||
Language::GetNameForLanguageType(language)); | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
return type_system_or_err->GetPersistentExpressionState(); | |||||
} | } | ||||
UserExpression *Target::GetUserExpressionForLanguage( | UserExpression *Target::GetUserExpressionForLanguage( | ||||
llvm::StringRef expr, llvm::StringRef prefix, lldb::LanguageType language, | llvm::StringRef expr, llvm::StringRef prefix, lldb::LanguageType language, | ||||
Expression::ResultType desired_type, | Expression::ResultType desired_type, | ||||
const EvaluateExpressionOptions &options, ValueObject *ctx_obj, | const EvaluateExpressionOptions &options, ValueObject *ctx_obj, | ||||
Status &error) { | Status &error) { | ||||
Status type_system_error; | auto type_system_or_err = GetScratchTypeSystemForLanguage(language); | ||||
if (auto err = type_system_or_err.takeError()) { | |||||
TypeSystem *type_system = | |||||
GetScratchTypeSystemForLanguage(&type_system_error, language); | |||||
UserExpression *user_expr = nullptr; | |||||
if (!type_system) { | |||||
error.SetErrorStringWithFormat( | error.SetErrorStringWithFormat( | ||||
"Could not find type system for language %s: %s", | "Could not find type system for language %s: %s", | ||||
Language::GetNameForLanguageType(language), | Language::GetNameForLanguageType(language), | ||||
type_system_error.AsCString()); | llvm::toString(std::move(err)).c_str()); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
user_expr = type_system->GetUserExpression(expr, prefix, language, | auto *user_expr = type_system_or_err->GetUserExpression( | ||||
desired_type, options, ctx_obj); | expr, prefix, language, desired_type, options, ctx_obj); | ||||
if (!user_expr) | if (!user_expr) | ||||
error.SetErrorStringWithFormat( | error.SetErrorStringWithFormat( | ||||
"Could not create an expression for language %s", | "Could not create an expression for language %s", | ||||
Language::GetNameForLanguageType(language)); | Language::GetNameForLanguageType(language)); | ||||
return user_expr; | return user_expr; | ||||
} | } | ||||
FunctionCaller *Target::GetFunctionCallerForLanguage( | FunctionCaller *Target::GetFunctionCallerForLanguage( | ||||
lldb::LanguageType language, const CompilerType &return_type, | lldb::LanguageType language, const CompilerType &return_type, | ||||
const Address &function_address, const ValueList &arg_value_list, | const Address &function_address, const ValueList &arg_value_list, | ||||
const char *name, Status &error) { | const char *name, Status &error) { | ||||
Status type_system_error; | auto type_system_or_err = GetScratchTypeSystemForLanguage(language); | ||||
TypeSystem *type_system = | if (auto err = type_system_or_err.takeError()) { | ||||
GetScratchTypeSystemForLanguage(&type_system_error, language); | |||||
FunctionCaller *persistent_fn = nullptr; | |||||
if (!type_system) { | |||||
error.SetErrorStringWithFormat( | error.SetErrorStringWithFormat( | ||||
"Could not find type system for language %s: %s", | "Could not find type system for language %s: %s", | ||||
Language::GetNameForLanguageType(language), | Language::GetNameForLanguageType(language), | ||||
type_system_error.AsCString()); | llvm::toString(std::move(err)).c_str()); | ||||
return persistent_fn; | return nullptr; | ||||
} | } | ||||
persistent_fn = type_system->GetFunctionCaller(return_type, function_address, | auto *persistent_fn = type_system_or_err->GetFunctionCaller( | ||||
arg_value_list, name); | return_type, function_address, arg_value_list, name); | ||||
if (!persistent_fn) | if (!persistent_fn) | ||||
error.SetErrorStringWithFormat( | error.SetErrorStringWithFormat( | ||||
"Could not create an expression for language %s", | "Could not create an expression for language %s", | ||||
Language::GetNameForLanguageType(language)); | Language::GetNameForLanguageType(language)); | ||||
return persistent_fn; | return persistent_fn; | ||||
} | } | ||||
UtilityFunction * | UtilityFunction * | ||||
Target::GetUtilityFunctionForLanguage(const char *text, | Target::GetUtilityFunctionForLanguage(const char *text, | ||||
lldb::LanguageType language, | lldb::LanguageType language, | ||||
const char *name, Status &error) { | const char *name, Status &error) { | ||||
Status type_system_error; | auto type_system_or_err = GetScratchTypeSystemForLanguage(language); | ||||
TypeSystem *type_system = | |||||
GetScratchTypeSystemForLanguage(&type_system_error, language); | |||||
UtilityFunction *utility_fn = nullptr; | |||||
if (!type_system) { | if (auto err = type_system_or_err.takeError()) { | ||||
error.SetErrorStringWithFormat( | error.SetErrorStringWithFormat( | ||||
"Could not find type system for language %s: %s", | "Could not find type system for language %s: %s", | ||||
Language::GetNameForLanguageType(language), | Language::GetNameForLanguageType(language), | ||||
type_system_error.AsCString()); | llvm::toString(std::move(err)).c_str()); | ||||
return utility_fn; | return nullptr; | ||||
} | } | ||||
utility_fn = type_system->GetUtilityFunction(text, name); | auto *utility_fn = type_system_or_err->GetUtilityFunction(text, name); | ||||
if (!utility_fn) | if (!utility_fn) | ||||
error.SetErrorStringWithFormat( | error.SetErrorStringWithFormat( | ||||
"Could not create an expression for language %s", | "Could not create an expression for language %s", | ||||
Language::GetNameForLanguageType(language)); | Language::GetNameForLanguageType(language)); | ||||
return utility_fn; | return utility_fn; | ||||
} | } | ||||
ClangASTContext *Target::GetScratchClangASTContext(bool create_on_demand) { | ClangASTContext *Target::GetScratchClangASTContext(bool create_on_demand) { | ||||
if (m_valid) { | if (!m_valid) | ||||
if (TypeSystem *type_system = GetScratchTypeSystemForLanguage( | return nullptr; | ||||
nullptr, eLanguageTypeC, create_on_demand)) | |||||
return llvm::dyn_cast<ClangASTContext>(type_system); | auto type_system_or_err = | ||||
} | GetScratchTypeSystemForLanguage(eLanguageTypeC, create_on_demand); | ||||
if (auto err = type_system_or_err.takeError()) { | |||||
LLDB_LOG_ERROR(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET), | |||||
std::move(err), "Couldn't get scratch ClangASTContext"); | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
return llvm::dyn_cast<ClangASTContext>(&type_system_or_err.get()); | |||||
} | |||||
ClangASTImporterSP Target::GetClangASTImporter() { | ClangASTImporterSP Target::GetClangASTImporter() { | ||||
if (m_valid) { | if (m_valid) { | ||||
if (!m_ast_importer_sp) { | if (!m_ast_importer_sp) { | ||||
m_ast_importer_sp = std::make_shared<ClangASTImporter>(); | m_ast_importer_sp = std::make_shared<ClangASTImporter>(); | ||||
} | } | ||||
return m_ast_importer_sp; | return m_ast_importer_sp; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 76 Lines • ▼ Show 20 Lines | ExpressionResults Target::EvaluateExpression( | ||||
} else if (m_process_sp) { | } else if (m_process_sp) { | ||||
m_process_sp->CalculateExecutionContext(exe_ctx); | m_process_sp->CalculateExecutionContext(exe_ctx); | ||||
} else { | } else { | ||||
CalculateExecutionContext(exe_ctx); | CalculateExecutionContext(exe_ctx); | ||||
} | } | ||||
// Make sure we aren't just trying to see the value of a persistent variable | // Make sure we aren't just trying to see the value of a persistent variable | ||||
// (something like "$0") | // (something like "$0") | ||||
lldb::ExpressionVariableSP persistent_var_sp; | |||||
// Only check for persistent variables the expression starts with a '$' | // Only check for persistent variables the expression starts with a '$' | ||||
if (expr[0] == '$') | lldb::ExpressionVariableSP persistent_var_sp; | ||||
persistent_var_sp = GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC) | if (expr[0] == '$') { | ||||
->GetPersistentExpressionState() | auto type_system_or_err = | ||||
->GetVariable(expr); | GetScratchTypeSystemForLanguage(eLanguageTypeC); | ||||
if (auto err = type_system_or_err.takeError()) { | |||||
LLDB_LOG_ERROR(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET), | |||||
std::move(err), "Unable to get scratch type system"); | |||||
} else { | |||||
persistent_var_sp = | |||||
type_system_or_err->GetPersistentExpressionState()->GetVariable(expr); | |||||
} | |||||
} | |||||
if (persistent_var_sp) { | if (persistent_var_sp) { | ||||
result_valobj_sp = persistent_var_sp->GetValueObject(); | result_valobj_sp = persistent_var_sp->GetValueObject(); | ||||
execution_results = eExpressionCompleted; | execution_results = eExpressionCompleted; | ||||
} else { | } else { | ||||
llvm::StringRef prefix = GetExpressionPrefixContents(); | llvm::StringRef prefix = GetExpressionPrefixContents(); | ||||
Status error; | Status error; | ||||
execution_results = | execution_results = | ||||
UserExpression::Evaluate(exe_ctx, options, expr, prefix, | UserExpression::Evaluate(exe_ctx, options, expr, prefix, | ||||
▲ Show 20 Lines • Show All 1,671 Lines • Show Last 20 Lines |