forked from OSchip/llvm-project
Add missing nullptr checks.
GetPersistentExpressionStateForLanguage() can return a nullptr if it cannot construct a typesystem. This patch adds missing nullptr checks at all uses. Inspired by rdar://problem/58317195 Differential Revision: https://reviews.llvm.org/D72413
This commit is contained in:
parent
bdd88b7ed3
commit
e9331a56fe
|
@ -283,6 +283,8 @@ void REPL::IOHandlerInputComplete(IOHandler &io_handler, std::string &code) {
|
|||
|
||||
PersistentExpressionState *persistent_state =
|
||||
m_target.GetPersistentExpressionStateForLanguage(GetLanguage());
|
||||
if (!persistent_state)
|
||||
return;
|
||||
|
||||
const size_t var_count_before = persistent_state->GetSize();
|
||||
|
||||
|
|
|
@ -396,8 +396,9 @@ UserExpression::Execute(DiagnosticManager &diagnostic_manager,
|
|||
diagnostic_manager, exe_ctx, options, shared_ptr_to_me, result_var);
|
||||
Target *target = exe_ctx.GetTargetPtr();
|
||||
if (options.GetResultIsInternal() && result_var && target) {
|
||||
target->GetPersistentExpressionStateForLanguage(m_language)
|
||||
->RemovePersistentVariable(result_var);
|
||||
if (auto *persistent_state =
|
||||
target->GetPersistentExpressionStateForLanguage(m_language))
|
||||
persistent_state->RemovePersistentVariable(result_var);
|
||||
}
|
||||
return expr_result;
|
||||
}
|
||||
|
|
|
@ -447,8 +447,11 @@ void ASTResultSynthesizer::RecordPersistentDecl(NamedDecl *D) {
|
|||
}
|
||||
|
||||
void ASTResultSynthesizer::CommitPersistentDecls() {
|
||||
PersistentExpressionState *state =
|
||||
auto *state =
|
||||
m_target.GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC);
|
||||
if (!state)
|
||||
return;
|
||||
|
||||
auto *persistent_vars = llvm::cast<ClangPersistentVariables>(state);
|
||||
ClangASTContext *scratch_ctx = ClangASTContext::GetScratch(m_target);
|
||||
|
||||
|
|
|
@ -126,7 +126,7 @@ void ClangExpressionDeclMap::InstallCodeGenerator(
|
|||
}
|
||||
|
||||
void ClangExpressionDeclMap::DidParse() {
|
||||
if (m_parser_vars) {
|
||||
if (m_parser_vars && m_parser_vars->m_persistent_vars) {
|
||||
for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
|
||||
entity_index < num_entities; ++entity_index) {
|
||||
ExpressionVariableSP var_sp(
|
||||
|
@ -262,6 +262,9 @@ bool ClangExpressionDeclMap::AddPersistentVariable(const NamedDecl *decl,
|
|||
if (!m_parser_vars->m_target_info.IsValid())
|
||||
return false;
|
||||
|
||||
if (!m_parser_vars->m_persistent_vars)
|
||||
return false;
|
||||
|
||||
ClangExpressionVariable *var = llvm::cast<ClangExpressionVariable>(
|
||||
m_parser_vars->m_persistent_vars
|
||||
->CreatePersistentVariable(
|
||||
|
@ -327,7 +330,7 @@ bool ClangExpressionDeclMap::AddValueToStruct(const NamedDecl *decl,
|
|||
ClangExpressionVariable *var(ClangExpressionVariable::FindVariableInList(
|
||||
m_found_entities, decl, GetParserID()));
|
||||
|
||||
if (!var) {
|
||||
if (!var && m_parser_vars->m_persistent_vars) {
|
||||
var = ClangExpressionVariable::FindVariableInList(
|
||||
*m_parser_vars->m_persistent_vars, decl, GetParserID());
|
||||
is_persistent_variable = true;
|
||||
|
@ -733,6 +736,8 @@ clang::NamedDecl *ClangExpressionDeclMap::GetPersistentDecl(ConstString name) {
|
|||
|
||||
ClangASTContext::GetScratch(*target);
|
||||
|
||||
if (!m_parser_vars->m_persistent_vars)
|
||||
return nullptr;
|
||||
return m_parser_vars->m_persistent_vars->GetPersistentDecl(name);
|
||||
}
|
||||
|
||||
|
@ -1390,7 +1395,7 @@ void ClangExpressionDeclMap::FindExternalVisibleDecls(
|
|||
return;
|
||||
|
||||
// No ParserVars means we can't do register or variable lookup.
|
||||
if (!m_parser_vars)
|
||||
if (!m_parser_vars || !m_parser_vars->m_persistent_vars)
|
||||
return;
|
||||
|
||||
ExpressionVariableSP pvar_sp(
|
||||
|
|
|
@ -583,15 +583,16 @@ ClangExpressionParser::ClangExpressionParser(
|
|||
|
||||
if (ClangModulesDeclVendor *decl_vendor =
|
||||
target_sp->GetClangModulesDeclVendor()) {
|
||||
ClangPersistentVariables *clang_persistent_vars =
|
||||
llvm::cast<ClangPersistentVariables>(
|
||||
if (auto *clang_persistent_vars = llvm::cast<ClangPersistentVariables>(
|
||||
target_sp->GetPersistentExpressionStateForLanguage(
|
||||
lldb::eLanguageTypeC));
|
||||
std::unique_ptr<PPCallbacks> pp_callbacks(new LLDBPreprocessorCallbacks(
|
||||
*decl_vendor, *clang_persistent_vars, m_compiler->getSourceManager()));
|
||||
m_pp_callbacks =
|
||||
static_cast<LLDBPreprocessorCallbacks *>(pp_callbacks.get());
|
||||
m_compiler->getPreprocessor().addPPCallbacks(std::move(pp_callbacks));
|
||||
lldb::eLanguageTypeC))) {
|
||||
std::unique_ptr<PPCallbacks> pp_callbacks(
|
||||
new LLDBPreprocessorCallbacks(*decl_vendor, *clang_persistent_vars,
|
||||
m_compiler->getSourceManager()));
|
||||
m_pp_callbacks =
|
||||
static_cast<LLDBPreprocessorCallbacks *>(pp_callbacks.get());
|
||||
m_compiler->getPreprocessor().addPPCallbacks(std::move(pp_callbacks));
|
||||
}
|
||||
}
|
||||
|
||||
// 8. Most of this we get from the CompilerInstance, but we also want to give
|
||||
|
|
|
@ -315,12 +315,10 @@ bool ClangExpressionSourceCode::GetText(
|
|||
}
|
||||
}
|
||||
|
||||
if (ClangModulesDeclVendor *decl_vendor =
|
||||
target->GetClangModulesDeclVendor()) {
|
||||
ClangPersistentVariables *persistent_vars =
|
||||
llvm::cast<ClangPersistentVariables>(
|
||||
target->GetPersistentExpressionStateForLanguage(
|
||||
lldb::eLanguageTypeC));
|
||||
ClangModulesDeclVendor *decl_vendor = target->GetClangModulesDeclVendor();
|
||||
auto *persistent_vars = llvm::cast<ClangPersistentVariables>(
|
||||
target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC));
|
||||
if (decl_vendor && persistent_vars) {
|
||||
const ClangModulesDeclVendor::ModuleVector &hand_imported_modules =
|
||||
persistent_vars->GetHandLoadedClangModules();
|
||||
ClangModulesDeclVendor::ModuleVector modules_for_macros;
|
||||
|
|
|
@ -350,11 +350,12 @@ bool ClangUserExpression::SetupPersistentState(DiagnosticManager &diagnostic_man
|
|||
static void SetupDeclVendor(ExecutionContext &exe_ctx, Target *target) {
|
||||
if (ClangModulesDeclVendor *decl_vendor =
|
||||
target->GetClangModulesDeclVendor()) {
|
||||
auto *persistent_state = llvm::cast<ClangPersistentVariables>(
|
||||
target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC));
|
||||
if (!persistent_state)
|
||||
return;
|
||||
const ClangModulesDeclVendor::ModuleVector &hand_imported_modules =
|
||||
llvm::cast<ClangPersistentVariables>(
|
||||
target->GetPersistentExpressionStateForLanguage(
|
||||
lldb::eLanguageTypeC))
|
||||
->GetHandLoadedClangModules();
|
||||
persistent_state->GetHandLoadedClangModules();
|
||||
ClangModulesDeclVendor::ModuleVector modules_for_macros;
|
||||
|
||||
for (ClangModulesDeclVendor::ModuleID module : hand_imported_modules) {
|
||||
|
@ -682,10 +683,12 @@ bool ClangUserExpression::Parse(DiagnosticManager &diagnostic_manager,
|
|||
register_execution_unit = true;
|
||||
}
|
||||
|
||||
if (register_execution_unit)
|
||||
exe_ctx.GetTargetPtr()
|
||||
->GetPersistentExpressionStateForLanguage(m_language)
|
||||
->RegisterExecutionUnit(m_execution_unit_sp);
|
||||
if (register_execution_unit) {
|
||||
if (auto *persistent_state =
|
||||
exe_ctx.GetTargetPtr()->GetPersistentExpressionStateForLanguage(
|
||||
m_language))
|
||||
persistent_state->RegisterExecutionUnit(m_execution_unit_sp);
|
||||
}
|
||||
}
|
||||
|
||||
if (generate_debug_info) {
|
||||
|
|
|
@ -87,7 +87,7 @@ ValueObjectSP ABI::GetReturnValueObject(Thread &thread, CompilerType &ast_type,
|
|||
ast_type.GetMinimumLanguage());
|
||||
|
||||
if (!persistent_expression_state)
|
||||
return ValueObjectSP();
|
||||
return {};
|
||||
|
||||
auto prefix = persistent_expression_state->GetPersistentVariablePrefix();
|
||||
ConstString persistent_variable_name =
|
||||
|
|
Loading…
Reference in New Issue