Made GetScratchTypeSystemForLanguage return an error if desired.

Also made it not store nullptrs in its TypeSystemMap, so it will retry to make
the AST context if it errored out last time.

llvm-svn: 249167
This commit is contained in:
Sean Callanan
2015-10-02 18:40:30 +00:00
parent 9e31cb9ea7
commit a994b0b273
8 changed files with 46 additions and 27 deletions

View File

@@ -1229,7 +1229,7 @@ public:
GetImageSearchPathList ();
TypeSystem *
GetScratchTypeSystemForLanguage (lldb::LanguageType language, bool create_on_demand = true);
GetScratchTypeSystemForLanguage (Error *error, lldb::LanguageType language, bool create_on_demand = true);
PersistentExpressionState *
GetPersistentExpressionStateForLanguage (lldb::LanguageType language);
@@ -1506,7 +1506,7 @@ public:
protected:
ClangASTContext *
GetScratchClangASTContextImpl();
GetScratchClangASTContextImpl(Error *error);
//------------------------------------------------------------------
// Member variables.

View File

@@ -235,7 +235,7 @@ namespace lldb_private {
TargetSP target_sp(m_backend.GetTargetSP());
m_child_type = ::GetCompilerTypeForFormat(m_parent_format,
element_type,
target_sp ? target_sp->GetScratchTypeSystemForLanguage(lldb::eLanguageTypeC) : nullptr);
target_sp ? target_sp->GetScratchTypeSystemForLanguage(nullptr, lldb::eLanguageTypeC) : nullptr);
m_num_children = ::CalculateNumChildren(parent_type,
m_child_type);
m_item_format = GetItemFormatForFormat(m_parent_format,

View File

@@ -83,7 +83,7 @@ bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrappi
if (ClangModulesDeclVendor *decl_vendor = target->GetClangModulesDeclVendor())
{
ClangPersistentVariables *persistent_vars = llvm::cast<ClangPersistentVariables>(target->GetScratchTypeSystemForLanguage(lldb::eLanguageTypeC)->GetPersistentExpressionState());
ClangPersistentVariables *persistent_vars = llvm::cast<ClangPersistentVariables>(target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC));
const ClangModulesDeclVendor::ModuleVector &hand_imported_modules = persistent_vars->GetHandLoadedClangModules();
ClangModulesDeclVendor::ModuleVector modules_for_macros;

View File

@@ -857,11 +857,12 @@ public:
return;
}
TypeSystem *type_system = target_sp->GetScratchTypeSystemForLanguage(m_type.GetMinimumLanguage());
Error type_system_error;
TypeSystem *type_system = target_sp->GetScratchTypeSystemForLanguage(&type_system_error, m_type.GetMinimumLanguage());
if (!type_system)
{
err.SetErrorString("Couldn't dematerialize a result variable: couldn't get the corresponding type system");
err.SetErrorStringWithFormat("Couldn't dematerialize a result variable: couldn't get the corresponding type system: %s", type_system_error.AsCString());
return;
}

View File

