diff options
Diffstat (limited to 'lldb/source')
29 files changed, 306 insertions, 268 deletions
diff --git a/lldb/source/Commands/CommandObjectArgs.cpp b/lldb/source/Commands/CommandObjectArgs.cpp index fd57df649af..896a058a1c0 100644 --- a/lldb/source/Commands/CommandObjectArgs.cpp +++ b/lldb/source/Commands/CommandObjectArgs.cpp @@ -249,7 +249,7 @@ CommandObjectArgs::Execute return false; } - value.SetContext (Value::eContextTypeOpaqueClangQualType, type); + value.SetContext (Value::eContextTypeClangType, type); value_list.PushValue(value); } diff --git a/lldb/source/Commands/CommandObjectCall.cpp b/lldb/source/Commands/CommandObjectCall.cpp index 26746687d9d..9a1a7977d78 100644 --- a/lldb/source/Commands/CommandObjectCall.cpp +++ b/lldb/source/Commands/CommandObjectCall.cpp @@ -257,7 +257,7 @@ CommandObjectCall::Execute void *cstr_type = exe_ctx.target->GetScratchClangASTContext()->GetCStringType(true); - val.SetContext (Value::eContextTypeOpaqueClangQualType, cstr_type); + val.SetContext (Value::eContextTypeClangType, cstr_type); value_list.PushValue(val); success = true; diff --git a/lldb/source/Core/Value.cpp b/lldb/source/Core/Value.cpp index 76f109744ff..920c467333e 100644 --- a/lldb/source/Core/Value.cpp +++ b/lldb/source/Core/Value.cpp @@ -287,7 +287,7 @@ Value::GetRegisterInfo() if (m_context_type == eContextTypeValue) return ((Value*)m_context)->GetRegisterInfo(); - if (m_context_type == eContextTypeDCRegisterInfo) + if (m_context_type == eContextTypeRegisterInfo) return static_cast<RegisterInfo *> (m_context); return NULL; } @@ -298,7 +298,7 @@ Value::GetType() if (m_context_type == eContextTypeValue) return ((Value*)m_context)->GetType(); - if (m_context_type == eContextTypeDCType) + if (m_context_type == eContextTypeLLDBType) return static_cast<Type *> (m_context); return NULL; } @@ -336,12 +336,12 @@ Value::ValueOf(ExecutionContext *exe_ctx, clang::ASTContext *ast_context) { default: case eContextTypeInvalid: - case eContextTypeOpaqueClangQualType: // clang::Type * - case eContextTypeDCRegisterInfo: // RegisterInfo * - case eContextTypeDCType: // Type * + case eContextTypeClangType: // clang::Type * + case eContextTypeRegisterInfo: // RegisterInfo * + case eContextTypeLLDBType: // Type * break; - case eContextTypeDCVariable: // Variable * + case eContextTypeVariable: // Variable * ResolveValue(exe_ctx, ast_context); return true; } @@ -365,7 +365,7 @@ Value::GetValueByteSize (clang::ASTContext *ast_context, Error *error_ptr) error_ptr->SetErrorString ("Invalid context type, there is no way to know how much memory to read."); break; - case eContextTypeOpaqueClangQualType: + case eContextTypeClangType: if (ast_context == NULL) { if (error_ptr) @@ -378,7 +378,7 @@ Value::GetValueByteSize (clang::ASTContext *ast_context, Error *error_ptr) } break; - case eContextTypeDCRegisterInfo: // RegisterInfo * + case eContextTypeRegisterInfo: // RegisterInfo * if (GetRegisterInfo()) byte_size = GetRegisterInfo()->byte_size; else if (error_ptr) @@ -386,14 +386,14 @@ Value::GetValueByteSize (clang::ASTContext *ast_context, Error *error_ptr) break; - case eContextTypeDCType: // Type * + case eContextTypeLLDBType: // Type * if (GetType()) byte_size = GetType()->GetByteSize(); else if (error_ptr) error_ptr->SetErrorString ("Can't determine byte size with NULL Type *."); break; - case eContextTypeDCVariable: // Variable * + case eContextTypeVariable: // Variable * if (GetVariable()) byte_size = GetVariable()->GetType()->GetByteSize(); else if (error_ptr) @@ -428,18 +428,18 @@ Value::GetClangType () case eContextTypeInvalid: break; - case eContextTypeOpaqueClangQualType: + case eContextTypeClangType: return m_context; - case eContextTypeDCRegisterInfo: + case eContextTypeRegisterInfo: break; // TODO: Eventually convert into a clang type? - case eContextTypeDCType: + case eContextTypeLLDBType: if (GetType()) return GetType()->GetClangType(); break; - case eContextTypeDCVariable: + case eContextTypeVariable: if (GetVariable()) return GetVariable()->GetType()->GetClangType(); break; @@ -460,20 +460,20 @@ Value::GetValueDefaultFormat () case eContextTypeInvalid: break; - case eContextTypeOpaqueClangQualType: + case eContextTypeClangType: return ClangASTType::GetFormat (m_context); - case eContextTypeDCRegisterInfo: + case eContextTypeRegisterInfo: if (GetRegisterInfo()) return GetRegisterInfo()->format; break; - case eContextTypeDCType: + case eContextTypeLLDBType: if (GetType()) return GetType()->GetFormat(); break; - case eContextTypeDCVariable: + case eContextTypeVariable: if (GetVariable()) return GetVariable()->GetType()->GetFormat(); break; @@ -669,7 +669,7 @@ Value::ResolveValue(ExecutionContext *exe_ctx, clang::ASTContext *ast_context) } } - if (m_context_type == eContextTypeOpaqueClangQualType) + if (m_context_type == eContextTypeClangType) { void *opaque_clang_qual_type = GetClangType(); switch (m_value_type) @@ -731,7 +731,7 @@ Value::GetVariable() if (m_context_type == eContextTypeValue) return ((Value*)m_context)->GetVariable(); - if (m_context_type == eContextTypeDCVariable) + if (m_context_type == eContextTypeVariable) return static_cast<Variable *> (m_context); return NULL; } @@ -757,10 +757,10 @@ Value::GetContextTypeAsCString (ContextType context_type) switch (context_type) { case eContextTypeInvalid: return "invalid"; - case eContextTypeOpaqueClangQualType: return "clang::Type *"; - case eContextTypeDCRegisterInfo: return "RegisterInfo *"; - case eContextTypeDCType: return "Type *"; - case eContextTypeDCVariable: return "Variable *"; + case eContextTypeClangType: return "clang::Type *"; + case eContextTypeRegisterInfo: return "RegisterInfo *"; + case eContextTypeLLDBType: return "Type *"; + case eContextTypeVariable: return "Variable *"; case eContextTypeValue: return "Value"; // TODO: Sean, more description here? }; return "???"; diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp index a3da90d9c3a..64c646ba567 100644 --- a/lldb/source/Core/ValueObject.cpp +++ b/lldb/source/Core/ValueObject.cpp @@ -179,7 +179,7 @@ ValueObject::GetLocationAsCString (ExecutionContextScope *exe_scope) break; case Value::eValueTypeScalar: - if (m_value.GetContextType() == Value::eContextTypeDCRegisterInfo) + if (m_value.GetContextType() == Value::eContextTypeRegisterInfo) { RegisterInfo *reg_info = m_value.GetRegisterInfo(); if (reg_info) @@ -611,9 +611,9 @@ ValueObject::GetValueAsCString (ExecutionContextScope *exe_scope) switch (context_type) { - case Value::eContextTypeOpaqueClangQualType: - case Value::eContextTypeDCType: - case Value::eContextTypeDCVariable: + case Value::eContextTypeClangType: + case Value::eContextTypeLLDBType: + case Value::eContextTypeVariable: { clang_type_t clang_type = GetClangType (); if (clang_type) @@ -638,7 +638,7 @@ ValueObject::GetValueAsCString (ExecutionContextScope *exe_scope) } break; - case Value::eContextTypeDCRegisterInfo: + case Value::eContextTypeRegisterInfo: { const RegisterInfo *reg_info = m_value.GetRegisterInfo(); if (reg_info) diff --git a/lldb/source/Core/ValueObjectChild.cpp b/lldb/source/Core/ValueObjectChild.cpp index ec935845614..2e1937228af 100644 --- a/lldb/source/Core/ValueObjectChild.cpp +++ b/lldb/source/Core/ValueObjectChild.cpp @@ -135,7 +135,7 @@ ValueObjectChild::UpdateValue (ExecutionContextScope *exe_scope) { if (parent->UpdateValueIfNeeded(exe_scope)) { - m_value.SetContext(Value::eContextTypeOpaqueClangQualType, m_clang_type); + m_value.SetContext(Value::eContextTypeClangType, m_clang_type); // Copy the parent scalar value and the scalar value type m_value.GetScalar() = parent->GetValue().GetScalar(); diff --git a/lldb/source/Core/ValueObjectConstResult.cpp b/lldb/source/Core/ValueObjectConstResult.cpp index 93e2d3eb05a..ef7c7b9e3b1 100644 --- a/lldb/source/Core/ValueObjectConstResult.cpp +++ b/lldb/source/Core/ValueObjectConstResult.cpp @@ -44,7 +44,7 @@ ValueObjectConstResult::ValueObjectConstResult m_data.SetData(data_sp); m_value.GetScalar() = (uintptr_t)data_sp->GetBytes(); m_value.SetValueType(Value::eValueTypeHostAddress); - m_value.SetContext(Value::eContextTypeOpaqueClangQualType, clang_type); + m_value.SetContext(Value::eContextTypeClangType, clang_type); m_name = name; SetIsConstant (); SetValueIsValid(true); diff --git a/lldb/source/Core/ValueObjectRegister.cpp b/lldb/source/Core/ValueObjectRegister.cpp index 7f3603f032a..dabf838bea7 100644 --- a/lldb/source/Core/ValueObjectRegister.cpp +++ b/lldb/source/Core/ValueObjectRegister.cpp @@ -319,7 +319,7 @@ ValueObjectRegister::UpdateValue (ExecutionContextScope *exe_scope) { if (m_reg_ctx->ReadRegisterBytes (m_reg_num, m_data)) { - m_value.SetContext(Value::eContextTypeDCRegisterInfo, (void *)m_reg_info); + m_value.SetContext(Value::eContextTypeRegisterInfo, (void *)m_reg_info); m_value.SetValueType(Value::eValueTypeHostAddress); m_value.GetScalar() = (uintptr_t)m_data.GetDataStart(); SetValueIsValid (true); diff --git a/lldb/source/Core/ValueObjectVariable.cpp b/lldb/source/Core/ValueObjectVariable.cpp index 104aa1f0e21..4f8bfe248fd 100644 --- a/lldb/source/Core/ValueObjectVariable.cpp +++ b/lldb/source/Core/ValueObjectVariable.cpp @@ -120,7 +120,7 @@ ValueObjectVariable::UpdateValue (ExecutionContextScope *exe_scope) Value old_value(m_value); if (expr.Evaluate (&exe_ctx, GetClangAST(), loclist_base_load_addr, NULL, m_value, &m_error)) { - m_value.SetContext(Value::eContextTypeDCVariable, variable); + m_value.SetContext(Value::eContextTypeVariable, variable); Value::ValueType value_type = m_value.GetValueType(); @@ -184,7 +184,7 @@ ValueObjectVariable::UpdateValue (ExecutionContextScope *exe_scope) // Copy the Value and set the context to use our Variable // so it can extract read its value into m_data appropriately Value value(m_value); - value.SetContext(Value::eContextTypeDCVariable, variable); + value.SetContext(Value::eContextTypeVariable, variable); m_error = value.GetValueAsData(&exe_ctx, GetClangAST(), m_data, 0); } break; diff --git a/lldb/source/Expression/ClangExpressionDeclMap.cpp b/lldb/source/Expression/ClangExpressionDeclMap.cpp index aa7d458badb..92b1ebb0cd0 100644 --- a/lldb/source/Expression/ClangExpressionDeclMap.cpp +++ b/lldb/source/Expression/ClangExpressionDeclMap.cpp @@ -23,6 +23,7 @@ #include "lldb/Expression/ClangASTSource.h" #include "lldb/Expression/ClangPersistentVariables.h" #include "lldb/Symbol/ClangASTContext.h" +#include "lldb/Symbol/ClangNamespaceDecl.h" #include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/Function.h" #include "lldb/Symbol/ObjectFile.h" @@ -760,7 +761,7 @@ ClangExpressionDeclMap::DoMaterializeOneVariable break; case Value::eValueTypeScalar: { - if (location_value->GetContextType() != Value::eContextTypeDCRegisterInfo) + if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) { StreamString ss; @@ -1019,6 +1020,18 @@ ClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString else if (non_extern_symbol) AddOneFunction(context, NULL, non_extern_symbol); } + + ClangNamespaceDecl namespace_decl (m_sym_ctx.FindNamespace(name)); + if (namespace_decl) + { +// clang::NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decl); +// if (clang_namespace_decl) +// { +// // TODO: is this how we get the decl lookups to be called for +// // this namespace?? +// clang_namespace_decl->setHasExternalLexicalStorage(); +// } + } } } else @@ -1179,7 +1192,7 @@ ClangExpressionDeclMap::GetVariableValue type_to_use = var_opaque_type; if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) - var_location.get()->SetContext(Value::eContextTypeOpaqueClangQualType, type_to_use); + var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use); if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) { @@ -1279,6 +1292,19 @@ ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, } } +clang::NamespaceDecl * +ClangExpressionDeclMap::AddNamespace (NameSearchContext &context, const ClangNamespaceDecl &namespace_decl) +{ + lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); + + + clang::Decl *copied_decl = ClangASTContext::CopyDecl (context.GetASTContext(), + namespace_decl.GetASTContext(), + namespace_decl.GetNamespaceDecl()); + + return dyn_cast<clang::NamespaceDecl>(copied_decl); +} + void ClangExpressionDeclMap::AddOneFunction(NameSearchContext &context, Function* fun, diff --git a/lldb/source/Expression/ClangExpressionVariable.cpp b/lldb/source/Expression/ClangExpressionVariable.cpp index 370406e5e91..d1ae1d5c8ca 100644 --- a/lldb/source/Expression/ClangExpressionVariable.cpp +++ b/lldb/source/Expression/ClangExpressionVariable.cpp @@ -83,7 +83,7 @@ ClangExpressionVariable::PointValueAtData(Value &value, ExecutionContext *exe_ct if (m_data_sp.get() == NULL) return false; - value.SetContext(Value::eContextTypeOpaqueClangQualType, m_user_type.GetOpaqueQualType()); + value.SetContext(Value::eContextTypeClangType, m_user_type.GetOpaqueQualType()); value.SetValueType(Value::eValueTypeHostAddress); value.GetScalar() = (uintptr_t)m_data_sp->GetBytes(); clang::ASTContext *ast_context = m_user_type.GetASTContext(); diff --git a/lldb/source/Expression/ClangFunction.cpp b/lldb/source/Expression/ClangFunction.cpp index bc4fb73da98..40cddf3699d 100644 --- a/lldb/source/Expression/ClangFunction.cpp +++ b/lldb/source/Expression/ClangFunction.cpp @@ -327,7 +327,7 @@ ClangFunction::WriteFunctionArguments (ExecutionContext &exe_ctx, // Special case: if it's a pointer, don't do anything (the ABI supports passing cstrings) if (arg_value->GetValueType() == Value::eValueTypeHostAddress && - arg_value->GetContextType() == Value::eContextTypeOpaqueClangQualType && + arg_value->GetContextType() == Value::eContextTypeClangType && ClangASTContext::IsPointerType(arg_value->GetClangType())) continue; @@ -421,7 +421,7 @@ ClangFunction::FetchFunctionResults (ExecutionContext &exe_ctx, lldb::addr_t arg uint32_t offset = 0; uint64_t return_integer = data.GetMaxU64(&offset, m_return_size); - ret_value.SetContext (Value::eContextTypeOpaqueClangQualType, m_function_return_qual_type); + ret_value.SetContext (Value::eContextTypeClangType, m_function_return_qual_type); ret_value.SetValueType(Value::eValueTypeScalar); ret_value.GetScalar() = return_integer; return true; diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp index 9c65e812e85..30381b0439e 100644 --- a/lldb/source/Expression/DWARFExpression.cpp +++ b/lldb/source/Expression/DWARFExpression.cpp @@ -658,7 +658,7 @@ ReadRegisterValueAsScalar else { value.SetValueType (Value::eValueTypeScalar); - value.SetContext (Value::eContextTypeDCRegisterInfo, const_cast<RegisterInfo *>(reg_context->GetRegisterInfoAtIndex(native_reg))); + value.SetContext (Value::eContextTypeRegisterInfo, const_cast<RegisterInfo *>(reg_context->GetRegisterInfoAtIndex(native_reg))); if (reg_context->ReadRegisterValue (native_reg, value.GetScalar())) return true; @@ -2121,7 +2121,7 @@ DWARFExpression::Evaluate return false; } - if (array_val.GetContextType() != Value::eContextTypeOpaqueClangQualType) + if (array_val.GetContextType() != Value::eContextTypeClangType) { if (error_ptr) error_ptr->SetErrorString("Arrays without Clang types are unhandled at this time."); @@ -2169,7 +2169,7 @@ DWARFExpression::Evaluate Value member; - member.SetContext(Value::eContextTypeOpaqueClangQualType, member_type); + member.SetContext(Value::eContextTypeClangType, member_type); member.SetValueType(array_val.GetValueType()); addr_t array_base = (addr_t)array_val.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); @@ -2212,7 +2212,7 @@ DWARFExpression::Evaluate StreamString new_value(Stream::eBinary, 4, eByteOrderHost); switch (context_type) { - case Value::eContextTypeOpaqueClangQualType: + case Value::eContextTypeClangType: { void *clang_type = stack.back().GetClangType(); @@ -2427,7 +2427,7 @@ DWARFExpression::Evaluate tmp = stack.back(); stack.pop_back(); - if (tmp.GetContextType() != Value::eContextTypeOpaqueClangQualType) + if (tmp.GetContextType() != Value::eContextTypeClangType) { if (error_ptr) error_ptr->SetErrorString("Item at top of expression stack must have a Clang type"); @@ -2450,7 +2450,7 @@ DWARFExpression::Evaluate tmp.ResolveValue(exe_ctx, ast_context); tmp.SetValueType(value_type); - tmp.SetContext(Value::eContextTypeOpaqueClangQualType, target_type); + tmp.SetContext(Value::eContextTypeClangType, target_type); stack.push_back(tmp); } @@ -2483,7 +2483,7 @@ DWARFExpression::Evaluate Value *proxy = expr_local_variable->CreateProxy(); stack.push_back(*proxy); delete proxy; - //stack.back().SetContext (Value::eContextTypeOpaqueClangQualType, expr_local_variable->GetClangType()); + //stack.back().SetContext (Value::eContextTypeClangType, expr_local_variable->GetClangType()); */ } break; @@ -2548,7 +2548,7 @@ DWARFExpression::Evaluate else { void *clang_type = (void *)opcodes.GetMaxU64(&offset, sizeof(void*)); - stack.back().SetContext (Value::eContextTypeOpaqueClangQualType, clang_type); + stack.back().SetContext (Value::eContextTypeClangType, clang_type); } break; //---------------------------------------------------------------------- diff --git a/lldb/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp b/lldb/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp index 21adec86c60..e5a5db79477 100644 --- a/lldb/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp +++ b/lldb/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp @@ -234,7 +234,7 @@ ABIMacOSX_i386::PrepareNormalCall (Thread &thread, { default: return false; - case Value::eContextTypeOpaqueClangQualType: + case Value::eContextTypeClangType: { void *val_type = val->GetClangType(); uint32_t cstr_length; @@ -433,7 +433,7 @@ ABIMacOSX_i386::GetArgumentValues (Thread &thread, { default: return false; - case Value::eContextTypeOpaqueClangQualType: + case Value::eContextTypeClangType: { void *value_type = value->GetClangType(); bool is_signed; @@ -472,7 +472,7 @@ ABIMacOSX_i386::GetReturnValue (Thread &thread, { default: return false; - case Value::eContextTypeOpaqueClangQualType: + case Value::eContextTypeClangType: { // Extract the Clang AST context from the PC so that we can figure out type // sizes diff --git a/lldb/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp b/lldb/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp index e447df52a92..f4045cc119d 100644 --- a/lldb/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp +++ b/lldb/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp @@ -304,7 +304,7 @@ ABISysV_x86_64::GetArgumentValues (Thread &thread, { default: return false; - case Value::eContextTypeOpaqueClangQualType: + case Value::eContextTypeClangType: { void *value_type = value->GetClangType(); bool is_signed; @@ -347,7 +347,7 @@ ABISysV_x86_64::GetReturnValue (Thread &thread, { default: return false; - case Value::eContextTypeOpaqueClangQualType: + case Value::eContextTypeClangType: { void *value_type = value.GetClangType(); bool is_signed; diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp index 65a363d99fc..6e4fdb71c5b 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp @@ -97,7 +97,7 @@ AppleObjCRuntime::GetObjectDescription (Stream &str, Value &value, ExecutionCont void *opaque_type_ptr = ast_context->GetBuiltInType_objc_id(); if (opaque_type_ptr == NULL) opaque_type_ptr = ast_context->GetVoidPtrType(false); - value.SetContext(Value::eContextTypeOpaqueClangQualType, opaque_type_ptr); + value.SetContext(Value::eContextTypeClangType, opaque_type_ptr); } ValueList arg_value_list; @@ -109,7 +109,7 @@ AppleObjCRuntime::GetObjectDescription (Stream &str, Value &value, ExecutionCont void *return_qualtype = ast_context->GetCStringType(true); Value ret; - ret.SetContext(Value::eContextTypeOpaqueClangQualType, return_qualtype); + ret.SetContext(Value::eContextTypeClangType, return_qualtype); // Now we're ready to call the function: ClangFunction func(target_triple, ast_context, return_qualtype, *function_address, arg_value_list); diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp index 00d27d8b0d9..d76861926a4 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp @@ -74,15 +74,15 @@ AppleObjCTrampolineHandler::AppleObjCVTables::VTableRegion::SetUpRegion() } uint32_t offset_ptr = 0; - uint16_t header_size = data.GetU16(&offset_ptr); - uint16_t descriptor_size = data.GetU16(&offset_ptr); - size_t num_descriptors = data.GetU32(&offset_ptr); + const uint16_t header_size = data.GetU16(&offset_ptr); + const uint16_t descriptor_size = data.GetU16(&offset_ptr); + const size_t num_descriptors = data.GetU32(&offset_ptr); m_next_region = data.GetPointer(&offset_ptr); // If the header size is 0, that means we've come in too early before this data is set up. // Set ourselves as not valid, and continue. - if (header_size == 0) + if (header_size == 0 || num_descriptors == 0) { m_valid = false; return; @@ -100,8 +100,8 @@ AppleObjCTrampolineHandler::AppleObjCVTables::VTableRegion::SetUpRegion() // to compute it over and over. // Ingest the whole descriptor array: - lldb::addr_t desc_ptr = m_header_addr + header_size; - size_t desc_array_size = num_descriptors * descriptor_size; + const lldb::addr_t desc_ptr = m_header_addr + header_size; + const size_t desc_array_size = num_descriptors * descriptor_size; DataBufferSP data_sp(new DataBufferHeap (desc_array_size, '\0')); uint8_t* dst = (uint8_t*)data_sp->GetBytes(); @@ -291,7 +291,7 @@ AppleObjCTrampolineHandler::AppleObjCVTables::RefreshTrampolines (void *baton, Value input_value; void *clang_void_ptr_type = clang_ast_context->GetVoidPtrType(false); input_value.SetValueType (Value::eValueTypeScalar); - input_value.SetContext (Value::eContextTypeOpaqueClangQualType, clang_void_ptr_type); + input_value.SetContext (Value::eContextTypeClangType, clang_void_ptr_type); argument_values.PushValue(input_value); bool success = abi->GetArgumentValues (*(context->exe_ctx.thread), argument_values); @@ -515,7 +515,7 @@ AppleObjCTrampolineHandler::GetStepThroughDispatchPlan (Thread &thread, bool sto Value input_value; void *clang_void_ptr_type = clang_ast_context->GetVoidPtrType(false); input_value.SetValueType (Value::eValueTypeScalar); - input_value.SetContext (Value::eContextTypeOpaqueClangQualType, clang_void_ptr_type); + input_value.SetContext (Value::eContextTypeClangType, clang_void_ptr_type); int obj_index; int sel_index; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 5deeb90747b..f3abd9e0a4a 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -1158,7 +1158,7 @@ SymbolFileDWARF::ParseChildMembers accessibility = default_accessibility; member_accessibilities.push_back(accessibility); - GetClangASTContext().AddFieldToRecordType (class_clang_type, name, member_type->GetClangType(), accessibility, bit_size); + GetClangASTContext().AddFieldToRecordType (class_clang_type, name, member_type->GetClangLayoutType(), accessibility, bit_size); } } } @@ -1226,16 +1226,16 @@ SymbolFileDWARF::ParseChildMembers } } - Type *base_class_dctype = ResolveTypeUID(encoding_uid); - assert(base_class_dctype); + Type *base_class_type = ResolveTypeUID(encoding_uid); + assert(base_class_type); if (class_language == eLanguageTypeObjC) { - GetClangASTContext().SetObjCSuperClass(class_clang_type, base_class_dctype->GetClangType()); + GetClangASTContext().SetObjCSuperClass(class_clang_type, base_class_type->GetClangType()); } else { - base_classes.push_back (GetClangASTContext().CreateBaseClassSpecifier (base_class_dctype->GetClangType(), accessibility, is_virtual, is_base_of_class)); + base_classes.push_back (GetClangASTContext().CreateBaseClassSpecifier (base_class_type->GetClangType(), accessibility, is_virtual, is_base_of_class)); assert(base_classes.back()); } } @@ -2100,36 +2100,42 @@ SymbolFileDWARF::FindTypes(const SymbolContext& sc, const ConstString &name, boo } -clang::NamespaceDecl * +ClangNamespaceDecl SymbolFileDWARF::FindNamespace (const SymbolContext& sc, const ConstString &name) { + ClangNamespaceDecl namespace_decl; DWARFDebugInfo* info = DebugInfo(); - if (info == NULL) - return 0; - - // Index if we already haven't to make sure the compile units - // get indexed and make their global DIE index list - if (!m_indexed) - Index (); - - DWARFCompileUnit* curr_cu = NULL; - DWARFCompileUnit* prev_cu = NULL; - const DWARFDebugInfoEntry* die = NULL; - std::vector<NameToDIE::Info> die_info_array; - const size_t num_matches = m_namespace_index.Find (name, die_info_array); - for (size_t i=0; i<num_matches; ++i, prev_cu = curr_cu) + if (info) { - curr_cu = info->GetCompileUnitAtIndex(die_info_array[i].cu_idx); - - if (curr_cu != prev_cu) - curr_cu->ExtractDIEsIfNeeded (false); + // Index if we already haven't to make sure the compile units + // get indexed and make their global DIE index list + if (!m_indexed) + Index (); + + DWARFCompileUnit* curr_cu = NULL; + DWARFCompileUnit* prev_cu = NULL; + const DWARFDebugInfoEntry* die = NULL; + std::vector<NameToDIE::Info> die_info_array; + const size_t num_matches = m_namespace_index.Find (name, die_info_array); + for (size_t i=0; i<num_matches; ++i, prev_cu = curr_cu) + { + curr_cu = info->GetCompileUnitAtIndex(die_info_array[i].cu_idx); + + if (curr_cu != prev_cu) + curr_cu->ExtractDIEsIfNeeded (false); - die = curr_cu->GetDIEAtIndexUnchecked(die_info_array[i].die_idx); + die = curr_cu->GetDIEAtIndexUnchecked(die_info_array[i].die_idx); - return ResolveNamespaceDIE (curr_cu, die); + clang::NamespaceDecl *clang_namespace_decl = ResolveNamespaceDIE (curr_cu, die); + if (clang_namespace_decl) + { + namespace_decl.SetASTContext (GetClangASTContext().getASTContext()); + namespace_decl.SetNamespaceDecl (clang_namespace_decl); + } + } } - return NULL; + return namespace_decl; } uint32_t @@ -2700,6 +2706,10 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, DWARFDebugInfoEntry::Attributes attributes; const char *type_name_cstr = NULL; ConstString type_name_const_str; + Type::ResolveState resolve_state = Type::eResolveStateUnresolved; + size_t byte_size = 0; + Declaration decl; + Type::EncodingDataType encoding_data_type = Type::eEncodingIsUID; clang_type_t clang_type = NULL; @@ -2719,9 +2729,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, m_die_to_type[die] = DIE_IS_BEING_PARSED; const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); - Declaration decl; uint32_t encoding = 0; - size_t byte_size = 0; lldb::user_id_t encoding_uid = LLDB_INVALID_UID; if (num_attributes > 0) @@ -2758,47 +2766,21 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, switch (tag) { default: + break; + case DW_TAG_base_type: + resolve_state = Type::eResolveStateFull; clang_type = ast.GetBuiltinTypeForDWARFEncodingAndBitSize (type_name_cstr, encoding, byte_size * 8); break; - case DW_TAG_pointer_type: - // The encoding_uid will be embedded into the - // Type object and will be looked up when the Type::GetClangType() - encoding_data_type = Type::eEncodingIsPointerUID; - break; - - case DW_TAG_reference_type: - // The encoding_uid will be embedded into the - // Type object and will be looked up when the Type::GetClangType() - encoding_data_type = Type::eEncodingIsLValueReferenceUID; - break; - - case DW_TAG_typedef: - // The encoding_uid will be embedded into the - // Type object and will be looked up when the Type::GetClangType() - encoding_data_type = Type::eEncodingIsTypedefUID; - break; - - case DW_TAG_const_type: - // The encoding_uid will be embedded into the - // Type object and will be looked up when the Type::GetClangType() - encoding_data_type = Type::eEncodingIsConstUID; //ClangASTContext::AddConstModifier (clang_type); - break; - - case DW_TAG_restrict_type: - // The encoding_uid will be embedded into the - // Type object and will be looked up when the Type::GetClangType() - encoding_data_type = Type::eEncodingIsRestrictUID; //ClangASTContext::AddRestrictModifier (clang_type); - break; - - case DW_TAG_volatile_type: - // The encoding_uid will be embedded into the - // Type object and will be looked up when the Type::GetClangType() - encoding_data_type = Type::eEncodingIsVolatileUID; //ClangASTContext::AddVolatileModifier (clang_type); - break; + case DW_TAG_pointer_type: encoding_data_type = Type::eEncodingIsPointerUID; break; + case DW_TAG_reference_type: encoding_data_type = Type::eEncodingIsLValueReferenceUID; break; + case DW_TAG_typedef: encoding_data_type = Type::eEncodingIsTypedefUID; break; + case DW_TAG_const_type: encoding_data_type = Type::eEncodingIsConstUID; break; + case DW_TAG_restrict_type: encoding_data_type = Type::eEncodingIsRestrictUID; break; + case DW_TAG_volatile_type: encoding_data_type = Type::eEncodingIsVolatileUID; break; } if (type_name_cstr != NULL && sc.comp_unit != NULL && @@ -2811,14 +2793,18 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, if (type_name_const_str == g_objc_type_name_id) { clang_type = ast.GetBuiltInType_objc_id(); + resolve_state = Type::eResolveStateFull; + } else if (type_name_const_str == g_objc_type_name_Class) { clang_type = ast.GetBuiltInType_objc_Class(); + resolve_state = Type::eResolveStateFull; } else if (type_name_const_str == g_objc_type_name_selector) { clang_type = ast.GetBuiltInType_objc_selector(); + resolve_state = Type::eResolveStateFull; } } @@ -2831,7 +2817,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, encoding_data_type, &decl, clang_type, - clang_type == NULL)); + resolve_state)); m_die_to_type[die] = type_sp.get(); @@ -2853,10 +2839,8 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, // Set a bit that lets us know that we are currently parsing this m_die_to_type[die] = DIE_IS_BEING_PARSED; - size_t byte_size = 0; LanguageType class_language = eLanguageTypeUnknown; //bool struct_is_class = false; - Declaration decl; const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); if (num_attributes > 0) { @@ -2974,7 +2958,6 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, // parameters in any class methods need it for the clang // types for function prototypes. m_die_to_decl_ctx[die] = ClangASTContext::GetDeclContextForType (clang_type); - const bool is_forward_decl = die->HasChildren(); type_sp.reset (new Type (die->GetOffset(), this, type_name_const_str, @@ -2984,7 +2967,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, Type::eEncodingIsUID, &decl, clang_type, - is_forward_decl)); + Type::eResolveStateForward)); m_die_to_type[die] = type_sp.get(); @@ -3013,9 +2996,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, // Set a bit that lets us know that we are currently parsing this m_die_to_type[die] = DIE_IS_BEING_PARSED; - size_t byte_size = 0; lldb::user_id_t encoding_uid = DW_INVALID_OFFSET; - Declaration decl; const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); if (num_attributes > 0) @@ -3086,7 +3067,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, Type::eEncodingIsUID, &decl, clang_type, - true)); + Type::eResolveStateForward)); m_die_to_type[die] = type_sp.get(); @@ -3111,7 +3092,6 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const char *mangled = NULL; dw_offset_t type_die_offset = DW_INVALID_OFFSET; - Declaration decl; bool is_variadic = false; bool is_inline = false; bool is_static = false; @@ -3202,7 +3182,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, func_type = ResolveTypeUID(type_die_offset); if (func_type) - return_clang_type = func_type->GetClangForwardType(); + return_clang_type = func_type->GetClangLayoutType(); else return_clang_type = ast.GetBuiltInType_void(); @@ -3339,7 +3319,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, Type::eEncodingIsUID, &decl, clang_type, - false)); + Type::eResolveStateFull)); m_die_to_type[die] = type_sp.get(); assert(type_sp.get()); @@ -3351,9 +3331,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, // Set a bit that lets us know that we are currently parsing this m_die_to_type[die] = DIE_IS_BEING_PARSED; - size_t byte_size = 0; lldb::user_id_t type_die_offset = DW_INVALID_OFFSET; - Declaration decl; int64_t first_index = 0; uint32_t byte_stride = 0; uint32_t bit_stride = 0; @@ -3432,11 +3410,12 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, empty_name, array_element_bit_stride / 8, NULL, - LLDB_INVALID_UID, + type_die_offset, Type::eEncodingIsUID, &decl, clang_type, - false)); + Type::eResolveStateFull)); + type_sp->SetEncodingType (element_type); m_die_to_type[die] = type_sp.get(); } } @@ -3471,14 +3450,14 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, Type *pointee_type = ResolveTypeUID(type_die_offset); Type *class_type = ResolveTypeUID(containing_type_die_offset); - clang_type_t pointee_clang_type = pointee_type->GetClangType(); - clang_type_t class_clang_type = class_type->GetClangType(); + clang_type_t pointee_clang_type = pointee_type->GetClangForwardType(); + clang_type_t class_clang_type = class_type->GetClangLayoutType(); clang_type = ast.CreateMemberPointerType(pointee_clang_type, class_clang_type); - size_t byte_size = ClangASTType::GetClangTypeBitWidth (ast.getASTContext(), - clang_type) / 8; + byte_size = ClangASTType::GetClangTypeBitWidth (ast.getASTContext(), + clang_type) / 8; type_sp.reset( new Type (die->GetOffset(), this, @@ -3489,7 +3468,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, Type::eEncodingIsUID, NULL, clang_type, - false)); + Type::eResolveStateForward)); m_die_to_type[die] = type_sp.get(); } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index a92fbdddcd2..1106b2404ea 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -110,7 +110,7 @@ public: virtual uint32_t FindTypes (const lldb_private::SymbolContext& sc, const lldb_private::ConstString &name, bool append, uint32_t max_matches, lldb_private::TypeList& types); // virtual uint32_t FindTypes(const lldb_private::SymbolContext& sc, const lldb_private::RegularExpression& regex, bool append, uint32_t max_matches, lldb::Type::Encoding encoding, lldb::user_id_t udt_uid, lldb_private::TypeList& types); virtual lldb_private::TypeList *GetTypeList (); - virtual clang::NamespaceDecl * + virtual lldb_private::ClangNamespaceDecl FindNamespace (const lldb_private::SymbolContext& sc, const lldb_private::ConstString &name); diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index 7d4607e0155..a8f376331aa 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -953,11 +953,11 @@ SymbolFileDWARFDebugMap::FindTypes //} -clang::NamespaceDecl * +ClangNamespaceDecl SymbolFileDWARFDebugMap::FindNamespace (const lldb_private::SymbolContext& sc, const lldb_private::ConstString &name) { - clang::NamespaceDecl *matching_namespace = NULL; + ClangNamespaceDecl matching_namespace; SymbolFileDWARF *oso_dwarf; if (sc.comp_unit) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h index 88aceb22e7f..5ab88dc3be1 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -71,7 +71,7 @@ public: virtual uint32_t FindFunctions (const lldb_private::RegularExpression& regex, bool append, lldb_private::SymbolContextList& sc_list); virtual uint32_t FindTypes (const lldb_private::SymbolContext& sc, const lldb_private::ConstString &name, bool append, uint32_t max_matches, lldb_private::TypeList& types); // virtual uint32_t FindTypes (const lldb_private::SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, lldb::user_id_t udt_uid, TypeList& types); - virtual clang::NamespaceDecl * + virtual lldb_private::ClangNamespaceDecl FindNamespace (const lldb_private::SymbolContext& sc, const lldb_private::ConstString &name); diff --git a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp index 9a8d6f35ed5..56141bc73c0 100644 --- a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp +++ b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp @@ -277,10 +277,10 @@ SymbolFileSymtab::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_Typ return NULL; } -clang::NamespaceDecl * +ClangNamespaceDecl SymbolFileSymtab::FindNamespace (const SymbolContext& sc, const ConstString &name) { - return NULL; + return ClangNamespaceDecl(); } uint32_t diff --git a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h index 0bd4e7fc4ec..fc6a52c216a 100644 --- a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h +++ b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h @@ -101,7 +101,7 @@ public: // virtual uint32_t // FindTypes(const lldb_private::SymbolContext& sc, const lldb_private::RegularExpression& regex, bool append, uint32_t max_matches, lldb_private::TypeList& types); - virtual clang::NamespaceDecl * + virtual lldb_private::ClangNamespaceDecl FindNamespace (const lldb_private::SymbolContext& sc, const lldb_private::ConstString &name); diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index 363b1af6e8b..a7fe230d08d 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -740,6 +740,23 @@ ClangASTContext::CopyType (ASTContext *dest_context, return dst.getAsOpaquePtr(); } + +clang::Decl * +ClangASTContext::CopyDecl (ASTContext *dest_context, + ASTContext *source_context, + clang::Decl *source_decl) +{ + // null_client's ownership is transferred to diagnostics + NullDiagnosticClient *null_client = new NullDiagnosticClient; + Diagnostic diagnostics(null_client); + FileManager file_manager; + ASTImporter importer(diagnostics, + *dest_context, file_manager, + *source_context, file_manager); + + return importer.Import(source_decl); +} + bool ClangASTContext::AreTypesSame(ASTContext *ast_context, clang_type_t type1, diff --git a/lldb/source/Symbol/ClangNamespaceDecl.cpp b/lldb/source/Symbol/ClangNamespaceDecl.cpp new file mode 100644 index 00000000000..9e764ba1cd9 --- /dev/null +++ b/lldb/source/Symbol/ClangNamespaceDecl.cpp @@ -0,0 +1,11 @@ +//===-- ClangNamespaceDecl.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/Symbol/ClangNamespaceDecl.h" + diff --git a/lldb/source/Symbol/Function.cpp b/lldb/source/Symbol/Function.cpp index e89782dd3c2..373d5e6c2a1 100644 --- a/lldb/source/Symbol/Function.cpp +++ b/lldb/source/Symbol/Function.cpp @@ -413,8 +413,18 @@ Function::GetReturnType () CalculateSymbolContext (&sc); // Null out everything below the CompUnit 'cause we don't actually know these. - size_t bit_size = ClangASTType::GetClangTypeBitWidth ((GetType()->GetClangASTContext().getASTContext()), fun_return_qualtype.getAsOpaquePtr()); - Type return_type (0, GetType()->GetSymbolFile(), fun_return_name, bit_size, sc.comp_unit, 0, Type::eEncodingIsSyntheticUID, Declaration(), fun_return_qualtype.getAsOpaquePtr(), false); + size_t bit_size = ClangASTType::GetClangTypeBitWidth (GetType()->GetClangASTContext().getASTContext(), + fun_return_qualtype.getAsOpaquePtr()); + Type return_type (0, + GetType()->GetSymbolFile(), + fun_return_name, + bit_size, + sc.comp_unit, + 0, + Type::eEncodingIsSyntheticUID, + Declaration(), + fun_return_qualtype.getAsOpaquePtr(), + Type::eResolveStateFull); return return_type; } @@ -455,7 +465,16 @@ Function::GetArgumentTypeAtIndex (size_t idx) // Null out everything below the CompUnit 'cause we don't actually know these. size_t bit_size = ClangASTType::GetClangTypeBitWidth ((GetType()->GetClangASTContext().getASTContext()), arg_qualtype.getAsOpaquePtr()); - Type arg_type (0, GetType()->GetSymbolFile(), arg_return_name, bit_size, sc.comp_unit, 0, Type::eEncodingIsSyntheticUID, Declaration(), arg_qualtype.getAsOpaquePtr(), false); + Type arg_type (0, + GetType()->GetSymbolFile(), + arg_return_name, + bit_size, + sc.comp_unit, + 0, + Type::eEncodingIsSyntheticUID, + Declaration(), + arg_qualtype.getAsOpaquePtr(), + Type::eResolveStateFull); return arg_type; } diff --git a/lldb/source/Symbol/SymbolContext.cpp b/lldb/source/Symbol/SymbolContext.cpp index 2ac99a0c619..2f5ff3a2434 100644 --- a/lldb/source/Symbol/SymbolContext.cpp +++ b/lldb/source/Symbol/SymbolContext.cpp @@ -400,6 +400,14 @@ SymbolContext::GetAddressRange (uint32_t scope, AddressRange &range) const return false; } +ClangNamespaceDecl +SymbolContext::FindNamespace (const ConstString &name) const +{ + ClangNamespaceDecl namespace_decl; + if (module_sp) + namespace_decl = module_sp->GetSymbolVendor()->FindNamespace (*this, name); + return namespace_decl; +} size_t SymbolContext::FindFunctionsByName (const ConstString &name, bool append, SymbolContextList &sc_list) const @@ -422,12 +430,12 @@ SymbolContext::FindFunctionsByName (const ConstString &name, bool append, Symbol return sc_list.GetSize(); } -lldb::VariableSP -SymbolContext::FindVariableByName (const char *name) const -{ - lldb::VariableSP return_value; - return return_value; -} +//lldb::VariableSP +//SymbolContext::FindVariableByName (const char *name) const +//{ +// lldb::VariableSP return_value; +// return return_value; +//} lldb::TypeSP SymbolContext::FindTypeByName (const ConstString &name) const diff --git a/lldb/source/Symbol/SymbolVendor.cpp b/lldb/source/Symbol/SymbolVendor.cpp index d960dde30e6..f2a3681f535 100644 --- a/lldb/source/Symbol/SymbolVendor.cpp +++ b/lldb/source/Symbol/SymbolVendor.cpp @@ -261,22 +261,16 @@ SymbolVendor::FindTypes (const SymbolContext& sc, const ConstString &name, bool types.Clear(); return 0; } -// -//uint32_t -//SymbolVendor::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types) -//{ -// Mutex::Locker locker(m_mutex); -// if (m_sym_file_ap.get()) -// { -// lldb::user_id_t udt_uid = LLDB_INVALID_UID; -// -// if (encoding == Type::user_defined_type) -// udt_uid = UserDefType::GetUserDefTypeUID(udt_name); -// -// return m_sym_file_ap->FindTypes(sc, regex, append, max_matches, encoding, udt_uid, types); -// } -// return 0; -//} + +ClangNamespaceDecl +SymbolVendor::FindNamespace(const SymbolContext& sc, const ConstString &name) +{ + Mutex::Locker locker(m_mutex); + ClangNamespaceDecl namespace_decl; + if (m_sym_file_ap.get()) + namespace_decl = m_sym_file_ap->FindNamespace (sc, name); + return namespace_decl; +} void SymbolVendor::Dump(Stream *s) diff --git a/lldb/source/Symbol/Type.cpp b/lldb/source/Symbol/Type.cpp index 111ec89d691..e99b1a09f20 100644 --- a/lldb/source/Symbol/Type.cpp +++ b/lldb/source/Symbol/Type.cpp @@ -39,7 +39,7 @@ lldb_private::Type::Type EncodingDataType encoding_data_type, const Declaration& decl, clang_type_t clang_type, - bool is_forward_decl + ResolveState clang_type_resolve_state ) : UserID (uid), m_name (name), @@ -51,9 +51,7 @@ lldb_private::Type::Type m_byte_size (byte_size), m_decl (decl), m_clang_type (clang_type), - m_is_forward_decl (is_forward_decl), - m_encoding_type_forward_decl_resolved (false), - m_encoding_type_decl_resolved (false) + m_clang_type_resolve_state (clang_type ? clang_type_resolve_state : eResolveStateUnresolved) { } @@ -66,9 +64,9 @@ lldb_private::Type::Type () : m_encoding_uid_type (eEncodingInvalid), m_encoding_uid (0), m_byte_size (0), - m_is_forward_decl (false), m_decl (), - m_clang_type (NULL) + m_clang_type (NULL), + m_clang_type_resolve_state (eResolveStateUnresolved) { } @@ -86,9 +84,9 @@ lldb_private::Type::operator= (const Type& rhs) m_encoding_uid_type = rhs.m_encoding_uid_type; m_encoding_uid = rhs.m_encoding_uid; m_byte_size = rhs.m_byte_size; - m_is_forward_decl = rhs.m_is_forward_decl; m_decl = rhs.m_decl; m_clang_type = rhs.m_clang_type; + m_clang_type_resolve_state = rhs.m_clang_type_resolve_state; } return *this; } @@ -190,7 +188,7 @@ lldb_private::Type::GetName() { if (!(m_name)) { - if (ResolveClangType(true)) + if (ResolveClangType(eResolveStateForward)) { std::string type_name = ClangASTContext::GetTypeName (m_clang_type); if (!type_name.empty()) @@ -220,7 +218,7 @@ lldb_private::Type::DumpValue lldb::Format format ) { - if (ResolveClangType(true)) + if (ResolveClangType(eResolveStateForward)) { if (show_types) { @@ -251,11 +249,8 @@ lldb_private::Type::DumpValue lldb_private::Type * lldb_private::Type::GetEncodingType () { - if (m_encoding_type == NULL) - { - if (m_encoding_uid != LLDB_INVALID_UID) - m_encoding_type = m_symbol_file->ResolveTypeUID(m_encoding_uid); - } + if (m_encoding_type == NULL && m_encoding_uid != LLDB_INVALID_UID) + m_encoding_type = m_symbol_file->ResolveTypeUID(m_encoding_uid); return m_encoding_type; } @@ -279,7 +274,7 @@ lldb_private::Type::GetByteSize() m_byte_size = encoding_type->GetByteSize(); if (m_byte_size == 0) { - uint64_t bit_width = ClangASTType::GetClangTypeBitWidth (GetClangAST(), GetClangType()); + uint64_t bit_width = ClangASTType::GetClangTypeBitWidth (GetClangAST(), GetClangLayoutType()); m_byte_size = (bit_width + 7 ) / 8; } } @@ -300,7 +295,7 @@ lldb_private::Type::GetByteSize() uint32_t lldb_private::Type::GetNumChildren (bool omit_empty_base_classes) { - if (!ResolveClangType()) + if (!ResolveClangType(eResolveStateFull)) return 0; return ClangASTContext::GetNumChildren (m_clang_type, omit_empty_base_classes); @@ -309,7 +304,7 @@ lldb_private::Type::GetNumChildren (bool omit_empty_base_classes) bool lldb_private::Type::IsAggregateType () { - if (ResolveClangType()) + if (ResolveClangType(eResolveStateForward)) return ClangASTContext::IsAggregateType (m_clang_type); return false; } @@ -318,7 +313,7 @@ lldb::Format lldb_private::Type::GetFormat () { // Make sure we resolve our type if it already hasn't been. - if (!ResolveClangType()) + if (!ResolveClangType(eResolveStateForward)) return lldb::eFormatInvalid; return lldb_private::ClangASTType::GetFormat (m_clang_type); } @@ -329,7 +324,7 @@ lldb::Encoding lldb_private::Type::GetEncoding (uint32_t &count) { // Make sure we resolve our type if it already hasn't been. - if (!ResolveClangType()) + if (!ResolveClangType(eResolveStateForward)) return lldb::eEncodingInvalid; return lldb_private::ClangASTType::GetEncoding (m_clang_type, count); @@ -422,18 +417,23 @@ lldb_private::Type::GetDeclaration () const } bool -lldb_private::Type::ResolveClangType (bool forward_decl_is_ok) +lldb_private::Type::ResolveClangType (ResolveState clang_type_resolve_state) { + Type *encoding_type = NULL; if (m_clang_type == NULL) { TypeList *type_list = GetTypeList(); - Type *encoding_type = GetEncodingType(); + encoding_type = GetEncodingType(); if (encoding_type) { switch (m_encoding_uid_type) { case eEncodingIsUID: - m_clang_type = encoding_type->GetClangType(); + if (encoding_type->ResolveClangType(clang_type_resolve_state)) + { + m_clang_type = encoding_type->m_clang_type; + m_clang_type_resolve_state = encoding_type->m_clang_type_resolve_state; + } break; case eEncodingIsConstUID: @@ -518,11 +518,9 @@ lldb_private::Type::ResolveClangType (bool forward_decl_is_ok) } // Check if we have a forward reference to a class/struct/union/enum? - if (m_clang_type != NULL && - m_is_forward_decl == true && - forward_decl_is_ok == false) + if (m_clang_type && m_clang_type_resolve_state < clang_type_resolve_state) { - m_is_forward_decl = false; + m_clang_type_resolve_state = eResolveStateFull; if (!ClangASTType::IsDefined (m_clang_type)) { // We have a forward declaration, we need to resolve it to a complete @@ -533,45 +531,25 @@ lldb_private::Type::ResolveClangType (bool forward_decl_is_ok) // If we have an encoding type, then we need to make sure it is // resolved appropriately. - if (m_encoding_type_decl_resolved == false) + if (m_encoding_uid != LLDB_INVALID_UID) { - if ((forward_decl_is_ok == true && !m_encoding_type_forward_decl_resolved) || - (forward_decl_is_ok == false)) + if (encoding_type == NULL) + encoding_type = GetEncodingType(); + if (encoding_type) { - Type *encoding_type = GetEncodingType (); - if (encoding_type != NULL) - { - bool forward_decl_is_ok_for_encoding = forward_decl_is_ok; -// switch (m_encoding_uid_type) -// { -// case eEncodingIsPointerUID: -// case eEncodingIsLValueReferenceUID: -// case eEncodingIsRValueReferenceUID: -// forward_decl_is_ok_for_encoding = true; -// break; -// default: -// break; -// } - - if (encoding_type->ResolveClangType (forward_decl_is_ok_for_encoding)) - { - // We have at least resolve the forward declaration for our - // encoding type... - m_encoding_type_forward_decl_resolved = true; - - // Check if we fully resolved our encoding type, and if so - // mark it as having been completely resolved. - if (forward_decl_is_ok_for_encoding == false) - m_encoding_type_decl_resolved = true; - } - } - else + ResolveState encoding_clang_type_resolve_state = eResolveStateFull; + switch (m_encoding_uid_type) { - // We don't have an encoding type, so mark everything as being - // resolved so we don't get into this if statement again - m_encoding_type_decl_resolved = true; - m_encoding_type_forward_decl_resolved = true; + case eEncodingIsPointerUID: + case eEncodingIsLValueReferenceUID: + case eEncodingIsRValueReferenceUID: + if (clang_type_resolve_state == eResolveStateLayout) + encoding_clang_type_resolve_state = eResolveStateForward; + break; + default: + break; } + encoding_type->ResolveClangType (encoding_clang_type_resolve_state); } } return m_clang_type != NULL; @@ -592,29 +570,30 @@ lldb_private::Type::GetChildClangTypeAtIndex bool &child_is_base_class ) { - if (!ResolveClangType()) - return NULL; - - std::string name_str; - clang_type_t child_qual_type = GetClangASTContext().GetChildClangTypeAtIndex ( - parent_name, - m_clang_type, - idx, - transparent_pointers, - omit_empty_base_classes, - name_str, - child_byte_size, - child_byte_offset, - child_bitfield_bit_size, - child_bitfield_bit_offset, - child_is_base_class); - - if (child_qual_type) + clang_type_t child_qual_type = NULL; + + if (GetClangType()) { - if (!name_str.empty()) - name.SetCString(name_str.c_str()); - else - name.Clear(); + std::string name_str; + child_qual_type = GetClangASTContext().GetChildClangTypeAtIndex (parent_name, + m_clang_type, + idx, + transparent_pointers, + omit_empty_base_classes, + name_str, + child_byte_size, + child_byte_offset, + child_bitfield_bit_size, + child_bitfield_bit_offset, + child_is_base_class); + + if (child_qual_type) + { + if (!name_str.empty()) + name.SetCString(name_str.c_str()); + else + name.Clear(); + } } return child_qual_type; } @@ -623,16 +602,21 @@ lldb_private::Type::GetChildClangTypeAtIndex clang_type_t lldb_private::Type::GetClangType () { - const bool forward_decl_is_ok = false; - ResolveClangType(forward_decl_is_ok); + ResolveClangType(eResolveStateFull); + return m_clang_type; +} + +clang_type_t +lldb_private::Type::GetClangLayoutType () +{ + ResolveClangType(eResolveStateLayout); return m_clang_type; } clang_type_t lldb_private::Type::GetClangForwardType () { - const bool forward_decl_is_ok = true; - ResolveClangType (forward_decl_is_ok); + ResolveClangType (eResolveStateForward); return m_clang_type; } diff --git a/lldb/source/Target/ThreadPlanTracer.cpp b/lldb/source/Target/ThreadPlanTracer.cpp index f77d0fac197..665aac590e2 100644 --- a/lldb/source/Target/ThreadPlanTracer.cpp +++ b/lldb/source/Target/ThreadPlanTracer.cpp @@ -245,7 +245,7 @@ void ThreadPlanAssemblyTracer::Log () { Value value; value.SetValueType (Value::eValueTypeScalar); - value.SetContext (Value::eContextTypeOpaqueClangQualType, m_intptr_type.GetOpaqueQualType()); + value.SetContext (Value::eContextTypeClangType, m_intptr_type.GetOpaqueQualType()); value_list.PushValue (value); } |