@@ -25,7 +25,7 @@ lldb_private::formatters::CMTimeSummaryProvider (ValueObject& valobj, Stream& st
if (!type.IsValid())
return false;
TypeSystem *type_system = valobj.GetExecutionContextRef().GetTargetSP()->GetScratchTypeSystemForLanguage(lldb::eLanguageTypeC);
TypeSystem *type_system = valobj.GetExecutionContextRef().GetTargetSP()->GetScratchTypeSystemForLanguage(nullptr, lldb::eLanguageTypeC);
if (!type_system)
return false;

View File

@@ -181,7 +181,7 @@ AppleGetItemInfoHandler::SetupGetItemInfoFunction (Thread &thread, ValueList &ge
// Next make the runner function for our implementation utility function.
Error error;
TypeSystem *type_system = thread.GetProcess()->GetTarget().GetScratchTypeSystemForLanguage(eLanguageTypeC);
TypeSystem *type_system = thread.GetProcess()->GetTarget().GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC);
CompilerType get_item_info_return_type = type_system->GetBasicTypeFromAST(eBasicTypeVoid).GetPointerType();
get_item_info_caller = m_get_item_info_impl_code->MakeFunctionCaller(get_item_info_return_type,

View File

@@ -1890,10 +1890,16 @@ Target::ImageSearchPathsChanged
}
TypeSystem *
Target::GetScratchTypeSystemForLanguage (lldb::LanguageType language, bool create_on_demand)
Target::GetScratchTypeSystemForLanguage (Error *error, lldb::LanguageType language, bool create_on_demand)
{
if (error)
{
error->Clear();
}
if (language == eLanguageTypeMipsAssembler // GNU AS and LLVM use it for all assembly code
|| language == eLanguageTypeUnknown) {
|| language == eLanguageTypeUnknown)
{
language = eLanguageTypeC;
}
@@ -1920,8 +1926,16 @@ Target::GetScratchTypeSystemForLanguage (lldb::LanguageType language, bool creat
|| Language::LanguageIsObjC(language)
|| Language::LanguageIsCPlusPlus(language))
{
m_scratch_type_system_map[language].reset(GetScratchClangASTContextImpl());
return m_scratch_type_system_map[language].get();
TypeSystem* ret = GetScratchClangASTContextImpl(error);
if (ret)
{
m_scratch_type_system_map[language].reset(ret);
return m_scratch_type_system_map[language].get();
}
else
{
return nullptr;
}
}
return nullptr;
@@ -1930,7 +1944,7 @@ Target::GetScratchTypeSystemForLanguage (lldb::LanguageType language, bool creat
PersistentExpressionState *
Target::GetPersistentExpressionStateForLanguage (lldb::LanguageType language)
{
TypeSystem *type_system = GetScratchTypeSystemForLanguage(language, true);
TypeSystem *type_system = GetScratchTypeSystemForLanguage(nullptr, language, true);
if (type_system)
{
@@ -1944,17 +1958,19 @@ Target::GetPersistentExpressionStateForLanguage (lldb::LanguageType language)
UserExpression *
Target::GetUserExpressionForLanguage(const char *expr,
const char *expr_prefix,
lldb::LanguageType language,
Expression::ResultType desired_type,
Error &error)
const char *expr_prefix,
lldb::LanguageType language,
Expression::ResultType desired_type,
Error &error)
{
TypeSystem *type_system = GetScratchTypeSystemForLanguage (language);
Error type_system_error;
TypeSystem *type_system = GetScratchTypeSystemForLanguage (&type_system_error, language);
UserExpression *user_expr = nullptr;
if (!type_system)
{
error.SetErrorStringWithFormat("Could not find type system for language: %s", Language::GetNameForLanguageType(language));
error.SetErrorStringWithFormat("Could not find type system for language %s: %s", Language::GetNameForLanguageType(language), type_system_error.AsCString());
return nullptr;
}
@@ -1973,12 +1989,13 @@ Target::GetFunctionCallerForLanguage (lldb::LanguageType language,
const char *name,
Error &error)
{
TypeSystem *type_system = GetScratchTypeSystemForLanguage (language);
Error type_system_error;
TypeSystem *type_system = GetScratchTypeSystemForLanguage (&type_system_error, language);
FunctionCaller *persistent_fn = nullptr;
if (!type_system)
{
error.SetErrorStringWithFormat("Could not find type system for language: %s", Language::GetNameForLanguageType(language));
error.SetErrorStringWithFormat("Could not find type system for language %s: %s", Language::GetNameForLanguageType(language), type_system_error.AsCString());
return persistent_fn;
}
@@ -1995,12 +2012,13 @@ Target::GetUtilityFunctionForLanguage (const char *text,
const char *name,
Error &error)
{
TypeSystem *type_system = GetScratchTypeSystemForLanguage (language);
Error type_system_error;
TypeSystem *type_system = GetScratchTypeSystemForLanguage (&type_system_error, language);
UtilityFunction *utility_fn = nullptr;
if (!type_system)
{
error.SetErrorStringWithFormat("Could not find type system for language: %s", Language::GetNameForLanguageType(language));
error.SetErrorStringWithFormat("Could not find type system for language %s: %s", Language::GetNameForLanguageType(language), type_system_error.AsCString());
return utility_fn;
}
@@ -2014,7 +2032,7 @@ Target::GetUtilityFunctionForLanguage (const char *text,
ClangASTContext *
Target::GetScratchClangASTContext(bool create_on_demand)
{
if (TypeSystem* type_system = GetScratchTypeSystemForLanguage(eLanguageTypeC, create_on_demand))
if (TypeSystem* type_system = GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC, create_on_demand))
{
return llvm::dyn_cast<ClangASTContext>(type_system);
}
@@ -2025,7 +2043,7 @@ Target::GetScratchClangASTContext(bool create_on_demand)
}
ClangASTContext *
Target::GetScratchClangASTContextImpl()
Target::GetScratchClangASTContextImpl(Error *error)
{
ClangASTContextForExpressions *ast_context = new ClangASTContextForExpressions(*this);
@@ -2166,7 +2184,7 @@ Target::EvaluateExpression
lldb::ExpressionVariableSP persistent_var_sp;
// Only check for persistent variables the expression starts with a '$'
if (expr_cstr[0] == '$')
persistent_var_sp = GetScratchTypeSystemForLanguage(eLanguageTypeC)->GetPersistentExpressionState()->GetVariable (expr_cstr);
persistent_var_sp = GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC)->GetPersistentExpressionState()->GetVariable (expr_cstr);
if (persistent_var_sp)
{

View File

@@ -135,7 +135,7 @@ ThreadPlanAssemblyTracer::GetIntPointerType()
TargetSP target_sp (m_thread.CalculateTarget());
if (target_sp)
{
TypeSystem *type_system = target_sp->GetScratchTypeSystemForLanguage(eLanguageTypeC);
TypeSystem *type_system = target_sp->GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC);
if (type_system)
m_intptr_type = TypeFromUser(type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, target_sp->GetArchitecture().GetAddressByteSize() * 8));
}