124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SymbolFileDWARF.cpp ------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTConsumer.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTContext.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/Decl.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/DeclGroup.h" 172546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham#include "clang/AST/DeclObjC.h" 18b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton#include "clang/AST/DeclTemplate.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/Builtins.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/IdentifierTable.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/LangOptions.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/SourceManager.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetInfo.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/Specifiers.h" 252403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton#include "clang/Sema/DeclSpec.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan#include "llvm/Support/Casting.h" 289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Scalar.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Section.h" 3474124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton#include "lldb/Core/StreamFile.h" 35545489247a7b520dd603c9e5b0f0ef05a77ba9e3Jim Ingham#include "lldb/Core/StreamString.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Value.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 399f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton#include "lldb/Host/Host.h" 409f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Block.h" 42b01000fd063629facd45044f137446fb748ee179Greg Clayton#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h" 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h" 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/LineTable.h" 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h" 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h" 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham#include "lldb/Target/ObjCLanguageRuntime.h" 508b7b2276132c7353cabd22000287b42badc26613Jim Ingham#include "lldb/Target/CPPLanguageRuntime.h" 51fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFCompileUnit.h" 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugAbbrev.h" 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugAranges.h" 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugInfo.h" 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugInfoEntry.h" 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugLine.h" 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugPubnames.h" 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugRanges.h" 60cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton#include "DWARFDeclContext.h" 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDIECollection.h" 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFFormValue.h" 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFLocationList.h" 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "LogChannelDWARF.h" 65ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton#include "SymbolFileDWARFDebugMap.h" 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map> 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6907c55d1cd52dba2915e93481bb3c87076a80374cGreg Clayton//#define ENABLE_DEBUG_PRINTF // COMMENT OUT THIS LINE PRIOR TO CHECKIN 70b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton 71b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton#ifdef ENABLE_DEBUG_PRINTF 72b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton#include <stdio.h> 73b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton#define DEBUG_PRINTF(fmt, ...) printf(fmt, ## __VA_ARGS__) 74b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton#else 75b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton#define DEBUG_PRINTF(fmt, ...) 76b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton#endif 77b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton 784fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton#define DIE_IS_BEING_PARSED ((lldb_private::Type*)1) 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 833356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton//static inline bool 843356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton//child_requires_parent_class_union_or_struct_to_be_completed (dw_tag_t tag) 853356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton//{ 863356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// switch (tag) 873356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// { 883356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// default: 893356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// break; 903356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// case DW_TAG_subprogram: 913356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// case DW_TAG_inlined_subroutine: 923356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// case DW_TAG_class_type: 933356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// case DW_TAG_structure_type: 943356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// case DW_TAG_union_type: 953356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// return true; 963356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// } 973356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// return false; 983356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton//} 993356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// 10070a4f92d0e5f605c8ed1662fa959d465c96b0fb9Sean Callananstatic AccessType 10184f8075072eef306234f8109573067647735c111Greg ClaytonDW_ACCESS_to_AccessType (uint32_t dwarf_accessibility) 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (dwarf_accessibility) 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10570a4f92d0e5f605c8ed1662fa959d465c96b0fb9Sean Callanan case DW_ACCESS_public: return eAccessPublic; 10670a4f92d0e5f605c8ed1662fa959d465c96b0fb9Sean Callanan case DW_ACCESS_private: return eAccessPrivate; 10770a4f92d0e5f605c8ed1662fa959d465c96b0fb9Sean Callanan case DW_ACCESS_protected: return eAccessProtected; 10884f8075072eef306234f8109573067647735c111Greg Clayton default: break; 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11070a4f92d0e5f605c8ed1662fa959d465c96b0fb9Sean Callanan return eAccessNone; 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 113e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton#if defined(LLDB_CONFIGURATION_DEBUG) or defined(LLDB_CONFIGURATION_RELEASE) 114e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton 115e7a8e4621a0b74997ad564a9288800f752208dabGreg Claytonclass DIEStack 116e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton{ 117e7a8e4621a0b74997ad564a9288800f752208dabGreg Claytonpublic: 118e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton 119e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton void Push (DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die) 120e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton { 121e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton m_dies.push_back (DIEInfo(cu, die)); 122e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton } 123e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton 124e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton 125e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton void LogDIEs (Log *log, SymbolFileDWARF *dwarf) 126e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton { 127e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton StreamString log_strm; 128e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton const size_t n = m_dies.size(); 1295f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log_strm.Printf("DIEStack[%" PRIu64 "]:\n", (uint64_t)n); 130e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton for (size_t i=0; i<n; i++) 131e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton { 132e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton DWARFCompileUnit *cu = m_dies[i].cu; 133e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton const DWARFDebugInfoEntry *die = m_dies[i].die; 134e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton std::string qualified_name; 135e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton die->GetQualifiedName(dwarf, cu, qualified_name); 1365f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log_strm.Printf ("[%" PRIu64 "] 0x%8.8x: %s name='%s'\n", 137851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton (uint64_t)i, 138e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton die->GetOffset(), 139e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton DW_TAG_value_to_name(die->Tag()), 140e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton qualified_name.c_str()); 141e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton } 142e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton log->PutCString(log_strm.GetData()); 143e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton } 144e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton void Pop () 145e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton { 146e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton m_dies.pop_back(); 147e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton } 148e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton 149e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton class ScopedPopper 150e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton { 151e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton public: 152e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton ScopedPopper (DIEStack &die_stack) : 153e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton m_die_stack (die_stack), 154e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton m_valid (false) 155e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton { 156e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton } 157e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton 158e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton void 159e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton Push (DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die) 160e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton { 161e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton m_valid = true; 162e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton m_die_stack.Push (cu, die); 163e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton } 164e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton 165e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton ~ScopedPopper () 166e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton { 167e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton if (m_valid) 168e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton m_die_stack.Pop(); 169e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton } 170e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton 171e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton 172e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton 173e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton protected: 174e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton DIEStack &m_die_stack; 175e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton bool m_valid; 176e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton }; 177e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton 178e7a8e4621a0b74997ad564a9288800f752208dabGreg Claytonprotected: 179e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton struct DIEInfo { 180e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton DIEInfo (DWARFCompileUnit *c, const DWARFDebugInfoEntry *d) : 181e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton cu(c), 182e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton die(d) 183e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton { 184e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton } 185e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton DWARFCompileUnit *cu; 186e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton const DWARFDebugInfoEntry *die; 187e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton }; 188e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton typedef std::vector<DIEInfo> Stack; 189e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton Stack m_dies; 190e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton}; 191e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton#endif 192e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::Initialize() 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelDWARF::Initialize(); 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PluginManager::RegisterPlugin (GetPluginNameStatic(), 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginDescriptionStatic(), 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CreateInstance); 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::Terminate() 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PluginManager::UnregisterPlugin (CreateInstance); 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogChannelDWARF::Initialize(); 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2100e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::GetPluginNameStatic() 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2130e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static ConstString g_name("dwarf"); 2140e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return g_name; 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::GetPluginDescriptionStatic() 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return "DWARF and DWARF3 debug symbol file reader."; 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFile* 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::CreateInstance (ObjectFile* obj_file) 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return new SymbolFileDWARF(obj_file); 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 230e98ac25604b3d967158917f6fdd5289b3096fd80Greg ClaytonTypeList * 231e98ac25604b3d967158917f6fdd5289b3096fd80Greg ClaytonSymbolFileDWARF::GetTypeList () 232e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton{ 23349ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (GetDebugMapSymfile ()) 234e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton return m_debug_map_symfile->GetTypeList(); 235e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton return m_obj_file->GetModule()->GetTypeList(); 236e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton 237e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton} 238a8b56238ce138e70433a0ce0b4218c9257beae38Greg Claytonvoid 239a8b56238ce138e70433a0ce0b4218c9257beae38Greg ClaytonSymbolFileDWARF::GetTypes (DWARFCompileUnit* cu, 240a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton const DWARFDebugInfoEntry *die, 241a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton dw_offset_t min_die_offset, 242a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton dw_offset_t max_die_offset, 243a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton uint32_t type_mask, 244a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton TypeSet &type_set) 245a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton{ 246a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (cu) 247a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 248a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (die) 249a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 250a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton const dw_offset_t die_offset = die->GetOffset(); 251a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 252a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (die_offset >= max_die_offset) 253a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton return; 254a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 255a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (die_offset >= min_die_offset) 256a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 257a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton const dw_tag_t tag = die->Tag(); 258a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 259a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton bool add_type = false; 260a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 261a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton switch (tag) 262a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 263a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton case DW_TAG_array_type: add_type = (type_mask & eTypeClassArray ) != 0; break; 264a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton case DW_TAG_unspecified_type: 265a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton case DW_TAG_base_type: add_type = (type_mask & eTypeClassBuiltin ) != 0; break; 266a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton case DW_TAG_class_type: add_type = (type_mask & eTypeClassClass ) != 0; break; 267a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton case DW_TAG_structure_type: add_type = (type_mask & eTypeClassStruct ) != 0; break; 268a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton case DW_TAG_union_type: add_type = (type_mask & eTypeClassUnion ) != 0; break; 269a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton case DW_TAG_enumeration_type: add_type = (type_mask & eTypeClassEnumeration ) != 0; break; 270a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton case DW_TAG_subroutine_type: 271a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton case DW_TAG_subprogram: 272a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton case DW_TAG_inlined_subroutine: add_type = (type_mask & eTypeClassFunction ) != 0; break; 273a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton case DW_TAG_pointer_type: add_type = (type_mask & eTypeClassPointer ) != 0; break; 274a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton case DW_TAG_rvalue_reference_type: 275a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton case DW_TAG_reference_type: add_type = (type_mask & eTypeClassReference ) != 0; break; 276a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton case DW_TAG_typedef: add_type = (type_mask & eTypeClassTypedef ) != 0; break; 277a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton case DW_TAG_ptr_to_member_type: add_type = (type_mask & eTypeClassMemberPointer ) != 0; break; 278a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 279a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 280a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (add_type) 281a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 282a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton const bool assert_not_being_parsed = true; 283a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton Type *type = ResolveTypeUID (cu, die, assert_not_being_parsed); 284a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (type) 285a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 286a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (type_set.find(type) == type_set.end()) 287a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton type_set.insert(type); 288a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 289a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 290a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 291a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 292a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton for (const DWARFDebugInfoEntry *child_die = die->GetFirstChild(); 293a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton child_die != NULL; 294a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton child_die = child_die->GetSibling()) 295a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 296a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton GetTypes (cu, child_die, min_die_offset, max_die_offset, type_mask, type_set); 297a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 298a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 299a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 300a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton} 301a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 302a8b56238ce138e70433a0ce0b4218c9257beae38Greg Claytonsize_t 303a8b56238ce138e70433a0ce0b4218c9257beae38Greg ClaytonSymbolFileDWARF::GetTypes (SymbolContextScope *sc_scope, 304a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton uint32_t type_mask, 305a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton TypeList &type_list) 306a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 307a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton{ 308a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton TypeSet type_set; 309a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 310a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton CompileUnit *comp_unit = NULL; 311a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton DWARFCompileUnit* dwarf_cu = NULL; 312a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (sc_scope) 313a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton comp_unit = sc_scope->CalculateSymbolContextCompileUnit(); 314a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 315a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (comp_unit) 316a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 317a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton dwarf_cu = GetDWARFCompileUnit(comp_unit); 318a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (dwarf_cu == 0) 319a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton return 0; 320a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton GetTypes (dwarf_cu, 321a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton dwarf_cu->DIE(), 322a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton dwarf_cu->GetOffset(), 323a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton dwarf_cu->GetNextCompileUnitOffset(), 324a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton type_mask, 325a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton type_set); 326a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 327a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton else 328a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 329a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton DWARFDebugInfo* info = DebugInfo(); 330a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (info) 331a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 332a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton const size_t num_cus = info->GetNumCompileUnits(); 333a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton for (size_t cu_idx=0; cu_idx<num_cus; ++cu_idx) 334a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 335a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton dwarf_cu = info->GetCompileUnitAtIndex(cu_idx); 336a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (dwarf_cu) 337a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 338a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton GetTypes (dwarf_cu, 339a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton dwarf_cu->DIE(), 340a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 0, 341a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton UINT32_MAX, 342a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton type_mask, 343a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton type_set); 344a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 345a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 346a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 347a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 348a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// if (m_using_apple_tables) 349a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// { 350a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// DWARFMappedHash::MemoryTable *apple_types = m_apple_types_ap.get(); 351a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// if (apple_types) 352a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// { 353a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// apple_types->ForEach([this, &type_set, apple_types, type_mask](const DWARFMappedHash::DIEInfoArray &die_info_array) -> bool { 354a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// 355a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// for (auto die_info: die_info_array) 356a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// { 357a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// bool add_type = TagMatchesTypeMask (type_mask, 0); 358a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// if (!add_type) 359a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// { 360a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// dw_tag_t tag = die_info.tag; 361a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// if (tag == 0) 362a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// { 363a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// const DWARFDebugInfoEntry *die = DebugInfo()->GetDIEPtr(die_info.offset, NULL); 364a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// tag = die->Tag(); 365a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// } 366a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// add_type = TagMatchesTypeMask (type_mask, tag); 367a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// } 368a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// if (add_type) 369a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// { 370a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// Type *type = ResolveTypeUID(die_info.offset); 371a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// 372a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// if (type_set.find(type) == type_set.end()) 373a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// type_set.insert(type); 374a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// } 375a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// } 376a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// return true; // Keep iterating 377a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// }); 378a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// } 379a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// } 380a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// else 381a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// { 382a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// if (!m_indexed) 383a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// Index (); 384a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// 385a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// m_type_index.ForEach([this, &type_set, type_mask](const char *name, uint32_t die_offset) -> bool { 386a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// 387a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// bool add_type = TagMatchesTypeMask (type_mask, 0); 388a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// 389a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// if (!add_type) 390a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// { 391a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// const DWARFDebugInfoEntry *die = DebugInfo()->GetDIEPtr(die_offset, NULL); 392a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// if (die) 393a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// { 394a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// const dw_tag_t tag = die->Tag(); 395a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// add_type = TagMatchesTypeMask (type_mask, tag); 396a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// } 397a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// } 398a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// 399a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// if (add_type) 400a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// { 401a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// Type *type = ResolveTypeUID(die_offset); 402a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// 403a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// if (type_set.find(type) == type_set.end()) 404a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// type_set.insert(type); 405a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// } 406a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// return true; // Keep iterating 407a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// }); 408a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton// } 409a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 41052f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::set<ClangASTType> clang_type_set; 411a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton size_t num_types_added = 0; 412a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton for (Type *type : type_set) 413a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 41452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = type->GetClangForwardType(); 415bc46e29ae3579c8585c5df4643a018a9db36b7a6Greg Clayton if (clang_type_set.find(clang_type) == clang_type_set.end()) 416bc46e29ae3579c8585c5df4643a018a9db36b7a6Greg Clayton { 417bc46e29ae3579c8585c5df4643a018a9db36b7a6Greg Clayton clang_type_set.insert(clang_type); 418bc46e29ae3579c8585c5df4643a018a9db36b7a6Greg Clayton type_list.Insert (type->shared_from_this()); 419bc46e29ae3579c8585c5df4643a018a9db36b7a6Greg Clayton ++num_types_added; 420bc46e29ae3579c8585c5df4643a018a9db36b7a6Greg Clayton } 421a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 422a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton return num_types_added; 423a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton} 424a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 425e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Gets the first parent that is a lexical block, function or inlined 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// subroutine, or compile unit. 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic const DWARFDebugInfoEntry * 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetParentSymbolContextDIE(const DWARFDebugInfoEntry *child_die) 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *die; 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (die = child_die->GetParent(); die != NULL; die = die->GetParent()) 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_tag_t tag = die->Tag(); 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (tag) 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_compile_unit: 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_subprogram: 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_inlined_subroutine: 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_lexical_block: 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return die; 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 451ad60bf486dee699dd524225b63271ddc5b6329b9Greg ClaytonSymbolFileDWARF::SymbolFileDWARF(ObjectFile* objfile) : 452ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton SymbolFile (objfile), 453444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton UserID (0), // Used by SymbolFileDWARFDebugMap to when this class parses .o files to contain the .o file index/ID 45449ce8969d3154e1560106cfe530444c09410f217Greg Clayton m_debug_map_module_wp (), 455ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton m_debug_map_symfile (NULL), 456e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton m_clang_tu_decl (NULL), 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags(), 458144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_data_debug_abbrev (), 459144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_data_debug_aranges (), 460144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_data_debug_frame (), 461144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_data_debug_info (), 462144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_data_debug_line (), 463144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_data_debug_loc (), 464144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_data_debug_ranges (), 465144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_data_debug_str (), 466f6e3de2d877dc94120c72624a79e488c9bea5c35Greg Clayton m_data_apple_names (), 467f6e3de2d877dc94120c72624a79e488c9bea5c35Greg Clayton m_data_apple_types (), 46800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton m_data_apple_namespaces (), 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abbr(), 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_info(), 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_line(), 47200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton m_apple_names_ap (), 47300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton m_apple_types_ap (), 47400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton m_apple_namespaces_ap (), 47524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton m_apple_objc_ap (), 47674124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton m_function_basename_index(), 47774124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton m_function_fullname_index(), 47874124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton m_function_method_index(), 47974124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton m_function_selector_index(), 480ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton m_objc_class_selectors_index(), 48174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton m_global_index(), 482fcf06fb0b608f09477d7984938255ebf8f92d0daGreg Clayton m_type_index(), 483fcf06fb0b608f09477d7984938255ebf8f92d0daGreg Clayton m_namespace_index(), 484b01000fd063629facd45044f137446fb748ee179Greg Clayton m_indexed (false), 485b01000fd063629facd45044f137446fb748ee179Greg Clayton m_is_external_ast_source (false), 486bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton m_using_apple_tables (false), 487e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton m_supports_DW_AT_APPLE_objc_complete_type (eLazyBoolCalculate), 488a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton m_ranges(), 489a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton m_unique_ast_type_map () 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::~SymbolFileDWARF() 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 495b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_is_external_ast_source) 4963508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton { 4973508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton ModuleSP module_sp (m_obj_file->GetModule()); 4983508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (module_sp) 4993508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton module_sp->GetClangASTContext().RemoveExternalSource (); 5003508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton } 501b01000fd063629facd45044f137446fb748ee179Greg Clayton} 502b01000fd063629facd45044f137446fb748ee179Greg Clayton 503b01000fd063629facd45044f137446fb748ee179Greg Claytonstatic const ConstString & 504b01000fd063629facd45044f137446fb748ee179Greg ClaytonGetDWARFMachOSegmentName () 505b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 506b01000fd063629facd45044f137446fb748ee179Greg Clayton static ConstString g_dwarf_section_name ("__DWARF"); 507b01000fd063629facd45044f137446fb748ee179Greg Clayton return g_dwarf_section_name; 508b01000fd063629facd45044f137446fb748ee179Greg Clayton} 509b01000fd063629facd45044f137446fb748ee179Greg Clayton 510c3c4661c6a7527580e605dbb69bef7634971fe13Greg ClaytonUniqueDWARFASTTypeMap & 511c3c4661c6a7527580e605dbb69bef7634971fe13Greg ClaytonSymbolFileDWARF::GetUniqueDWARFASTTypeMap () 512c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton{ 51349ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (GetDebugMapSymfile ()) 514c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton return m_debug_map_symfile->GetUniqueDWARFASTTypeMap (); 515c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton return m_unique_ast_type_map; 516c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton} 517c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton 518b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext & 519b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARF::GetClangASTContext () 520b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 52149ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (GetDebugMapSymfile ()) 522b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_debug_map_symfile->GetClangASTContext (); 523b01000fd063629facd45044f137446fb748ee179Greg Clayton 524b01000fd063629facd45044f137446fb748ee179Greg Clayton ClangASTContext &ast = m_obj_file->GetModule()->GetClangASTContext(); 525b01000fd063629facd45044f137446fb748ee179Greg Clayton if (!m_is_external_ast_source) 526b01000fd063629facd45044f137446fb748ee179Greg Clayton { 527b01000fd063629facd45044f137446fb748ee179Greg Clayton m_is_external_ast_source = true; 528b01000fd063629facd45044f137446fb748ee179Greg Clayton llvm::OwningPtr<clang::ExternalASTSource> ast_source_ap ( 529b01000fd063629facd45044f137446fb748ee179Greg Clayton new ClangExternalASTSourceCallbacks (SymbolFileDWARF::CompleteTagDecl, 530b01000fd063629facd45044f137446fb748ee179Greg Clayton SymbolFileDWARF::CompleteObjCInterfaceDecl, 531e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton SymbolFileDWARF::FindExternalVisibleDeclsByName, 5323fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton SymbolFileDWARF::LayoutRecordType, 533b01000fd063629facd45044f137446fb748ee179Greg Clayton this)); 534b01000fd063629facd45044f137446fb748ee179Greg Clayton ast.SetExternalSource (ast_source_ap); 535b01000fd063629facd45044f137446fb748ee179Greg Clayton } 536b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast; 537b01000fd063629facd45044f137446fb748ee179Greg Clayton} 538b01000fd063629facd45044f137446fb748ee179Greg Clayton 539b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 540b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARF::InitializeObject() 541b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 542b01000fd063629facd45044f137446fb748ee179Greg Clayton // Install our external AST source callbacks so we can complete Clang types. 5433508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton ModuleSP module_sp (m_obj_file->GetModule()); 5443508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (module_sp) 545b01000fd063629facd45044f137446fb748ee179Greg Clayton { 5467940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton const SectionList *section_list = module_sp->GetSectionList(); 547b01000fd063629facd45044f137446fb748ee179Greg Clayton 548b01000fd063629facd45044f137446fb748ee179Greg Clayton const Section* section = section_list->FindSectionByName(GetDWARFMachOSegmentName ()).get(); 549b01000fd063629facd45044f137446fb748ee179Greg Clayton 550b01000fd063629facd45044f137446fb748ee179Greg Clayton // Memory map the DWARF mach-o segment so we have everything mmap'ed 551b01000fd063629facd45044f137446fb748ee179Greg Clayton // to keep our heap memory usage down. 552b01000fd063629facd45044f137446fb748ee179Greg Clayton if (section) 553b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton m_obj_file->MemoryMapSectionData(section, m_dwarf_data); 554b01000fd063629facd45044f137446fb748ee179Greg Clayton } 5559a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton get_apple_names_data(); 55600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (m_data_apple_names.GetByteSize() > 0) 55700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 558bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton m_apple_names_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_names, get_debug_str_data(), ".apple_names")); 559bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_apple_names_ap->IsValid()) 560bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton m_using_apple_tables = true; 561bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton else 56200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton m_apple_names_ap.reset(); 56300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 5649a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton get_apple_types_data(); 56500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (m_data_apple_types.GetByteSize() > 0) 56600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 567bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton m_apple_types_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_types, get_debug_str_data(), ".apple_types")); 568bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_apple_types_ap->IsValid()) 569bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton m_using_apple_tables = true; 570bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton else 57100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton m_apple_types_ap.reset(); 57200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 57300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 57400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton get_apple_namespaces_data(); 57500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (m_data_apple_namespaces.GetByteSize() > 0) 57600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 577bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton m_apple_namespaces_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_namespaces, get_debug_str_data(), ".apple_namespaces")); 578bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_apple_namespaces_ap->IsValid()) 579bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton m_using_apple_tables = true; 580bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton else 58100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton m_apple_namespaces_ap.reset(); 58200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 5839a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton 58424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton get_apple_objc_data(); 58524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton if (m_data_apple_objc.GetByteSize() > 0) 58624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton { 58724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton m_apple_objc_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_objc, get_debug_str_data(), ".apple_objc")); 58824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton if (m_apple_objc_ap->IsValid()) 58924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton m_using_apple_tables = true; 59024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton else 59124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton m_apple_objc_ap.reset(); 59224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton } 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::SupportedVersion(uint16_t version) 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 598e3125ac8e16a1ec1697147ce0404fdb6837465c0Greg Clayton return version == 2 || version == 3 || version == 4; 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 602d0b7cfa22722fdaf4111a61d6eeb02a587710e16Sean CallananSymbolFileDWARF::CalculateAbilities () 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t abilities = 0; 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_obj_file != NULL) 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Section* section = NULL; 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const SectionList *section_list = m_obj_file->GetSectionList(); 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (section_list == NULL) 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t debug_abbrev_file_size = 0; 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t debug_info_file_size = 0; 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t debug_line_file_size = 0; 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 616b01000fd063629facd45044f137446fb748ee179Greg Clayton section = section_list->FindSectionByName(GetDWARFMachOSegmentName ()).get(); 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (section) 61932a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton section_list = §ion->GetChildren (); 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62132a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton section = section_list->FindSectionByType (eSectionTypeDWARFDebugInfo, true).get(); 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (section != NULL) 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62423d90aea32663f114ffee323775b02dad09f2f18Greg Clayton debug_info_file_size = section->GetFileSize(); 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62632a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton section = section_list->FindSectionByType (eSectionTypeDWARFDebugAbbrev, true).get(); 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (section) 62823d90aea32663f114ffee323775b02dad09f2f18Greg Clayton debug_abbrev_file_size = section->GetFileSize(); 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Set (flagsGotDebugAbbrevData); 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63232a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton section = section_list->FindSectionByType (eSectionTypeDWARFDebugAranges, true).get(); 6334a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (!section) 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Set (flagsGotDebugArangesData); 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63632a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton section = section_list->FindSectionByType (eSectionTypeDWARFDebugFrame, true).get(); 6374a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (!section) 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Set (flagsGotDebugFrameData); 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64032a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton section = section_list->FindSectionByType (eSectionTypeDWARFDebugLine, true).get(); 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (section) 64223d90aea32663f114ffee323775b02dad09f2f18Greg Clayton debug_line_file_size = section->GetFileSize(); 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Set (flagsGotDebugLineData); 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64632a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton section = section_list->FindSectionByType (eSectionTypeDWARFDebugLoc, true).get(); 6474a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (!section) 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Set (flagsGotDebugLocData); 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65032a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton section = section_list->FindSectionByType (eSectionTypeDWARFDebugMacInfo, true).get(); 6514a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (!section) 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Set (flagsGotDebugMacInfoData); 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65432a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton section = section_list->FindSectionByType (eSectionTypeDWARFDebugPubNames, true).get(); 6554a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (!section) 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Set (flagsGotDebugPubNamesData); 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65832a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton section = section_list->FindSectionByType (eSectionTypeDWARFDebugPubTypes, true).get(); 6594a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (!section) 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Set (flagsGotDebugPubTypesData); 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66232a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton section = section_list->FindSectionByType (eSectionTypeDWARFDebugRanges, true).get(); 6634a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (!section) 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Set (flagsGotDebugRangesData); 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66632a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton section = section_list->FindSectionByType (eSectionTypeDWARFDebugStr, true).get(); 6674a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (!section) 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Set (flagsGotDebugStrData); 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6709d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton else 6719d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton { 6729d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton const char *symfile_dir_cstr = m_obj_file->GetFileSpec().GetDirectory().GetCString(); 6739d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton if (symfile_dir_cstr) 6749d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton { 6759d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton if (strcasestr(symfile_dir_cstr, ".dsym")) 6769d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton { 6779d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton if (m_obj_file->GetType() == ObjectFile::eTypeDebugInfo) 6789d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton { 6799d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton // We have a dSYM file that didn't have a any debug info. 6809d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton // If the string table has a size of 1, then it was made from 6819d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton // an executable with no debug info, or from an executable that 6829d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton // was stripped. 6839d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton section = section_list->FindSectionByType (eSectionTypeDWARFDebugStr, true).get(); 6849d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton if (section && section->GetFileSize() == 1) 6859d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton { 6869d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton m_obj_file->GetModule()->ReportWarning ("empty dSYM file detected, dSYM was created with an executable with no debug info."); 6879d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton } 6889d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton } 6899d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton } 6909d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton } 6919d1fa2ac90008546b4077238726ea659f34e8b8dGreg Clayton } 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (debug_abbrev_file_size > 0 && debug_info_file_size > 0) 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner abilities |= CompileUnits | Functions | Blocks | GlobalVariables | LocalVariables | VariableTypes; 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (debug_line_file_size > 0) 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner abilities |= LineTables; 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return abilities; 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DataExtractor& 70332a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg ClaytonSymbolFileDWARF::GetCachedSectionData (uint32_t got_flag, SectionType sect_type, DataExtractor &data) 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_flags.IsClear (got_flag)) 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 707a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain ModuleSP module_sp (m_obj_file->GetModule()); 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Set (got_flag); 7097940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton const SectionList *section_list = module_sp->GetSectionList(); 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (section_list) 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7123508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton SectionSP section_sp (section_list->FindSectionByType(sect_type, true)); 7133508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (section_sp) 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // See if we memory mapped the DWARF segment? 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_dwarf_data.GetByteSize()) 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71823d90aea32663f114ffee323775b02dad09f2f18Greg Clayton data.SetData(m_dwarf_data, section_sp->GetOffset (), section_sp->GetFileSize()); 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7223508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (m_obj_file->ReadSectionData (section_sp.get(), data) == 0) 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data.Clear(); 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return data; 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DataExtractor& 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::get_debug_abbrev_data() 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 73432a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton return GetCachedSectionData (flagsGotDebugAbbrevData, eSectionTypeDWARFDebugAbbrev, m_data_debug_abbrev); 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DataExtractor& 738144188bc458a35997d2f2e52206ab69747439073Greg ClaytonSymbolFileDWARF::get_debug_aranges_data() 739144188bc458a35997d2f2e52206ab69747439073Greg Clayton{ 740144188bc458a35997d2f2e52206ab69747439073Greg Clayton return GetCachedSectionData (flagsGotDebugArangesData, eSectionTypeDWARFDebugAranges, m_data_debug_aranges); 741144188bc458a35997d2f2e52206ab69747439073Greg Clayton} 742144188bc458a35997d2f2e52206ab69747439073Greg Clayton 743144188bc458a35997d2f2e52206ab69747439073Greg Claytonconst DataExtractor& 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::get_debug_frame_data() 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74632a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton return GetCachedSectionData (flagsGotDebugFrameData, eSectionTypeDWARFDebugFrame, m_data_debug_frame); 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DataExtractor& 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::get_debug_info_data() 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 75232a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton return GetCachedSectionData (flagsGotDebugInfoData, eSectionTypeDWARFDebugInfo, m_data_debug_info); 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DataExtractor& 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::get_debug_line_data() 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 75832a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton return GetCachedSectionData (flagsGotDebugLineData, eSectionTypeDWARFDebugLine, m_data_debug_line); 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DataExtractor& 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::get_debug_loc_data() 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 76432a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton return GetCachedSectionData (flagsGotDebugLocData, eSectionTypeDWARFDebugLoc, m_data_debug_loc); 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DataExtractor& 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::get_debug_ranges_data() 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 77032a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton return GetCachedSectionData (flagsGotDebugRangesData, eSectionTypeDWARFDebugRanges, m_data_debug_ranges); 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DataExtractor& 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::get_debug_str_data() 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 77632a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton return GetCachedSectionData (flagsGotDebugStrData, eSectionTypeDWARFDebugStr, m_data_debug_str); 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 779c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Claytonconst DataExtractor& 780f6e3de2d877dc94120c72624a79e488c9bea5c35Greg ClaytonSymbolFileDWARF::get_apple_names_data() 781c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton{ 78224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton return GetCachedSectionData (flagsGotAppleNamesData, eSectionTypeDWARFAppleNames, m_data_apple_names); 783c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton} 784c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton 785c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Claytonconst DataExtractor& 786f6e3de2d877dc94120c72624a79e488c9bea5c35Greg ClaytonSymbolFileDWARF::get_apple_types_data() 787c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton{ 78824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton return GetCachedSectionData (flagsGotAppleTypesData, eSectionTypeDWARFAppleTypes, m_data_apple_types); 789c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton} 790c8cf5e234be554d4acb6ae644a8269c303c4f56eGreg Clayton 79100db215522a0cf31082d26d7ab30d2aa30965acfGreg Claytonconst DataExtractor& 79200db215522a0cf31082d26d7ab30d2aa30965acfGreg ClaytonSymbolFileDWARF::get_apple_namespaces_data() 79300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton{ 79424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton return GetCachedSectionData (flagsGotAppleNamespacesData, eSectionTypeDWARFAppleNamespaces, m_data_apple_namespaces); 79524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton} 79624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton 79724a6bd9835ed1655984397b0cdf35127e47681e9Greg Claytonconst DataExtractor& 79824a6bd9835ed1655984397b0cdf35127e47681e9Greg ClaytonSymbolFileDWARF::get_apple_objc_data() 79924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton{ 80024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton return GetCachedSectionData (flagsGotAppleObjCData, eSectionTypeDWARFAppleObjC, m_data_apple_objc); 80100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton} 80200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugAbbrev* 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::DebugAbbrev() 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_abbr.get() == NULL) 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DataExtractor &debug_abbrev_data = get_debug_abbrev_data(); 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (debug_abbrev_data.GetByteSize() > 0) 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abbr.reset(new DWARFDebugAbbrev()); 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_abbr.get()) 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abbr->Parse(debug_abbrev_data); 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_abbr.get(); 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DWARFDebugAbbrev* 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::DebugAbbrev() const 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_abbr.get(); 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugInfo* 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::DebugInfo() 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_info.get() == NULL) 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "%s this = %p", __PRETTY_FUNCTION__, this); 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (get_debug_info_data().GetByteSize() > 0) 83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_info.reset(new DWARFDebugInfo()); 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_info.get()) 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_info->SetDwarfData(this); 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_info.get(); 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DWARFDebugInfo* 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::DebugInfo() const 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_info.get(); 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit* 85249ce8969d3154e1560106cfe530444c09410f217Greg ClaytonSymbolFileDWARF::GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit) 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfo* info = DebugInfo(); 85549ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (info) 85649ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 85749ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (GetDebugMapSymfile ()) 85849ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 85949ce8969d3154e1560106cfe530444c09410f217Greg Clayton // The debug map symbol file made the compile units for this DWARF 86049ce8969d3154e1560106cfe530444c09410f217Greg Clayton // file which is .o file with DWARF in it, and we should have 86149ce8969d3154e1560106cfe530444c09410f217Greg Clayton // only 1 compile unit which is at offset zero in the DWARF. 86249ce8969d3154e1560106cfe530444c09410f217Greg Clayton // TODO: modify to support LTO .o files where each .o file might 86349ce8969d3154e1560106cfe530444c09410f217Greg Clayton // have multiple DW_TAG_compile_unit tags. 86449ce8969d3154e1560106cfe530444c09410f217Greg Clayton return info->GetCompileUnit(0).get(); 86549ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 86649ce8969d3154e1560106cfe530444c09410f217Greg Clayton else 86749ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 86849ce8969d3154e1560106cfe530444c09410f217Greg Clayton // Just a normal DWARF file whose user ID for the compile unit is 86949ce8969d3154e1560106cfe530444c09410f217Greg Clayton // the DWARF offset itself 87049ce8969d3154e1560106cfe530444c09410f217Greg Clayton return info->GetCompileUnit((dw_offset_t)comp_unit->GetID()).get(); 87149ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 87249ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugRanges* 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::DebugRanges() 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_ranges.get() == NULL) 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "%s this = %p", __PRETTY_FUNCTION__, this); 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (get_debug_ranges_data().GetByteSize() > 0) 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ranges.reset(new DWARFDebugRanges()); 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_ranges.get()) 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ranges->Extract(this); 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_ranges.get(); 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DWARFDebugRanges* 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::DebugRanges() const 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_ranges.get(); 89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8990be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Claytonlldb::CompUnitSP 9000be1edd34ff46e017b1b973c5a57e3de9f613bafGreg ClaytonSymbolFileDWARF::ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx) 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9020be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton CompUnitSP cu_sp; 9030be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton if (dwarf_cu) 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9050be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton CompileUnit *comp_unit = (CompileUnit*)dwarf_cu->GetUserData(); 9060be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton if (comp_unit) 9070be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton { 9080be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton // We already parsed this compile unit, had out a shared pointer to it 9090be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton cu_sp = comp_unit->shared_from_this(); 9100be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton } 9110be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton else 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 91349ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (GetDebugMapSymfile ()) 91449ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 91549ce8969d3154e1560106cfe530444c09410f217Greg Clayton // Let the debug map create the compile unit 91649ce8969d3154e1560106cfe530444c09410f217Greg Clayton cu_sp = m_debug_map_symfile->GetCompileUnit(this); 91749ce8969d3154e1560106cfe530444c09410f217Greg Clayton dwarf_cu->SetUserData(cu_sp.get()); 91849ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 91949ce8969d3154e1560106cfe530444c09410f217Greg Clayton else 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92149ce8969d3154e1560106cfe530444c09410f217Greg Clayton ModuleSP module_sp (m_obj_file->GetModule()); 92249ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (module_sp) 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92449ce8969d3154e1560106cfe530444c09410f217Greg Clayton const DWARFDebugInfoEntry * cu_die = dwarf_cu->GetCompileUnitDIEOnly (); 92549ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (cu_die) 9260be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton { 92749ce8969d3154e1560106cfe530444c09410f217Greg Clayton const char * cu_die_name = cu_die->GetName(this, dwarf_cu); 92849ce8969d3154e1560106cfe530444c09410f217Greg Clayton const char * cu_comp_dir = cu_die->GetAttributeValueAsString(this, dwarf_cu, DW_AT_comp_dir, NULL); 92949ce8969d3154e1560106cfe530444c09410f217Greg Clayton LanguageType cu_language = (LanguageType)cu_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_language, 0); 93049ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (cu_die_name) 9310be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton { 93249ce8969d3154e1560106cfe530444c09410f217Greg Clayton std::string ramapped_file; 93349ce8969d3154e1560106cfe530444c09410f217Greg Clayton FileSpec cu_file_spec; 9340be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton 93549ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (cu_die_name[0] == '/' || cu_comp_dir == NULL || cu_comp_dir[0] == '\0') 9360be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton { 93749ce8969d3154e1560106cfe530444c09410f217Greg Clayton // If we have a full path to the compile unit, we don't need to resolve 93849ce8969d3154e1560106cfe530444c09410f217Greg Clayton // the file. This can be expensive e.g. when the source files are NFS mounted. 93949ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (module_sp->RemapSourceFile(cu_die_name, ramapped_file)) 94049ce8969d3154e1560106cfe530444c09410f217Greg Clayton cu_file_spec.SetFile (ramapped_file.c_str(), false); 94149ce8969d3154e1560106cfe530444c09410f217Greg Clayton else 94249ce8969d3154e1560106cfe530444c09410f217Greg Clayton cu_file_spec.SetFile (cu_die_name, false); 9430be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton } 9440be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton else 9450be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton { 94649ce8969d3154e1560106cfe530444c09410f217Greg Clayton std::string fullpath(cu_comp_dir); 94749ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (*fullpath.rbegin() != '/') 94849ce8969d3154e1560106cfe530444c09410f217Greg Clayton fullpath += '/'; 94949ce8969d3154e1560106cfe530444c09410f217Greg Clayton fullpath += cu_die_name; 95049ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (module_sp->RemapSourceFile (fullpath.c_str(), ramapped_file)) 95149ce8969d3154e1560106cfe530444c09410f217Greg Clayton cu_file_spec.SetFile (ramapped_file.c_str(), false); 95249ce8969d3154e1560106cfe530444c09410f217Greg Clayton else 95349ce8969d3154e1560106cfe530444c09410f217Greg Clayton cu_file_spec.SetFile (fullpath.c_str(), false); 95449ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 95549ce8969d3154e1560106cfe530444c09410f217Greg Clayton 95649ce8969d3154e1560106cfe530444c09410f217Greg Clayton cu_sp.reset(new CompileUnit (module_sp, 95749ce8969d3154e1560106cfe530444c09410f217Greg Clayton dwarf_cu, 95849ce8969d3154e1560106cfe530444c09410f217Greg Clayton cu_file_spec, 95949ce8969d3154e1560106cfe530444c09410f217Greg Clayton MakeUserID(dwarf_cu->GetOffset()), 96049ce8969d3154e1560106cfe530444c09410f217Greg Clayton cu_language)); 96149ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (cu_sp) 96249ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 96349ce8969d3154e1560106cfe530444c09410f217Greg Clayton dwarf_cu->SetUserData(cu_sp.get()); 96449ce8969d3154e1560106cfe530444c09410f217Greg Clayton 9650be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton // Figure out the compile unit index if we weren't given one 9660be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton if (cu_idx == UINT32_MAX) 9670be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton DebugInfo()->GetCompileUnit(dwarf_cu->GetOffset(), &cu_idx); 9680be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton 9690be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(cu_idx, cu_sp); 9700be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton } 9710be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton } 9720be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton } 97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9770be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton return cu_sp; 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::GetNumCompileUnits() 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfo* info = DebugInfo(); 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (info) 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return info->GetNumCompileUnits(); 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::ParseCompileUnitAtIndex(uint32_t cu_idx) 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9920be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton CompUnitSP cu_sp; 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfo* info = DebugInfo(); 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (info) 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9960be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton DWARFCompileUnit* dwarf_cu = info->GetCompileUnitAtIndex(cu_idx); 9970be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton if (dwarf_cu) 9980be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton cu_sp = ParseCompileUnit(dwarf_cu, cu_idx); 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10000be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton return cu_sp; 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void 1004bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg ClaytonAddRangesToBlock (Block& block, 1005bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton DWARFDebugRanges::RangeList& ranges, 1006bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton addr_t block_base_addr) 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1008bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton const size_t num_ranges = ranges.GetSize(); 1009bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton for (size_t i = 0; i<num_ranges; ++i) 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1011bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton const DWARFDebugRanges::Range &range = ranges.GetEntryRef (i); 1012bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton const addr_t range_base = range.GetRangeBase(); 1013bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton assert (range_base >= block_base_addr); 1014bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton block.AddRange(Block::Range (range_base - block_base_addr, range.GetByteSize()));; 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1016bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton block.FinalizeRanges (); 101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunction * 10211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonSymbolFileDWARF::ParseCompileUnitFunction (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die) 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugRanges::RangeList func_ranges; 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name = NULL; 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *mangled = NULL; 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int decl_file = 0; 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int decl_line = 0; 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int decl_column = 0; 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int call_file = 0; 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int call_line = 0; 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int call_column = 0; 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFExpression frame_base; 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1034b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton assert (die->Tag() == DW_TAG_subprogram); 1035b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton 1036b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton if (die->Tag() != DW_TAG_subprogram) 1037b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton return NULL; 1038b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton 1039b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton if (die->GetDIENamesAndRanges (this, 1040b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton dwarf_cu, 1041b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton name, 1042b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton mangled, 1043b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton func_ranges, 1044b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton decl_file, 1045b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton decl_line, 1046b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton decl_column, 1047b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton call_file, 1048b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton call_line, 1049b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton call_column, 1050b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton &frame_base)) 105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Union of all ranges in the function DIE (if the function is discontiguous) 105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner AddressRange func_range; 1054bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton lldb::addr_t lowest_func_addr = func_ranges.GetMinRangeBase (0); 1055bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton lldb::addr_t highest_func_addr = func_ranges.GetMaxRangeEnd (0); 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (lowest_func_addr != LLDB_INVALID_ADDRESS && lowest_func_addr <= highest_func_addr) 105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1058a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain ModuleSP module_sp (m_obj_file->GetModule()); 10597940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton func_range.GetBaseAddress().ResolveAddressUsingFileSections (lowest_func_addr, module_sp->GetSectionList()); 106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (func_range.GetBaseAddress().IsValid()) 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner func_range.SetByteSize(highest_func_addr - lowest_func_addr); 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (func_range.GetBaseAddress().IsValid()) 106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mangled func_name; 106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (mangled) 1068c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton func_name.SetValue(ConstString(mangled), true); 106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (name) 1070c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton func_name.SetValue(ConstString(name), false); 107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FunctionSP func_sp; 1073102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<Declaration> decl_ap; 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_file != 0 || decl_line != 0 || decl_column != 0) 1075feb6e56275a8a7a53336bdb957064e9093e8e170Greg Clayton decl_ap.reset(new Declaration (sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file), 1076feb6e56275a8a7a53336bdb957064e9093e8e170Greg Clayton decl_line, 1077feb6e56275a8a7a53336bdb957064e9093e8e170Greg Clayton decl_column)); 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1079f92d0dd8184d6e8f59bce1607c5cd448fcf318c6Greg Clayton // Supply the type _only_ if it has already been parsed 10804fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton Type *func_type = m_die_to_type.lookup (die); 108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(func_type == NULL || func_type != DIE_IS_BEING_PARSED); 108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1084464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (FixupAddress (func_range.GetBaseAddress())) 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1086464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const user_id_t func_user_id = MakeUserID(die->GetOffset()); 1087464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton func_sp.reset(new Function (sc.comp_unit, 1088464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton MakeUserID(func_user_id), // UserID is the DIE offset 1089464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton MakeUserID(func_user_id), 1090464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton func_name, 1091464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton func_type, 1092464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton func_range)); // first address range 1093464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 1094464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (func_sp.get() != NULL) 1095464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 1096464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (frame_base.IsValid()) 1097464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton func_sp->GetFrameBaseExpression() = frame_base; 1098464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton sc.comp_unit->AddFunction(func_sp); 1099464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return func_sp.get(); 1100464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1107464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonbool 1108464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARF::FixupAddress (Address &addr) 1109464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{ 1110464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton SymbolFileDWARFDebugMap * debug_map_symfile = GetDebugMapSymfile (); 1111464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (debug_map_symfile) 1112464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 1113464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return debug_map_symfile->LinkOSOAddress(addr); 1114464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 1115464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // This is a normal DWARF file, no address fixups need to happen 1116464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return true; 1117464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton} 111849ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb::LanguageType 111949ce8969d3154e1560106cfe530444c09410f217Greg ClaytonSymbolFileDWARF::ParseCompileUnitLanguage (const SymbolContext& sc) 112049ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 112149ce8969d3154e1560106cfe530444c09410f217Greg Clayton assert (sc.comp_unit); 112249ce8969d3154e1560106cfe530444c09410f217Greg Clayton DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit); 112349ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (dwarf_cu) 112449ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 112549ce8969d3154e1560106cfe530444c09410f217Greg Clayton const DWARFDebugInfoEntry *die = dwarf_cu->GetCompileUnitDIEOnly(); 11266f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham if (die) 11276f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham { 11286f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham const uint32_t language = die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_language, 0); 11296f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham if (language) 11306f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham return (lldb::LanguageType)language; 11316f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham } 113249ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 113349ce8969d3154e1560106cfe530444c09410f217Greg Clayton return eLanguageTypeUnknown; 113449ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 113549ce8969d3154e1560106cfe530444c09410f217Greg Clayton 113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::ParseCompileUnitFunctions(const SymbolContext &sc) 113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (sc.comp_unit); 114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t functions_added = 0; 114149ce8969d3154e1560106cfe530444c09410f217Greg Clayton DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit); 114224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dwarf_cu) 114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 114424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDIECollection function_dies; 114549ce8969d3154e1560106cfe530444c09410f217Greg Clayton const size_t num_functions = dwarf_cu->AppendDIEsWithTag (DW_TAG_subprogram, function_dies); 114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t func_idx; 114749ce8969d3154e1560106cfe530444c09410f217Greg Clayton for (func_idx = 0; func_idx < num_functions; ++func_idx) 114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *die = function_dies.GetDIEPtrAtIndex(func_idx); 1150444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (sc.comp_unit->FindFunctionByUID (MakeUserID(die->GetOffset())).get() == NULL) 115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ParseCompileUnitFunction(sc, dwarf_cu, die)) 115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++functions_added; 115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //FixupTypes(); 115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return functions_added; 115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList& support_files) 116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (sc.comp_unit); 116549ce8969d3154e1560106cfe530444c09410f217Greg Clayton DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit); 11668d6d0f265c529a85335388aaa88a05d761ee77bfGreg Clayton if (dwarf_cu) 116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11688d6d0f265c529a85335388aaa88a05d761ee77bfGreg Clayton const DWARFDebugInfoEntry * cu_die = dwarf_cu->GetCompileUnitDIEOnly(); 116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11708d6d0f265c529a85335388aaa88a05d761ee77bfGreg Clayton if (cu_die) 11718d6d0f265c529a85335388aaa88a05d761ee77bfGreg Clayton { 11728d6d0f265c529a85335388aaa88a05d761ee77bfGreg Clayton const char * cu_comp_dir = cu_die->GetAttributeValueAsString(this, dwarf_cu, DW_AT_comp_dir, NULL); 11738d6d0f265c529a85335388aaa88a05d761ee77bfGreg Clayton dw_offset_t stmt_list = cu_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_stmt_list, DW_INVALID_OFFSET); 117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11758d6d0f265c529a85335388aaa88a05d761ee77bfGreg Clayton // All file indexes in DWARF are one based and a file of index zero is 11768d6d0f265c529a85335388aaa88a05d761ee77bfGreg Clayton // supposed to be the compile unit itself. 11778d6d0f265c529a85335388aaa88a05d761ee77bfGreg Clayton support_files.Append (*sc.comp_unit); 11788d6d0f265c529a85335388aaa88a05d761ee77bfGreg Clayton 11798d6d0f265c529a85335388aaa88a05d761ee77bfGreg Clayton return DWARFDebugLine::ParseSupportFiles(sc.comp_unit->GetModule(), get_debug_line_data(), cu_comp_dir, stmt_list, support_files); 11808d6d0f265c529a85335388aaa88a05d761ee77bfGreg Clayton } 118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstruct ParseDWARFLineTableCallbackInfo 118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LineTable* line_table; 1188102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<LineSequence> sequence_ap; 118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ParseStatementTableCallback 119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void 119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseDWARFLineTableCallback(dw_offset_t offset, const DWARFDebugLine::State& state, void* userData) 119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (state.row == DWARFDebugLine::State::StartParsingLineTable) 119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Just started parsing the line table 120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (state.row == DWARFDebugLine::State::DoneParsingLineTable) 120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Done parsing line table, nothing to do for the cleanup 120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ParseDWARFLineTableCallbackInfo* info = (ParseDWARFLineTableCallbackInfo*)userData; 1208464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton LineTable* line_table = info->line_table; 120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1210464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // If this is our first time here, we need to create a 1211464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // sequence container. 1212464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (!info->sequence_ap.get()) 121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1214464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton info->sequence_ap.reset(line_table->CreateLineSequenceContainer()); 1215464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton assert(info->sequence_ap.get()); 121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1217464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton line_table->AppendLineEntryToSequence (info->sequence_ap.get(), 1218464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton state.address, 1219464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton state.line, 1220464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton state.column, 1221464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton state.file, 1222464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton state.is_stmt, 1223464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton state.basic_block, 1224464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton state.prologue_end, 1225464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton state.epilogue_begin, 1226464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton state.end_sequence); 1227464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (state.end_sequence) 122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1229464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // First, put the current sequence into the line table. 1230464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton line_table->InsertSequence(info->sequence_ap.get()); 1231464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // Then, empty it to prepare for the next sequence. 1232464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton info->sequence_ap->Clear(); 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::ParseCompileUnitLineTable (const SymbolContext &sc) 123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (sc.comp_unit); 124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit->GetLineTable() != NULL) 124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 124449ce8969d3154e1560106cfe530444c09410f217Greg Clayton DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit); 124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dwarf_cu) 124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 124724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *dwarf_cu_die = dwarf_cu->GetCompileUnitDIEOnly(); 1248da52c495c58cbc070a6ed1bfd7421e2b99e7ba30Greg Clayton if (dwarf_cu_die) 124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1250da52c495c58cbc070a6ed1bfd7421e2b99e7ba30Greg Clayton const dw_offset_t cu_line_offset = dwarf_cu_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_stmt_list, DW_INVALID_OFFSET); 1251da52c495c58cbc070a6ed1bfd7421e2b99e7ba30Greg Clayton if (cu_line_offset != DW_INVALID_OFFSET) 125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1253102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<LineTable> line_table_ap(new LineTable(sc.comp_unit)); 1254da52c495c58cbc070a6ed1bfd7421e2b99e7ba30Greg Clayton if (line_table_ap.get()) 1255da52c495c58cbc070a6ed1bfd7421e2b99e7ba30Greg Clayton { 1256464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton ParseDWARFLineTableCallbackInfo info; 1257464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton info.line_table = line_table_ap.get(); 125836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = cu_line_offset; 1259da52c495c58cbc070a6ed1bfd7421e2b99e7ba30Greg Clayton DWARFDebugLine::ParseStatementTable(get_debug_line_data(), &offset, ParseDWARFLineTableCallback, &info); 1260464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (m_debug_map_symfile) 1261464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 1262464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // We have an object file that has a line table with addresses 1263464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // that are not linked. We need to link the line table and convert 1264464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // the addresses that are relative to the .o file into addresses 1265464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // for the main executable. 1266464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton sc.comp_unit->SetLineTable (m_debug_map_symfile->LinkOSOLineTable (this, line_table_ap.get())); 1267464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 1268464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton else 1269464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 1270464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton sc.comp_unit->SetLineTable(line_table_ap.release()); 1271464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return true; 1272464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 1273da52c495c58cbc070a6ed1bfd7421e2b99e7ba30Greg Clayton } 127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::ParseFunctionBlocks 128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const SymbolContext& sc, 128475ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton Block *parent_block, 12851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton DWARFCompileUnit* dwarf_cu, 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *die, 128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t subprogram_low_pc, 12882e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton uint32_t depth 128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t blocks_added = 0; 129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (die != NULL) 129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_tag_t tag = die->Tag(); 129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (tag) 129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_inlined_subroutine: 129911afe6aa45a4a08e470d237578fab379b3af6cfdGreg Clayton case DW_TAG_subprogram: 130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_lexical_block: 130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 130275ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton Block *block = NULL; 13032e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton if (tag == DW_TAG_subprogram) 130475ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton { 13052e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton // Skip any DW_TAG_subprogram DIEs that are inside 13062e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton // of a normal or inlined functions. These will be 13072e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton // parsed on their own as separate entities. 13082e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton 13092e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton if (depth > 0) 13102e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton break; 13112e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton 13122e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton block = parent_block; 131375ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton } 131475ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton else 131575ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton { 1316444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton BlockSP block_sp(new Block (MakeUserID(die->GetOffset()))); 13172e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton parent_block->AddChild(block_sp); 13182e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton block = block_sp.get(); 131975ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton } 13202e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton DWARFDebugRanges::RangeList ranges; 13212e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton const char *name = NULL; 13222e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton const char *mangled_name = NULL; 132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int decl_file = 0; 132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int decl_line = 0; 132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int decl_column = 0; 132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int call_file = 0; 132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int call_line = 0; 132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int call_column = 0; 133075ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton if (die->GetDIENamesAndRanges (this, 133175ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton dwarf_cu, 133275ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton name, 133375ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton mangled_name, 133475ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton ranges, 133575ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton decl_file, decl_line, decl_column, 133675ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton call_file, call_line, call_column)) 133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag == DW_TAG_subprogram) 133924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 134024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (subprogram_low_pc == LLDB_INVALID_ADDRESS); 1341bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton subprogram_low_pc = ranges.GetMinRangeBase(0); 134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13430007dfff776edec41a108a57d0a0924b1068977bJim Ingham else if (tag == DW_TAG_inlined_subroutine) 13440007dfff776edec41a108a57d0a0924b1068977bJim Ingham { 13450007dfff776edec41a108a57d0a0924b1068977bJim Ingham // We get called here for inlined subroutines in two ways. 13460007dfff776edec41a108a57d0a0924b1068977bJim Ingham // The first time is when we are making the Function object 13470007dfff776edec41a108a57d0a0924b1068977bJim Ingham // for this inlined concrete instance. Since we're creating a top level block at 13480007dfff776edec41a108a57d0a0924b1068977bJim Ingham // here, the subprogram_low_pc will be LLDB_INVALID_ADDRESS. So we need to 13490007dfff776edec41a108a57d0a0924b1068977bJim Ingham // adjust the containing address. 13500007dfff776edec41a108a57d0a0924b1068977bJim Ingham // The second time is when we are parsing the blocks inside the function that contains 13510007dfff776edec41a108a57d0a0924b1068977bJim Ingham // the inlined concrete instance. Since these will be blocks inside the containing "real" 13520007dfff776edec41a108a57d0a0924b1068977bJim Ingham // function the offset will be for that function. 13530007dfff776edec41a108a57d0a0924b1068977bJim Ingham if (subprogram_low_pc == LLDB_INVALID_ADDRESS) 13540007dfff776edec41a108a57d0a0924b1068977bJim Ingham { 1355bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton subprogram_low_pc = ranges.GetMinRangeBase(0); 13560007dfff776edec41a108a57d0a0924b1068977bJim Ingham } 13570007dfff776edec41a108a57d0a0924b1068977bJim Ingham } 13580007dfff776edec41a108a57d0a0924b1068977bJim Ingham 135975ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton AddRangesToBlock (*block, ranges, subprogram_low_pc); 136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag != DW_TAG_subprogram && (name != NULL || mangled_name != NULL)) 136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1363102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<Declaration> decl_ap; 136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_file != 0 || decl_line != 0 || decl_column != 0) 13650007dfff776edec41a108a57d0a0924b1068977bJim Ingham decl_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file), 13660007dfff776edec41a108a57d0a0924b1068977bJim Ingham decl_line, decl_column)); 136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1368102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<Declaration> call_ap; 136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (call_file != 0 || call_line != 0 || call_column != 0) 13700007dfff776edec41a108a57d0a0924b1068977bJim Ingham call_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(call_file), 13710007dfff776edec41a108a57d0a0924b1068977bJim Ingham call_line, call_column)); 137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 137375ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton block->SetInlinedFunctionInfo (name, mangled_name, decl_ap.get(), call_ap.get()); 137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 137624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++blocks_added; 137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13782e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton if (die->HasChildren()) 137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 138075ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton blocks_added += ParseFunctionBlocks (sc, 138175ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton block, 138275ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton dwarf_cu, 138375ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton die->GetFirstChild(), 138475ccf50c3371d8c8e293af25461705b86fb10a46Greg Clayton subprogram_low_pc, 13852e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton depth + 1); 138624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13942e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton // Only parse siblings of the block if we are not at depth zero. A depth 13952e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton // of zero indicates we are currently parsing the top level 13962e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton // DW_TAG_subprogram DIE 13972e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton 13982e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton if (depth == 0) 139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner die = NULL; 14002e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton else 14012e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton die = die->GetSibling(); 140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return blocks_added; 140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1406f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Claytonbool 1407b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg ClaytonSymbolFileDWARF::ParseTemplateDIE (DWARFCompileUnit* dwarf_cu, 1408b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton const DWARFDebugInfoEntry *die, 1409b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton ClangASTContext::TemplateParameterInfos &template_param_infos) 1410b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton{ 1411b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton const dw_tag_t tag = die->Tag(); 1412b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton 1413b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton switch (tag) 1414b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton { 1415b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton case DW_TAG_template_type_parameter: 1416b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton case DW_TAG_template_value_parameter: 1417b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton { 1418b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize()); 1419b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton 1420b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton DWARFDebugInfoEntry::Attributes attributes; 1421b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton const size_t num_attributes = die->GetAttributes (this, 1422b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton dwarf_cu, 1423b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton fixed_form_sizes, 1424b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton attributes); 1425b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton const char *name = NULL; 1426b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton Type *lldb_type = NULL; 142752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type; 1428b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton uint64_t uval64 = 0; 1429b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton bool uval64_valid = false; 1430b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton if (num_attributes > 0) 1431b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton { 1432b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton DWARFFormValue form_value; 1433b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton for (size_t i=0; i<num_attributes; ++i) 1434b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton { 1435b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton const dw_attr_t attr = attributes.AttributeAtIndex(i); 1436b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton 1437b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton switch (attr) 1438b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton { 1439b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton case DW_AT_name: 1440b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 1441b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton name = form_value.AsCString(&get_debug_str_data()); 1442b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton break; 1443b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton 1444b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton case DW_AT_type: 1445b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 1446b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton { 1447b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton const dw_offset_t type_die_offset = form_value.Reference(dwarf_cu); 1448b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton lldb_type = ResolveTypeUID(type_die_offset); 1449b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton if (lldb_type) 1450b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton clang_type = lldb_type->GetClangForwardType(); 1451b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton } 1452b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton break; 1453b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton 1454b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton case DW_AT_const_value: 1455b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 1456b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton { 1457b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton uval64_valid = true; 1458b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton uval64 = form_value.Unsigned(); 1459b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton } 1460b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton break; 1461b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton default: 1462b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton break; 1463b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton } 1464b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton } 1465b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton 1466764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton clang::ASTContext *ast = GetClangASTContext().getASTContext(); 1467764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton if (!clang_type) 146852f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type = GetClangASTContext().GetBasicType(eBasicTypeVoid); 1469764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton 1470764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton if (clang_type) 1471b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton { 1472b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton bool is_signed = false; 1473764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton if (name && name[0]) 1474764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton template_param_infos.names.push_back(name); 1475764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton else 1476764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton template_param_infos.names.push_back(NULL); 1477764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton 1478764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton if (tag == DW_TAG_template_value_parameter && 1479764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton lldb_type != NULL && 148052f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.IsIntegerType (is_signed) && 1481764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton uval64_valid) 1482b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton { 1483b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton llvm::APInt apint (lldb_type->GetByteSize() * 8, uval64, is_signed); 1484764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton template_param_infos.args.push_back (clang::TemplateArgument (*ast, 148506dc17f8eb821d7256fd42e56f85c2779a29f689Sean Callanan llvm::APSInt(apint), 148652f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.GetQualType())); 1487b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton } 1488b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton else 1489b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton { 149052f792329be5db8e38961350589e97e8f2823acdGreg Clayton template_param_infos.args.push_back (clang::TemplateArgument (clang_type.GetQualType())); 1491b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton } 1492b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton } 1493b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton else 1494b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton { 1495b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton return false; 1496b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton } 1497b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton 1498b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton } 1499b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton } 1500b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton return true; 1501b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton 1502b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton default: 1503b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton break; 1504b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton } 1505b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton return false; 1506b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton} 1507b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton 1508b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Claytonbool 1509f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg ClaytonSymbolFileDWARF::ParseTemplateParameterInfos (DWARFCompileUnit* dwarf_cu, 1510f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton const DWARFDebugInfoEntry *parent_die, 1511f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton ClangASTContext::TemplateParameterInfos &template_param_infos) 1512f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton{ 1513f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton 1514f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton if (parent_die == NULL) 15159a23becdf4f275a7a4da9e5a0319c1b4501673aeFilipe Cabecinhas return false; 1516f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton 1517f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton Args template_parameter_names; 1518f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton for (const DWARFDebugInfoEntry *die = parent_die->GetFirstChild(); 1519f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton die != NULL; 1520f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton die = die->GetSibling()) 1521f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton { 1522f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton const dw_tag_t tag = die->Tag(); 1523f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton 1524f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton switch (tag) 1525f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton { 1526f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton case DW_TAG_template_type_parameter: 1527f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton case DW_TAG_template_value_parameter: 1528b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton ParseTemplateDIE (dwarf_cu, die, template_param_infos); 1529f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton break; 1530f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton 1531f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton default: 1532f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton break; 1533f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton } 1534f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton } 1535f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton if (template_param_infos.args.empty()) 1536f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton return false; 1537f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton return template_param_infos.args.size() == template_param_infos.names.size(); 1538f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton} 1539f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton 1540f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Claytonclang::ClassTemplateDecl * 1541f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg ClaytonSymbolFileDWARF::ParseClassTemplateDecl (clang::DeclContext *decl_ctx, 15425e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton lldb::AccessType access_type, 1543f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton const char *parent_name, 1544f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton int tag_decl_kind, 1545f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton const ClangASTContext::TemplateParameterInfos &template_param_infos) 1546f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton{ 1547f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton if (template_param_infos.IsValid()) 1548f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton { 1549f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton std::string template_basename(parent_name); 1550f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton template_basename.erase (template_basename.find('<')); 1551f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton ClangASTContext &ast = GetClangASTContext(); 1552f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton 1553f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton return ast.CreateClassTemplateDecl (decl_ctx, 15545e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton access_type, 1555f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton template_basename.c_str(), 1556f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton tag_decl_kind, 1557f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton template_param_infos); 1558f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton } 1559f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton return NULL; 1560f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton} 1561f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton 1562a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callananclass SymbolFileDWARF::DelayedAddObjCClassProperty 1563a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan{ 1564a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callananpublic: 1565a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan DelayedAddObjCClassProperty 1566a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan ( 156752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ClangASTType &class_opaque_type, 1568a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan const char *property_name, 156952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ClangASTType &property_opaque_type, // The property type is only required if you don't have an ivar decl 1570a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan clang::ObjCIvarDecl *ivar_decl, 1571a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan const char *property_setter_name, 1572a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan const char *property_getter_name, 1573a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan uint32_t property_attributes, 15749c09181404cc35f65d5353231246959135fb7684Greg Clayton const ClangASTMetadata *metadata 1575a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan ) : 1576a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan m_class_opaque_type (class_opaque_type), 1577a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan m_property_name (property_name), 1578a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan m_property_opaque_type (property_opaque_type), 1579a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan m_ivar_decl (ivar_decl), 1580a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan m_property_setter_name (property_setter_name), 1581a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan m_property_getter_name (property_getter_name), 1582a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham m_property_attributes (property_attributes) 1583a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan { 1584a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham if (metadata != NULL) 1585a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham { 1586a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham m_metadata_ap.reset(new ClangASTMetadata()); 15879c09181404cc35f65d5353231246959135fb7684Greg Clayton *m_metadata_ap = *metadata; 1588a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham } 1589a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham } 1590a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham 1591a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham DelayedAddObjCClassProperty (const DelayedAddObjCClassProperty &rhs) 1592a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham { 159352f792329be5db8e38961350589e97e8f2823acdGreg Clayton *this = rhs; 1594d94bf681a699e45edf1013d97664fcb2a7e4b302Daniel Malea } 1595d94bf681a699e45edf1013d97664fcb2a7e4b302Daniel Malea 1596d94bf681a699e45edf1013d97664fcb2a7e4b302Daniel Malea DelayedAddObjCClassProperty& operator= (const DelayedAddObjCClassProperty &rhs) 1597d94bf681a699e45edf1013d97664fcb2a7e4b302Daniel Malea { 1598a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham m_class_opaque_type = rhs.m_class_opaque_type; 1599a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham m_property_name = rhs.m_property_name; 1600a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham m_property_opaque_type = rhs.m_property_opaque_type; 1601a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham m_ivar_decl = rhs.m_ivar_decl; 1602a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham m_property_setter_name = rhs.m_property_setter_name; 1603a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham m_property_getter_name = rhs.m_property_getter_name; 1604a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham m_property_attributes = rhs.m_property_attributes; 1605a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham 1606a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham if (rhs.m_metadata_ap.get()) 1607a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham { 1608a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham m_metadata_ap.reset (new ClangASTMetadata()); 16099c09181404cc35f65d5353231246959135fb7684Greg Clayton *m_metadata_ap = *rhs.m_metadata_ap; 1610a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham } 1611d94bf681a699e45edf1013d97664fcb2a7e4b302Daniel Malea return *this; 1612a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan } 1613a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan 161452f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool 161552f792329be5db8e38961350589e97e8f2823acdGreg Clayton Finalize() 161652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 161752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return m_class_opaque_type.AddObjCClassProperty (m_property_name, 161852f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_property_opaque_type, 161952f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_ivar_decl, 162052f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_property_setter_name, 162152f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_property_getter_name, 162252f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_property_attributes, 162352f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_metadata_ap.get()); 1624a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan } 1625a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callananprivate: 162652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType m_class_opaque_type; 1627a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan const char *m_property_name; 162852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType m_property_opaque_type; 1629a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan clang::ObjCIvarDecl *m_ivar_decl; 1630a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan const char *m_property_setter_name; 1631a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan const char *m_property_getter_name; 1632a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan uint32_t m_property_attributes; 1633102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<ClangASTMetadata> m_metadata_ap; 1634a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan}; 1635a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan 163648f833c33b8c2713e99139941ce3b3885883c4f0Sean Callananstruct BitfieldInfo 163748f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan{ 163848f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan uint64_t bit_size; 163948f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan uint64_t bit_offset; 164048f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan 164148f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan BitfieldInfo () : 164248f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan bit_size (LLDB_INVALID_ADDRESS), 164348f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan bit_offset (LLDB_INVALID_ADDRESS) 164448f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan { 164548f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan } 164648f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan 164748f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan bool IsValid () 164848f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan { 164948f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan return (bit_size != LLDB_INVALID_ADDRESS) && 165048f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan (bit_offset != LLDB_INVALID_ADDRESS); 165148f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan } 165248f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan}; 165348f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan 16549c09181404cc35f65d5353231246959135fb7684Greg Clayton 16559c09181404cc35f65d5353231246959135fb7684Greg Claytonbool 16569c09181404cc35f65d5353231246959135fb7684Greg ClaytonSymbolFileDWARF::ClassOrStructIsVirtual (DWARFCompileUnit* dwarf_cu, 16579c09181404cc35f65d5353231246959135fb7684Greg Clayton const DWARFDebugInfoEntry *parent_die) 16589c09181404cc35f65d5353231246959135fb7684Greg Clayton{ 16599c09181404cc35f65d5353231246959135fb7684Greg Clayton if (parent_die) 16609c09181404cc35f65d5353231246959135fb7684Greg Clayton { 16619c09181404cc35f65d5353231246959135fb7684Greg Clayton for (const DWARFDebugInfoEntry *die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling()) 16629c09181404cc35f65d5353231246959135fb7684Greg Clayton { 16639c09181404cc35f65d5353231246959135fb7684Greg Clayton dw_tag_t tag = die->Tag(); 16649c09181404cc35f65d5353231246959135fb7684Greg Clayton bool check_virtuality = false; 16659c09181404cc35f65d5353231246959135fb7684Greg Clayton switch (tag) 16669c09181404cc35f65d5353231246959135fb7684Greg Clayton { 16679c09181404cc35f65d5353231246959135fb7684Greg Clayton case DW_TAG_inheritance: 16689c09181404cc35f65d5353231246959135fb7684Greg Clayton case DW_TAG_subprogram: 16699c09181404cc35f65d5353231246959135fb7684Greg Clayton check_virtuality = true; 16709c09181404cc35f65d5353231246959135fb7684Greg Clayton break; 16719c09181404cc35f65d5353231246959135fb7684Greg Clayton default: 16729c09181404cc35f65d5353231246959135fb7684Greg Clayton break; 16739c09181404cc35f65d5353231246959135fb7684Greg Clayton } 16749c09181404cc35f65d5353231246959135fb7684Greg Clayton if (check_virtuality) 16759c09181404cc35f65d5353231246959135fb7684Greg Clayton { 16769c09181404cc35f65d5353231246959135fb7684Greg Clayton if (die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_virtuality, 0) != 0) 16779c09181404cc35f65d5353231246959135fb7684Greg Clayton return true; 16789c09181404cc35f65d5353231246959135fb7684Greg Clayton } 16799c09181404cc35f65d5353231246959135fb7684Greg Clayton } 16809c09181404cc35f65d5353231246959135fb7684Greg Clayton } 16819c09181404cc35f65d5353231246959135fb7684Greg Clayton return false; 16829c09181404cc35f65d5353231246959135fb7684Greg Clayton} 16839c09181404cc35f65d5353231246959135fb7684Greg Clayton 168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::ParseChildMembers 168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const SymbolContext& sc, 16881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton DWARFCompileUnit* dwarf_cu, 168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *parent_die, 169052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType &class_clang_type, 16919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const LanguageType class_language, 169224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<clang::CXXBaseSpecifier *>& base_classes, 169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<int>& member_accessibilities, 1694b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton DWARFDIECollection& member_function_dies, 1695a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan DelayedPropertyList& delayed_properties, 169670a4f92d0e5f605c8ed1662fa959d465c96b0fb9Sean Callanan AccessType& default_accessibility, 16973fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton bool &is_a_class, 16983fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton LayoutInfo &layout_info 169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_die == NULL) 170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 170324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 170424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t count = 0; 170524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *die; 17065fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize()); 1707b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t member_idx = 0; 170848f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan BitfieldInfo last_field_info; 17095fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 171024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling()) 171124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 171224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_tag_t tag = die->Tag(); 171324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 171424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (tag) 171524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 171624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_member: 171706dc17f8eb821d7256fd42e56f85c2779a29f689Sean Callanan case DW_TAG_APPLE_property: 171824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::Attributes attributes; 1720e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton const size_t num_attributes = die->GetAttributes (this, 1721e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton dwarf_cu, 1722e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton fixed_form_sizes, 1723e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton attributes); 172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_attributes > 0) 172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Declaration decl; 1727f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton //DWARFExpression location; 172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name = NULL; 17292546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham const char *prop_name = NULL; 17302546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham const char *prop_getter_name = NULL; 17312546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham const char *prop_setter_name = NULL; 173217a0b5687dff1714d03f16521ff1b9ea3cb8e1a5Greg Clayton uint32_t prop_attributes = 0; 17332546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham 17342546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham 1735fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton bool is_artificial = false; 173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t encoding_uid = LLDB_INVALID_UID; 173770a4f92d0e5f605c8ed1662fa959d465c96b0fb9Sean Callanan AccessType accessibility = eAccessNone; 17383fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton uint32_t member_byte_offset = UINT32_MAX; 173924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t byte_size = 0; 174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bit_offset = 0; 174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bit_size = 0; 174217a0b5687dff1714d03f16521ff1b9ea3cb8e1a5Greg Clayton bool is_external = false; // On DW_TAG_members, this means the member is static 174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 1744fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton for (i=0; i<num_attributes && !is_artificial; ++i) 174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const dw_attr_t attr = attributes.AttributeAtIndex(i); 174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFFormValue form_value; 174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (attr) 175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_name: name = form_value.AsCString(&get_debug_str_data()); break; 175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_type: encoding_uid = form_value.Reference(dwarf_cu); break; 175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_bit_offset: bit_offset = form_value.Unsigned(); break; 175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_bit_size: bit_size = form_value.Unsigned(); break; 175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_byte_size: byte_size = form_value.Unsigned(); break; 176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_data_member_location: 17613fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton if (form_value.BlockData()) 17623fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton { 17633fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton Value initialValue(0); 17643fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton Value memberOffset(0); 17653fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton const DataExtractor& debug_info_data = get_debug_info_data(); 17663fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton uint32_t block_length = form_value.Unsigned(); 17673fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart(); 17683fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton if (DWARFExpression::Evaluate(NULL, // ExecutionContext * 17693fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton NULL, // ClangExpressionVariableList * 17703fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton NULL, // ClangExpressionDeclMap * 17713fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton NULL, // RegisterContext * 17723fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton debug_info_data, 17733fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton block_offset, 17743fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton block_length, 17753fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton eRegisterKindDWARF, 17763fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton &initialValue, 17773fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton memberOffset, 17783fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton NULL)) 17793fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton { 178052f792329be5db8e38961350589e97e8f2823acdGreg Clayton member_byte_offset = memberOffset.ResolveValue(NULL).UInt(); 17813fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton } 17823fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton } 17830b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi else 17840b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi { 17850b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi // With DWARF 3 and later, if the value is an integer constant, 17860b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi // this form value is the offset in bytes from the beginning 17870b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi // of the containing entity. 17880b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi member_byte_offset = form_value.Unsigned(); 17890b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi } 179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 179284f8075072eef306234f8109573067647735c111Greg Clayton case DW_AT_accessibility: accessibility = DW_ACCESS_to_AccessType (form_value.Unsigned()); break; 1793f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton case DW_AT_artificial: is_artificial = form_value.Boolean(); break; 17942546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham case DW_AT_APPLE_property_name: prop_name = form_value.AsCString(&get_debug_str_data()); break; 17952546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham case DW_AT_APPLE_property_getter: prop_getter_name = form_value.AsCString(&get_debug_str_data()); break; 17962546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham case DW_AT_APPLE_property_setter: prop_setter_name = form_value.AsCString(&get_debug_str_data()); break; 17972546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham case DW_AT_APPLE_property_attribute: prop_attributes = form_value.Unsigned(); break; 1798f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton case DW_AT_external: is_external = form_value.Boolean(); break; 17992546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham 180024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 180139994c64a21bb520f81466c4235d9cf936a22ab6Greg Clayton case DW_AT_declaration: 180239994c64a21bb520f81466c4235d9cf936a22ab6Greg Clayton case DW_AT_description: 180339994c64a21bb520f81466c4235d9cf936a22ab6Greg Clayton case DW_AT_mutable: 180439994c64a21bb520f81466c4235d9cf936a22ab6Greg Clayton case DW_AT_visibility: 180524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_sibling: 180624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 180824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 180924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18108d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan 18118d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan if (prop_name) 18121ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan { 18138d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan ConstString fixed_getter; 18148d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan ConstString fixed_setter; 18158d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan 18168d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan // Check if the property getter/setter were provided as full 18178d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan // names. We want basenames, so we extract them. 18188d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan 18198d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan if (prop_getter_name && prop_getter_name[0] == '-') 18208d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan { 1821f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton ObjCLanguageRuntime::MethodName prop_getter_method(prop_getter_name, true); 1822f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton prop_getter_name = prop_getter_method.GetSelector().GetCString(); 18238d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan } 18248d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan 18258d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan if (prop_setter_name && prop_setter_name[0] == '-') 18268d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan { 1827f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton ObjCLanguageRuntime::MethodName prop_setter_method(prop_setter_name, true); 1828f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton prop_setter_name = prop_setter_method.GetSelector().GetCString(); 18298d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan } 18308d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan 18318d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan // If the names haven't been provided, they need to be 18328d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan // filled in. 18338d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan 18348d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan if (!prop_getter_name) 18358d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan { 18368d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan prop_getter_name = prop_name; 18378d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan } 18388d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan if (!prop_setter_name && prop_name[0] && !(prop_attributes & DW_APPLE_PROPERTY_readonly)) 18398d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan { 18408d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan StreamString ss; 18418d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan 18428d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan ss.Printf("set%c%s:", 18438d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan toupper(prop_name[0]), 18448d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan &prop_name[1]); 18458d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan 18468d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan fixed_setter.SetCString(ss.GetData()); 18478d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan prop_setter_name = fixed_setter.GetCString(); 18488d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan } 18491ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan } 18501ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan 18511ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan // Clang has a DWARF generation bug where sometimes it 185266756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton // represents fields that are references with bad byte size 185366756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton // and bit size/offset information such as: 185466756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton // 185566756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton // DW_AT_byte_size( 0x00 ) 185666756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton // DW_AT_bit_size( 0x40 ) 185766756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton // DW_AT_bit_offset( 0xffffffffffffffc0 ) 185866756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton // 185966756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton // So check the bit offset to make sure it is sane, and if 186066756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton // the values are not sane, remove them. If we don't do this 186166756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton // then we will end up with a crash if we try to use this 186266756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton // type in an expression when clang becomes unhappy with its 186366756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton // recycled debug info. 18644ee40ac5bf435bea35e912b157884d0efd598338Sean Callanan 186566756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton if (bit_offset > 128) 186666756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton { 186766756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton bit_size = 0; 186866756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton bit_offset = 0; 186966756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton } 187066756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton 187166756c2e6de990359f3e6f306bd16205b981dba7Greg Clayton // FIXME: Make Clang ignore Objective-C accessibility for expressions 18724ee40ac5bf435bea35e912b157884d0efd598338Sean Callanan if (class_language == eLanguageTypeObjC || 18734ee40ac5bf435bea35e912b157884d0efd598338Sean Callanan class_language == eLanguageTypeObjC_plus_plus) 18744ee40ac5bf435bea35e912b157884d0efd598338Sean Callanan accessibility = eAccessNone; 1875b01000fd063629facd45044f137446fb748ee179Greg Clayton 1876b01000fd063629facd45044f137446fb748ee179Greg Clayton if (member_idx == 0 && !is_artificial && name && (strstr (name, "_vptr$") == name)) 1877b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1878b01000fd063629facd45044f137446fb748ee179Greg Clayton // Not all compilers will mark the vtable pointer 1879b01000fd063629facd45044f137446fb748ee179Greg Clayton // member as artificial (llvm-gcc). We can't have 1880b01000fd063629facd45044f137446fb748ee179Greg Clayton // the virtual members in our classes otherwise it 1881b01000fd063629facd45044f137446fb748ee179Greg Clayton // throws off all child offsets since we end up 1882b01000fd063629facd45044f137446fb748ee179Greg Clayton // having and extra pointer sized member in our 1883b01000fd063629facd45044f137446fb748ee179Greg Clayton // class layouts. 1884b01000fd063629facd45044f137446fb748ee179Greg Clayton is_artificial = true; 1885b01000fd063629facd45044f137446fb748ee179Greg Clayton } 188624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 188713a63b92b2c94d587071e9078cab3350b52094b1Greg Clayton // Handle static members 188817a0b5687dff1714d03f16521ff1b9ea3cb8e1a5Greg Clayton if (is_external && member_byte_offset == UINT32_MAX) 18893525576f2cddc2a7b82b2bec3fd885ef6b1b5a52Greg Clayton { 18903525576f2cddc2a7b82b2bec3fd885ef6b1b5a52Greg Clayton Type *var_type = ResolveTypeUID(encoding_uid); 18913525576f2cddc2a7b82b2bec3fd885ef6b1b5a52Greg Clayton 18923525576f2cddc2a7b82b2bec3fd885ef6b1b5a52Greg Clayton if (var_type) 18933525576f2cddc2a7b82b2bec3fd885ef6b1b5a52Greg Clayton { 189413a63b92b2c94d587071e9078cab3350b52094b1Greg Clayton if (accessibility == eAccessNone) 189513a63b92b2c94d587071e9078cab3350b52094b1Greg Clayton accessibility = eAccessPublic; 189652f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_clang_type.AddVariableToRecordType (name, 189752f792329be5db8e38961350589e97e8f2823acdGreg Clayton var_type->GetClangLayoutType(), 189852f792329be5db8e38961350589e97e8f2823acdGreg Clayton accessibility); 18993525576f2cddc2a7b82b2bec3fd885ef6b1b5a52Greg Clayton } 190017a0b5687dff1714d03f16521ff1b9ea3cb8e1a5Greg Clayton break; 19013525576f2cddc2a7b82b2bec3fd885ef6b1b5a52Greg Clayton } 190217a0b5687dff1714d03f16521ff1b9ea3cb8e1a5Greg Clayton 1903fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton if (is_artificial == false) 1904fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton { 1905fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton Type *member_type = ResolveTypeUID(encoding_uid); 190623e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan 19072546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham clang::FieldDecl *field_decl = NULL; 19081ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan if (tag == DW_TAG_member) 19093fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton { 19101ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan if (member_type) 19111ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan { 19121ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan if (accessibility == eAccessNone) 19131ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan accessibility = default_accessibility; 19141ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan member_accessibilities.push_back(accessibility); 191548f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan 191648f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan BitfieldInfo this_field_info; 191748f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan 191848f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan this_field_info.bit_size = bit_size; 191948f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan 192048f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan if (member_byte_offset != UINT32_MAX || bit_size != 0) 192148f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan { 192248f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan ///////////////////////////////////////////////////////////// 192348f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // How to locate a field given the DWARF debug information 192448f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // 192548f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // AT_byte_size indicates the size of the word in which the 192648f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // bit offset must be interpreted. 192748f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // 192848f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // AT_data_member_location indicates the byte offset of the 192948f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // word from the base address of the structure. 193048f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // 193148f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // AT_bit_offset indicates how many bits into the word 193248f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // (according to the host endianness) the low-order bit of 193348f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // the field starts. AT_bit_offset can be negative. 193448f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // 193548f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // AT_bit_size indicates the size of the field in bits. 193648f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan ///////////////////////////////////////////////////////////// 193748f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan 193848f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan this_field_info.bit_offset = 0; 193948f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan 194048f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan this_field_info.bit_offset += (member_byte_offset == UINT32_MAX ? 0 : (member_byte_offset * 8)); 194148f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan 194248f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan if (GetObjectFile()->GetByteOrder() == eByteOrderLittle) 194348f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan { 194448f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan this_field_info.bit_offset += byte_size * 8; 194548f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan this_field_info.bit_offset -= (bit_offset + bit_size); 194648f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan } 194748f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan else 194848f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan { 194948f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan this_field_info.bit_offset += bit_offset; 195048f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan } 195148f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan } 19521ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan 195348f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // If the member to be emitted did not start on a character boundary and there is 195448f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // empty space between the last field and this one, then we need to emit an 195548f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // anonymous member filling up the space up to its start. There are three cases 195648f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // here: 195748f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // 195848f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // 1 If the previous member ended on a character boundary, then we can emit an 195948f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // anonymous member starting at the most recent character boundary. 196048f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // 196148f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // 2 If the previous member did not end on a character boundary and the distance 196248f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // from the end of the previous member to the current member is less than a 196348f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // word width, then we can emit an anonymous member starting right after the 196448f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // previous member and right before this member. 196548f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // 196648f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // 3 If the previous member did not end on a character boundary and the distance 196748f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // from the end of the previous member to the current member is greater than 196848f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // or equal a word width, then we act as in Case 1. 196948f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan 197048f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan const uint64_t character_width = 8; 197148f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan const uint64_t word_width = 32; 197248f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan 197348f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan if (this_field_info.IsValid()) 1974f270fa9682d748c1be1aea1993fd8d2408639f4cGreg Clayton { 197548f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // Objective-C has invalid DW_AT_bit_offset values in older versions 197648f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan // of clang, so we have to be careful and only insert unnammed bitfields 197714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton // if we have a new enough clang. 197814fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton bool detect_unnamed_bitfields = true; 1979f270fa9682d748c1be1aea1993fd8d2408639f4cGreg Clayton 198014fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton if (class_language == eLanguageTypeObjC || class_language == eLanguageTypeObjC_plus_plus) 198114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton detect_unnamed_bitfields = dwarf_cu->Supports_unnamed_objc_bitfields (); 198214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton 198314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton if (detect_unnamed_bitfields) 1984f270fa9682d748c1be1aea1993fd8d2408639f4cGreg Clayton { 198548f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan BitfieldInfo anon_field_info; 198648f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan 198748f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan if ((this_field_info.bit_offset % character_width) != 0) // not char aligned 1988f270fa9682d748c1be1aea1993fd8d2408639f4cGreg Clayton { 198948f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan uint64_t last_field_end = 0; 1990f270fa9682d748c1be1aea1993fd8d2408639f4cGreg Clayton 199148f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan if (last_field_info.IsValid()) 199248f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan last_field_end = last_field_info.bit_offset + last_field_info.bit_size; 1993f270fa9682d748c1be1aea1993fd8d2408639f4cGreg Clayton 199448f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan if (this_field_info.bit_offset != last_field_end) 199548f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan { 199648f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan if (((last_field_end % character_width) == 0) || // case 1 199748f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan (this_field_info.bit_offset - last_field_end >= word_width)) // case 3 199848f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan { 199948f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan anon_field_info.bit_size = this_field_info.bit_offset % character_width; 200048f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan anon_field_info.bit_offset = this_field_info.bit_offset - anon_field_info.bit_size; 200148f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan } 200248f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan else // case 2 200348f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan { 200448f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan anon_field_info.bit_size = this_field_info.bit_offset - last_field_end; 200548f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan anon_field_info.bit_offset = last_field_end; 200648f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan } 2007f270fa9682d748c1be1aea1993fd8d2408639f4cGreg Clayton } 2008f270fa9682d748c1be1aea1993fd8d2408639f4cGreg Clayton } 2009f270fa9682d748c1be1aea1993fd8d2408639f4cGreg Clayton 201048f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan if (anon_field_info.IsValid()) 2011f270fa9682d748c1be1aea1993fd8d2408639f4cGreg Clayton { 201252f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::FieldDecl *unnamed_bitfield_decl = class_clang_type.AddFieldToRecordType (NULL, 201352f792329be5db8e38961350589e97e8f2823acdGreg Clayton GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, word_width), 201452f792329be5db8e38961350589e97e8f2823acdGreg Clayton accessibility, 201552f792329be5db8e38961350589e97e8f2823acdGreg Clayton anon_field_info.bit_size); 2016f270fa9682d748c1be1aea1993fd8d2408639f4cGreg Clayton 201748f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan layout_info.field_offsets.insert(std::make_pair(unnamed_bitfield_decl, anon_field_info.bit_offset)); 2018f270fa9682d748c1be1aea1993fd8d2408639f4cGreg Clayton } 2019f270fa9682d748c1be1aea1993fd8d2408639f4cGreg Clayton } 2020f270fa9682d748c1be1aea1993fd8d2408639f4cGreg Clayton } 202148f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan 202252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType member_clang_type = member_type->GetClangLayoutType(); 202323e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan 202423e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan { 202523e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan // Older versions of clang emit array[0] and array[1] in the same way (<rdar://problem/12566646>). 202623e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan // If the current field is at the end of the structure, then there is definitely no room for extra 202723e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan // elements and we override the type to array[0]. 202823e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan 202952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType member_array_element_type; 203023e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan uint64_t member_array_size; 203123e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan bool member_array_is_incomplete; 203223e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan 203352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (member_clang_type.IsArrayType(&member_array_element_type, 203452f792329be5db8e38961350589e97e8f2823acdGreg Clayton &member_array_size, 203552f792329be5db8e38961350589e97e8f2823acdGreg Clayton &member_array_is_incomplete) && 203623e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan !member_array_is_incomplete) 203723e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan { 203823e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan uint64_t parent_byte_size = parent_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_byte_size, UINT64_MAX); 203923e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan 204023e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan if (member_byte_offset >= parent_byte_size) 204123e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan { 204223e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan if (member_array_size != 1) 204323e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan { 204423e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan GetObjectFile()->GetModule()->ReportError ("0x%8.8" PRIx64 ": DW_TAG_member '%s' refers to type 0x%8.8" PRIx64 " which extends beyond the bounds of 0x%8.8" PRIx64, 204523e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan MakeUserID(die->GetOffset()), 204623e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan name, 204723e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan encoding_uid, 204823e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan MakeUserID(parent_die->GetOffset())); 204923e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan } 205023e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan 2051f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton member_clang_type = GetClangASTContext().CreateArrayType(member_array_element_type, 0, false); 205223e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan } 205323e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan } 205423e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan } 205523e2b6d3b518ea0166d1031888ed16a567b973efSean Callanan 205652f792329be5db8e38961350589e97e8f2823acdGreg Clayton field_decl = class_clang_type.AddFieldToRecordType (name, 205752f792329be5db8e38961350589e97e8f2823acdGreg Clayton member_clang_type, 205852f792329be5db8e38961350589e97e8f2823acdGreg Clayton accessibility, 205952f792329be5db8e38961350589e97e8f2823acdGreg Clayton bit_size); 2060fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan 2061017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton GetClangASTContext().SetMetadataAsUserID (field_decl, MakeUserID(die->GetOffset())); 206248f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan 206348f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan if (this_field_info.IsValid()) 206448f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan { 206548f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan layout_info.field_offsets.insert(std::make_pair(field_decl, this_field_info.bit_offset)); 206648f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan last_field_info = this_field_info; 206748f833c33b8c2713e99139941ce3b3885883c4f0Sean Callanan } 20688f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan } 20698f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan else 20708f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan { 20711ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan if (name) 20725f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea GetObjectFile()->GetModule()->ReportError ("0x%8.8" PRIx64 ": DW_TAG_member '%s' refers to type 0x%8.8" PRIx64 " which was unable to be parsed", 20731ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan MakeUserID(die->GetOffset()), 20741ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan name, 20751ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan encoding_uid); 20761ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan else 20775f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea GetObjectFile()->GetModule()->ReportError ("0x%8.8" PRIx64 ": DW_TAG_member refers to type 0x%8.8" PRIx64 " which was unable to be parsed", 20781ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan MakeUserID(die->GetOffset()), 20791ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan encoding_uid); 20808f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan } 20813fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton } 20821ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan 20832546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham if (prop_name != NULL) 20842546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham { 20851ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan clang::ObjCIvarDecl *ivar_decl = NULL; 20862546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham 20871ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan if (field_decl) 20881ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan { 20891ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan ivar_decl = clang::dyn_cast<clang::ObjCIvarDecl>(field_decl); 20901ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan assert (ivar_decl != NULL); 20911ec8f8fc244b7714a7847525cb9474ebcd85487aSean Callanan } 20922546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham 2093a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham ClangASTMetadata metadata; 2094a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham metadata.SetUserID (MakeUserID(die->GetOffset())); 209552f792329be5db8e38961350589e97e8f2823acdGreg Clayton delayed_properties.push_back(DelayedAddObjCClassProperty(class_clang_type, 2096a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan prop_name, 2097a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan member_type->GetClangLayoutType(), 2098a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan ivar_decl, 2099a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan prop_setter_name, 2100a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan prop_getter_name, 2101a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan prop_attributes, 2102a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham &metadata)); 2103fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan 2104a4974db9b26cc4f33e16c990304b51f4a1d38611Sean Callanan if (ivar_decl) 2105017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton GetClangASTContext().SetMetadataAsUserID (ivar_decl, MakeUserID(die->GetOffset())); 21062546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham } 2107fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton } 210824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2109b01000fd063629facd45044f137446fb748ee179Greg Clayton ++member_idx; 211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_subprogram: 2114b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton // Let the type parsing code handle this one for us. 2115b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton member_function_dies.Append (die); 211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_inheritance: 211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_a_class = true; 212170a4f92d0e5f605c8ed1662fa959d465c96b0fb9Sean Callanan if (default_accessibility == eAccessNone) 212270a4f92d0e5f605c8ed1662fa959d465c96b0fb9Sean Callanan default_accessibility = eAccessPrivate; 212324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: implement DW_TAG_inheritance type parsing 212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::Attributes attributes; 2125e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton const size_t num_attributes = die->GetAttributes (this, 2126e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton dwarf_cu, 2127e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton fixed_form_sizes, 2128e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton attributes); 212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_attributes > 0) 213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Declaration decl; 213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFExpression location; 213324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t encoding_uid = LLDB_INVALID_UID; 213470a4f92d0e5f605c8ed1662fa959d465c96b0fb9Sean Callanan AccessType accessibility = default_accessibility; 213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_virtual = false; 213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_base_of_class = true; 213788db4597c7567be050b7a729f7306832f28428bbGreg Clayton off_t member_byte_offset = 0; 213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_attributes; ++i) 214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const dw_attr_t attr = attributes.AttributeAtIndex(i); 214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFFormValue form_value; 214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 214524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (attr) 214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 214924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_type: encoding_uid = form_value.Reference(dwarf_cu); break; 215188db4597c7567be050b7a729f7306832f28428bbGreg Clayton case DW_AT_data_member_location: 215288db4597c7567be050b7a729f7306832f28428bbGreg Clayton if (form_value.BlockData()) 215388db4597c7567be050b7a729f7306832f28428bbGreg Clayton { 215488db4597c7567be050b7a729f7306832f28428bbGreg Clayton Value initialValue(0); 215588db4597c7567be050b7a729f7306832f28428bbGreg Clayton Value memberOffset(0); 215688db4597c7567be050b7a729f7306832f28428bbGreg Clayton const DataExtractor& debug_info_data = get_debug_info_data(); 215788db4597c7567be050b7a729f7306832f28428bbGreg Clayton uint32_t block_length = form_value.Unsigned(); 215888db4597c7567be050b7a729f7306832f28428bbGreg Clayton uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart(); 215988db4597c7567be050b7a729f7306832f28428bbGreg Clayton if (DWARFExpression::Evaluate (NULL, 216088db4597c7567be050b7a729f7306832f28428bbGreg Clayton NULL, 216188db4597c7567be050b7a729f7306832f28428bbGreg Clayton NULL, 216288db4597c7567be050b7a729f7306832f28428bbGreg Clayton NULL, 216388db4597c7567be050b7a729f7306832f28428bbGreg Clayton debug_info_data, 216488db4597c7567be050b7a729f7306832f28428bbGreg Clayton block_offset, 216588db4597c7567be050b7a729f7306832f28428bbGreg Clayton block_length, 216688db4597c7567be050b7a729f7306832f28428bbGreg Clayton eRegisterKindDWARF, 216788db4597c7567be050b7a729f7306832f28428bbGreg Clayton &initialValue, 216888db4597c7567be050b7a729f7306832f28428bbGreg Clayton memberOffset, 216988db4597c7567be050b7a729f7306832f28428bbGreg Clayton NULL)) 217088db4597c7567be050b7a729f7306832f28428bbGreg Clayton { 217152f792329be5db8e38961350589e97e8f2823acdGreg Clayton member_byte_offset = memberOffset.ResolveValue(NULL).UInt(); 217288db4597c7567be050b7a729f7306832f28428bbGreg Clayton } 217388db4597c7567be050b7a729f7306832f28428bbGreg Clayton } 21740b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi else 21750b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi { 21760b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi // With DWARF 3 and later, if the value is an integer constant, 21770b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi // this form value is the offset in bytes from the beginning 21780b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi // of the containing entity. 21790b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi member_byte_offset = form_value.Unsigned(); 21800b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi } 218188db4597c7567be050b7a729f7306832f28428bbGreg Clayton break; 218224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 218324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_accessibility: 218484f8075072eef306234f8109573067647735c111Greg Clayton accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); 218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21870b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi case DW_AT_virtuality: 21880b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi is_virtual = form_value.Boolean(); 21890b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi break; 21900b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi 219124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_sibling: 219224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 21930b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi 21940b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi default: 21950b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi break; 219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22006916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton Type *base_class_type = ResolveTypeUID(encoding_uid); 22016916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton assert(base_class_type); 22029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 220352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType base_class_clang_type = base_class_type->GetClangFullType(); 220404c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton assert (base_class_clang_type); 22059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_language == eLanguageTypeObjC) 22069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 220752f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_clang_type.SetObjCSuperClass(base_class_clang_type); 22089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 22109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 221152f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_classes.push_back (base_class_clang_type.CreateBaseClassSpecifier (accessibility, 2212e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton is_virtual, 2213e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton is_base_of_class)); 221488db4597c7567be050b7a729f7306832f28428bbGreg Clayton 221588db4597c7567be050b7a729f7306832f28428bbGreg Clayton if (is_virtual) 221688db4597c7567be050b7a729f7306832f28428bbGreg Clayton { 221752f792329be5db8e38961350589e97e8f2823acdGreg Clayton layout_info.vbase_offsets.insert(std::make_pair(class_clang_type.GetAsCXXRecordDecl(), 221888db4597c7567be050b7a729f7306832f28428bbGreg Clayton clang::CharUnits::fromQuantity(member_byte_offset))); 221988db4597c7567be050b7a729f7306832f28428bbGreg Clayton } 222088db4597c7567be050b7a729f7306832f28428bbGreg Clayton else 222188db4597c7567be050b7a729f7306832f28428bbGreg Clayton { 222252f792329be5db8e38961350589e97e8f2823acdGreg Clayton layout_info.base_offsets.insert(std::make_pair(class_clang_type.GetAsCXXRecordDecl(), 222388db4597c7567be050b7a729f7306832f28428bbGreg Clayton clang::CharUnits::fromQuantity(member_byte_offset))); 222488db4597c7567be050b7a729f7306832f28428bbGreg Clayton } 22259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 223324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2234a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan 223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return count; 223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclang::DeclContext* 2240c617a4cb4a451be9d7e97d7af6e165d282b5390fSean CallananSymbolFileDWARF::GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid) 224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfo* debug_info = DebugInfo(); 2243444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (debug_info && UserIDMatches(type_uid)) 224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 224524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFCompileUnitSP cu_sp; 224624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry* die = debug_info->GetDIEPtr(type_uid, &cu_sp); 224724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (die) 224803fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton return GetClangDeclContextContainingDIE (cu_sp.get(), die, NULL); 2249c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan } 2250c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan return NULL; 2251c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan} 2252c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 2253c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callananclang::DeclContext* 2254c617a4cb4a451be9d7e97d7af6e165d282b5390fSean CallananSymbolFileDWARF::GetClangDeclContextForTypeUID (const lldb_private::SymbolContext &sc, lldb::user_id_t type_uid) 2255c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan{ 2256444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (UserIDMatches(type_uid)) 2257444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton return GetClangDeclContextForDIEOffset (sc, type_uid); 2258444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton return NULL; 225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerType* 226274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg ClaytonSymbolFileDWARF::ResolveTypeUID (lldb::user_id_t type_uid) 226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2264444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (UserIDMatches(type_uid)) 226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2266444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton DWARFDebugInfo* debug_info = DebugInfo(); 2267444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (debug_info) 22680d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton { 2269444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton DWARFCompileUnitSP cu_sp; 2270444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton const DWARFDebugInfoEntry* type_die = debug_info->GetDIEPtr(type_uid, &cu_sp); 2271d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton const bool assert_not_being_parsed = true; 2272d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton return ResolveTypeUID (cu_sp.get(), type_die, assert_not_being_parsed); 2273d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton } 2274d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton } 2275d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton return NULL; 2276d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton} 2277d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton 2278d7088cf9454164ce3a54e345a2c0a07bc1015335Greg ClaytonType* 2279d7088cf9454164ce3a54e345a2c0a07bc1015335Greg ClaytonSymbolFileDWARF::ResolveTypeUID (DWARFCompileUnit* cu, const DWARFDebugInfoEntry* die, bool assert_not_being_parsed) 22808f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan{ 2281d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton if (die != NULL) 2282d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton { 2283952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO)); 2284d7fc5b8d107b3df44acfcc694f26875e06c1b4e0Greg Clayton if (log) 2285952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 2286df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton "SymbolFileDWARF::ResolveTypeUID (die = 0x%8.8x) %s '%s'", 2287df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton die->GetOffset(), 2288df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton DW_TAG_value_to_name(die->Tag()), 2289df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton die->GetName(this, cu)); 2290d7fc5b8d107b3df44acfcc694f26875e06c1b4e0Greg Clayton 2291d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton // We might be coming in in the middle of a type tree (a class 2292d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton // withing a class, an enum within a class), so parse any needed 2293d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton // parent DIEs before we get to this one... 2294d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton const DWARFDebugInfoEntry *decl_ctx_die = GetDeclContextDIEContainingDIE (cu, die); 2295d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton switch (decl_ctx_die->Tag()) 2296d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton { 2297d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton case DW_TAG_structure_type: 2298d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton case DW_TAG_union_type: 2299d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton case DW_TAG_class_type: 23000d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton { 2301d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton // Get the type, which could be a forward declaration 2302d7fc5b8d107b3df44acfcc694f26875e06c1b4e0Greg Clayton if (log) 2303952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 2304df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton "SymbolFileDWARF::ResolveTypeUID (die = 0x%8.8x) %s '%s' resolve parent forward type for 0x%8.8x", 2305df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton die->GetOffset(), 2306df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton DW_TAG_value_to_name(die->Tag()), 2307df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton die->GetName(this, cu), 2308df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton decl_ctx_die->GetOffset()); 23093356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// 23103356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// Type *parent_type = ResolveTypeUID (cu, decl_ctx_die, assert_not_being_parsed); 23113356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// if (child_requires_parent_class_union_or_struct_to_be_completed(die->Tag())) 23123356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// { 23133356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// if (log) 2314952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton// GetObjectFile()->GetModule()->LogMessage (log, 23153356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// "SymbolFileDWARF::ResolveTypeUID (die = 0x%8.8x) %s '%s' resolve parent full type for 0x%8.8x since die is a function", 23163356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// die->GetOffset(), 23173356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// DW_TAG_value_to_name(die->Tag()), 23183356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// die->GetName(this, cu), 23193356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// decl_ctx_die->GetOffset()); 23203356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// // Ask the type to complete itself if it already hasn't since if we 23213356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// // want a function (method or static) from a class, the class must 23223356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// // create itself and add it's own methods and class functions. 23233356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// if (parent_type) 23243356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// parent_type->GetClangFullType(); 23253356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton// } 23260d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton } 2327d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton break; 2328d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton 2329d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton default: 2330d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton break; 23310d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton } 2332d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton return ResolveType (cu, die); 233324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 233424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 233524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 233624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2337b01000fd063629facd45044f137446fb748ee179Greg Clayton// This function is used when SymbolFileDWARFDebugMap owns a bunch of 2338b01000fd063629facd45044f137446fb748ee179Greg Clayton// SymbolFileDWARF objects to detect if this DWARF file is the one that 2339b01000fd063629facd45044f137446fb748ee179Greg Clayton// can resolve a clang_type. 2340b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 234152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonSymbolFileDWARF::HasForwardDeclForClangType (const ClangASTType &clang_type) 2342b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 234352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type_no_qualifiers = clang_type.RemoveFastQualifiers(); 234452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const DWARFDebugInfoEntry* die = m_forward_decl_clang_type_to_die.lookup (clang_type_no_qualifiers.GetOpaqueQualType()); 2345b01000fd063629facd45044f137446fb748ee179Greg Clayton return die != NULL; 2346b01000fd063629facd45044f137446fb748ee179Greg Clayton} 2347b01000fd063629facd45044f137446fb748ee179Greg Clayton 2348b01000fd063629facd45044f137446fb748ee179Greg Clayton 234952f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 235052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonSymbolFileDWARF::ResolveClangOpaqueTypeDefinition (ClangASTType &clang_type) 2351462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{ 2352462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton // We have a struct/union/class/enum that needs to be fully resolved. 235352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type_no_qualifiers = clang_type.RemoveFastQualifiers(); 235452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const DWARFDebugInfoEntry* die = m_forward_decl_clang_type_to_die.lookup (clang_type_no_qualifiers.GetOpaqueQualType()); 2355462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (die == NULL) 2356f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2357f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have already resolved this type... 235852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 2359f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2360f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Once we start resolving this type, remove it from the forward declaration 2361f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // map in case anyone child members or other types require this type to get resolved. 2362f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // The type will get resolved when all of the calls to SymbolFileDWARF::ResolveClangOpaqueTypeDefinition 2363f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // are done. 236452f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_forward_decl_clang_type_to_die.erase (clang_type_no_qualifiers.GetOpaqueQualType()); 2365f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2366462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 23674c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton // Disable external storage for this type so we don't get anymore 23684c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton // clang::ExternalASTSource queries for this type. 236952f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.SetHasExternalStorage (false); 23704c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton 2371ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton DWARFDebugInfo* debug_info = DebugInfo(); 2372ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 23730be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton DWARFCompileUnit *dwarf_cu = debug_info->GetCompileUnitContainingDIE (die->GetOffset()).get(); 2374462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton Type *type = m_die_to_type.lookup (die); 2375462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 2376462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const dw_tag_t tag = die->Tag(); 2377462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 2378952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO|DWARF_LOG_TYPE_COMPLETION)); 2379d7fc5b8d107b3df44acfcc694f26875e06c1b4e0Greg Clayton if (log) 238086b391bd742589c2b243e7c4beb5fa522ee0c481Greg Clayton { 2381952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessageVerboseBacktrace (log, 23825f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea "0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...", 238373a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton MakeUserID(die->GetOffset()), 238473a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton DW_TAG_value_to_name(tag), 238573a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton type->GetName().AsCString()); 238686b391bd742589c2b243e7c4beb5fa522ee0c481Greg Clayton 238786b391bd742589c2b243e7c4beb5fa522ee0c481Greg Clayton } 2388462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton assert (clang_type); 2389462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton DWARFDebugInfoEntry::Attributes attributes; 2390462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 2391462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton switch (tag) 2392462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 2393462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton case DW_TAG_structure_type: 2394462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton case DW_TAG_union_type: 2395462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton case DW_TAG_class_type: 2396b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton { 23973fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton LayoutInfo layout_info; 2398493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan 2399b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton { 2400493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan if (die->HasChildren()) 24013fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton { 2402493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan 2403493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan LanguageType class_language = eLanguageTypeUnknown; 240452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type.IsObjCObjectOrInterfaceType()) 24053356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton { 2406493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan class_language = eLanguageTypeObjC; 24073356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton // For objective C we don't start the definition when 24083356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton // the class is created. 240952f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.StartTagDeclarationDefinition (); 24103356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton } 2411493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan 2412493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan int tag_decl_kind = -1; 2413493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan AccessType default_accessibility = eAccessNone; 2414493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan if (tag == DW_TAG_structure_type) 241524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton { 2416493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan tag_decl_kind = clang::TTK_Struct; 2417493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan default_accessibility = eAccessPublic; 241824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton } 2419493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan else if (tag == DW_TAG_union_type) 2420493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan { 2421493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan tag_decl_kind = clang::TTK_Union; 2422493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan default_accessibility = eAccessPublic; 2423493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan } 2424493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan else if (tag == DW_TAG_class_type) 2425ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton { 2426493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan tag_decl_kind = clang::TTK_Class; 2427493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan default_accessibility = eAccessPrivate; 2428493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan } 24293fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton 24300be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton SymbolContext sc(GetCompUnitForDWARFCompUnit(dwarf_cu)); 2431493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan std::vector<clang::CXXBaseSpecifier *> base_classes; 2432493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan std::vector<int> member_accessibilities; 2433493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan bool is_a_class = false; 2434493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // Parse members and base classes first 2435493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan DWARFDIECollection member_function_dies; 2436a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan 2437a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan DelayedPropertyList delayed_properties; 2438f270fa9682d748c1be1aea1993fd8d2408639f4cGreg Clayton ParseChildMembers (sc, 24390be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton dwarf_cu, 2440493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan die, 2441493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan clang_type, 2442493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan class_language, 2443493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan base_classes, 2444493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan member_accessibilities, 2445493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan member_function_dies, 2446a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan delayed_properties, 2447493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan default_accessibility, 2448493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan is_a_class, 2449493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan layout_info); 2450493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan 2451493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // Now parse any methods if there were any... 2452493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan size_t num_functions = member_function_dies.Size(); 2453493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan if (num_functions > 0) 2454493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan { 2455493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan for (size_t i=0; i<num_functions; ++i) 24563fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton { 24570be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton ResolveType(dwarf_cu, member_function_dies.GetDIEPtrAtIndex(i)); 24583fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton } 2459493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan } 2460493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan 2461493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan if (class_language == eLanguageTypeObjC) 2462493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan { 246352f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::string class_str (clang_type.GetTypeName()); 2464493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan if (!class_str.empty()) 2465ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton { 2466ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 2467493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan DIEArray method_die_offsets; 2468493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan if (m_using_apple_tables) 2469bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 2470493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan if (m_apple_objc_ap.get()) 2471493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan m_apple_objc_ap->FindByName(class_str.c_str(), method_die_offsets); 2472493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan } 2473493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan else 2474493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan { 2475493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan if (!m_indexed) 2476493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan Index (); 2477493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan 2478493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan ConstString class_name (class_str.c_str()); 2479493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan m_objc_class_selectors_index.Find (class_name, method_die_offsets); 2480493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan } 2481493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan 2482493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan if (!method_die_offsets.empty()) 2483493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan { 2484493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan DWARFDebugInfo* debug_info = DebugInfo(); 24853fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton 2486493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan DWARFCompileUnit* method_cu = NULL; 2487493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan const size_t num_matches = method_die_offsets.size(); 2488493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan for (size_t i=0; i<num_matches; ++i) 2489bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 2490493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan const dw_offset_t die_offset = method_die_offsets[i]; 2491493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan DWARFDebugInfoEntry *method_die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &method_cu); 2492493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan 2493493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan if (method_die) 2494493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan ResolveType (method_cu, method_die); 2495493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan else 24963fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton { 2497493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan if (m_using_apple_tables) 2498493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan { 2499493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_objc accelerator table had bad die 0x%8.8x for '%s')\n", 2500493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan die_offset, class_str.c_str()); 2501493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan } 2502493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan } 2503493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan } 25043fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton } 2505a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan 250652f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (DelayedPropertyList::iterator pi = delayed_properties.begin(), pe = delayed_properties.end(); 2507a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan pi != pe; 2508a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan ++pi) 2509a23b44181b98ccaf5125cd7213e8c3624fb71eacSean Callanan pi->Finalize(); 2510ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 2511ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 2512493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan 2513493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // If we have a DW_TAG_structure_type instead of a DW_TAG_class_type we 2514493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // need to tell the clang type it is actually a class. 2515493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan if (class_language != eLanguageTypeObjC) 2516493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan { 2517493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan if (is_a_class && tag_decl_kind != clang::TTK_Class) 251852f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.SetTagTypeKind (clang::TTK_Class); 2519493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan } 2520493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan 2521493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // Since DW_TAG_structure_type gets used for both classes 2522493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // and structures, we may need to set any DW_TAG_member 2523493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // fields to have a "private" access if none was specified. 2524493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // When we parsed the child members we tracked that actual 2525493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // accessibility value for each DW_TAG_member in the 2526493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // "member_accessibilities" array. If the value for the 2527493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // member is zero, then it was set to the "default_accessibility" 2528493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // which for structs was "public". Below we correct this 2529493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // by setting any fields to "private" that weren't correctly 2530493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // set. 2531493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan if (is_a_class && !member_accessibilities.empty()) 2532493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan { 2533493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // This is a class and all members that didn't have 2534493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // their access specified are private. 253552f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.SetDefaultAccessForRecordFields (eAccessPrivate, 253652f792329be5db8e38961350589e97e8f2823acdGreg Clayton &member_accessibilities.front(), 253752f792329be5db8e38961350589e97e8f2823acdGreg Clayton member_accessibilities.size()); 2538493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan } 2539493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan 2540493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan if (!base_classes.empty()) 2541493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan { 254252f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.SetBaseClassesForClassType (&base_classes.front(), 254352f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_classes.size()); 2544493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan 2545493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // Clang will copy each CXXBaseSpecifier in "base_classes" 2546493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan // so we have to free them all. 254752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType::DeleteBaseClassSpecifiers (&base_classes.front(), 254852f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_classes.size()); 2549493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan } 2550ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 25513fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton } 25523552ed0afbb58f377a4677ae5253e59b3ed80954Sean Callanan 255352f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.BuildIndirectFields (); 255452f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.CompleteTagDeclarationDefinition (); 25558f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 255688db4597c7567be050b7a729f7306832f28428bbGreg Clayton if (!layout_info.field_offsets.empty() || 255788db4597c7567be050b7a729f7306832f28428bbGreg Clayton !layout_info.base_offsets.empty() || 255888db4597c7567be050b7a729f7306832f28428bbGreg Clayton !layout_info.vbase_offsets.empty() ) 2559b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton { 25603fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton if (type) 25613fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton layout_info.bit_size = type->GetByteSize() * 8; 25623fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton if (layout_info.bit_size == 0) 25630be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton layout_info.bit_size = die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_byte_size, 0) * 8; 256488db4597c7567be050b7a729f7306832f28428bbGreg Clayton 256552f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::CXXRecordDecl *record_decl = clang_type.GetAsCXXRecordDecl(); 256688db4597c7567be050b7a729f7306832f28428bbGreg Clayton if (record_decl) 25673fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton { 25683fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton if (log) 2569a792abe6350b7e3241bfc7121eba74dbea5eca55Greg Clayton { 2570952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 25715f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) caching layout info for record_decl = %p, bit_size = %" PRIu64 ", alignment = %" PRIu64 ", field_offsets[%u], base_offsets[%u], vbase_offsets[%u])", 257252f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.GetOpaqueQualType(), 25733fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton record_decl, 25743fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton layout_info.bit_size, 25753fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton layout_info.alignment, 257688db4597c7567be050b7a729f7306832f28428bbGreg Clayton (uint32_t)layout_info.field_offsets.size(), 257788db4597c7567be050b7a729f7306832f28428bbGreg Clayton (uint32_t)layout_info.base_offsets.size(), 257888db4597c7567be050b7a729f7306832f28428bbGreg Clayton (uint32_t)layout_info.vbase_offsets.size()); 2579493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan 258088db4597c7567be050b7a729f7306832f28428bbGreg Clayton uint32_t idx; 258188db4597c7567be050b7a729f7306832f28428bbGreg Clayton { 2582a792abe6350b7e3241bfc7121eba74dbea5eca55Greg Clayton llvm::DenseMap <const clang::FieldDecl *, uint64_t>::const_iterator pos, end = layout_info.field_offsets.end(); 258388db4597c7567be050b7a729f7306832f28428bbGreg Clayton for (idx = 0, pos = layout_info.field_offsets.begin(); pos != end; ++pos, ++idx) 2584a792abe6350b7e3241bfc7121eba74dbea5eca55Greg Clayton { 2585952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 258688db4597c7567be050b7a729f7306832f28428bbGreg Clayton "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) field[%u] = { bit_offset=%u, name='%s' }", 258752f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.GetOpaqueQualType(), 258888db4597c7567be050b7a729f7306832f28428bbGreg Clayton idx, 2589a792abe6350b7e3241bfc7121eba74dbea5eca55Greg Clayton (uint32_t)pos->second, 2590a792abe6350b7e3241bfc7121eba74dbea5eca55Greg Clayton pos->first->getNameAsString().c_str()); 2591a792abe6350b7e3241bfc7121eba74dbea5eca55Greg Clayton } 259288db4597c7567be050b7a729f7306832f28428bbGreg Clayton } 259388db4597c7567be050b7a729f7306832f28428bbGreg Clayton 259488db4597c7567be050b7a729f7306832f28428bbGreg Clayton { 259588db4597c7567be050b7a729f7306832f28428bbGreg Clayton llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits>::const_iterator base_pos, base_end = layout_info.base_offsets.end(); 259688db4597c7567be050b7a729f7306832f28428bbGreg Clayton for (idx = 0, base_pos = layout_info.base_offsets.begin(); base_pos != base_end; ++base_pos, ++idx) 259788db4597c7567be050b7a729f7306832f28428bbGreg Clayton { 2598952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 259988db4597c7567be050b7a729f7306832f28428bbGreg Clayton "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) base[%u] = { byte_offset=%u, name='%s' }", 260052f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.GetOpaqueQualType(), 260188db4597c7567be050b7a729f7306832f28428bbGreg Clayton idx, 260288db4597c7567be050b7a729f7306832f28428bbGreg Clayton (uint32_t)base_pos->second.getQuantity(), 260388db4597c7567be050b7a729f7306832f28428bbGreg Clayton base_pos->first->getNameAsString().c_str()); 260488db4597c7567be050b7a729f7306832f28428bbGreg Clayton } 260588db4597c7567be050b7a729f7306832f28428bbGreg Clayton } 260688db4597c7567be050b7a729f7306832f28428bbGreg Clayton { 260788db4597c7567be050b7a729f7306832f28428bbGreg Clayton llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits>::const_iterator vbase_pos, vbase_end = layout_info.vbase_offsets.end(); 260888db4597c7567be050b7a729f7306832f28428bbGreg Clayton for (idx = 0, vbase_pos = layout_info.vbase_offsets.begin(); vbase_pos != vbase_end; ++vbase_pos, ++idx) 260988db4597c7567be050b7a729f7306832f28428bbGreg Clayton { 2610952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 261188db4597c7567be050b7a729f7306832f28428bbGreg Clayton "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) vbase[%u] = { byte_offset=%u, name='%s' }", 261252f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.GetOpaqueQualType(), 261388db4597c7567be050b7a729f7306832f28428bbGreg Clayton idx, 261488db4597c7567be050b7a729f7306832f28428bbGreg Clayton (uint32_t)vbase_pos->second.getQuantity(), 261588db4597c7567be050b7a729f7306832f28428bbGreg Clayton vbase_pos->first->getNameAsString().c_str()); 261688db4597c7567be050b7a729f7306832f28428bbGreg Clayton } 261788db4597c7567be050b7a729f7306832f28428bbGreg Clayton } 2618a792abe6350b7e3241bfc7121eba74dbea5eca55Greg Clayton } 26193fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton m_record_decl_to_layout_map.insert(std::make_pair(record_decl, layout_info)); 26203fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton } 2621462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 2622b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton } 2623493050c2b497ce9a7c71db8d4ee451a8f4dcb597Sean Callanan 2624b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton return clang_type; 2625462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 2626462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton case DW_TAG_enumeration_type: 262752f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.StartTagDeclarationDefinition (); 2628462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (die->HasChildren()) 2629462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 26300be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton SymbolContext sc(GetCompUnitForDWARFCompUnit(dwarf_cu)); 2631d5e48bd4029b47cd298fd065429bb3a350a08324Greg Clayton bool is_signed = false; 263252f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.IsIntegerType(is_signed); 2633d5e48bd4029b47cd298fd065429bb3a350a08324Greg Clayton ParseChildEnumerators(sc, clang_type, is_signed, type->GetByteSize(), dwarf_cu, die); 2634462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 263552f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.CompleteTagDeclarationDefinition (); 2636462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return clang_type; 2637462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 2638462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton default: 2639462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton assert(false && "not a forward clang type decl!"); 2640462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton break; 2641462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 26420b864ee64c72ea578f7351a9d6284ed5d712b9f0Ashok Thirumurthi return false; 2643462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton} 2644462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 264574124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg ClaytonType* 26460be1edd34ff46e017b1b973c5a57e3de9f613bafGreg ClaytonSymbolFileDWARF::ResolveType (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* type_die, bool assert_not_being_parsed) 264774124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton{ 264874124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton if (type_die != NULL) 264974124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton { 26504fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton Type *type = m_die_to_type.lookup (type_die); 2651d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton 265274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton if (type == NULL) 26530be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton type = GetTypeForDIE (dwarf_cu, type_die).get(); 2654d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton 2655fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton if (assert_not_being_parsed) 26561c6b461051a996cac19489d6123868ada0589558Jim Ingham { 26571c6b461051a996cac19489d6123868ada0589558Jim Ingham if (type != DIE_IS_BEING_PARSED) 26581c6b461051a996cac19489d6123868ada0589558Jim Ingham return type; 26591c6b461051a996cac19489d6123868ada0589558Jim Ingham 26601c6b461051a996cac19489d6123868ada0589558Jim Ingham GetObjectFile()->GetModule()->ReportError ("Parsing a die that is being parsed die: 0x%8.8x: %s %s", 26610be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton type_die->GetOffset(), 26620be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton DW_TAG_value_to_name(type_die->Tag()), 26630be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton type_die->GetName(this, dwarf_cu)); 26641c6b461051a996cac19489d6123868ada0589558Jim Ingham 26651c6b461051a996cac19489d6123868ada0589558Jim Ingham } 26661c6b461051a996cac19489d6123868ada0589558Jim Ingham else 26671c6b461051a996cac19489d6123868ada0589558Jim Ingham return type; 266874124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton } 266974124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton return NULL; 267074124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton} 267174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton 267224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompileUnit* 26730be1edd34ff46e017b1b973c5a57e3de9f613bafGreg ClaytonSymbolFileDWARF::GetCompUnitForDWARFCompUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx) 267424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 267524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if the symbol vendor already knows about this compile unit? 26760be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton if (dwarf_cu->GetUserData() == NULL) 267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The symbol vendor doesn't know about this compile unit, we 267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // need to parse and add it to the symbol vendor object. 26800be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton return ParseCompileUnit(dwarf_cu, cu_idx).get(); 268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26820be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton return (CompileUnit*)dwarf_cu->GetUserData(); 268324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 268424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 26860be1edd34ff46e017b1b973c5a57e3de9f613bafGreg ClaytonSymbolFileDWARF::GetFunction (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* func_die, SymbolContext& sc) 268724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2688a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton sc.Clear(false); 268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if the symbol vendor already knows about this compile unit? 26900be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX); 269124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2692444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton sc.function = sc.comp_unit->FindFunctionByUID (MakeUserID(func_die->GetOffset())).get(); 269324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.function == NULL) 26940be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton sc.function = ParseCompileUnitFunction(sc, dwarf_cu, func_die); 26958b7b2276132c7353cabd22000287b42badc26613Jim Ingham 26968b7b2276132c7353cabd22000287b42badc26613Jim Ingham if (sc.function) 26978b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 26983508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton sc.module_sp = sc.function->CalculateSymbolContextModule(); 26998b7b2276132c7353cabd22000287b42badc26613Jim Ingham return true; 27008b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 27018b7b2276132c7353cabd22000287b42badc26613Jim Ingham 27028b7b2276132c7353cabd22000287b42badc26613Jim Ingham return false; 270324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 270424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 270524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 270624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::ResolveSymbolContext (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) 270724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 270824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 27095f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea "SymbolFileDWARF::ResolveSymbolContext (so_addr = { section = %p, offset = 0x%" PRIx64 " }, resolve_scope = 0x%8.8x)", 27103508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton so_addr.GetSection().get(), 271124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner so_addr.GetOffset(), 271224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope); 271324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t resolved = 0; 271424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (resolve_scope & ( eSymbolContextCompUnit | 271524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eSymbolContextFunction | 271624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eSymbolContextBlock | 271724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eSymbolContextLineEntry)) 271824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 271924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t file_vm_addr = so_addr.GetFileAddress(); 272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfo* debug_info = DebugInfo(); 2722144188bc458a35997d2f2e52206ab69747439073Greg Clayton if (debug_info) 272324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 272482b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton const dw_offset_t cu_offset = debug_info->GetCompileUnitAranges().FindAddress(file_vm_addr); 272524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cu_offset != DW_INVALID_OFFSET) 272624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 272782b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton uint32_t cu_idx = DW_INVALID_INDEX; 27280be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnit(cu_offset, &cu_idx).get(); 27290be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton if (dwarf_cu) 273024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27310be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx); 273282b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (sc.comp_unit) 273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 273482b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton resolved |= eSymbolContextCompUnit; 273582b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton 2736be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton bool force_check_line_table = false; 273782b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (resolve_scope & (eSymbolContextFunction | eSymbolContextBlock)) 273824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 273982b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton DWARFDebugInfoEntry *function_die = NULL; 274082b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton DWARFDebugInfoEntry *block_die = NULL; 274182b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (resolve_scope & eSymbolContextBlock) 274282b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton { 274382b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton dwarf_cu->LookupAddress(file_vm_addr, &function_die, &block_die); 274482b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton } 274582b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton else 274682b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton { 274782b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton dwarf_cu->LookupAddress(file_vm_addr, &function_die, NULL); 274882b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton } 274924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 275082b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (function_die != NULL) 275182b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton { 275282b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton sc.function = sc.comp_unit->FindFunctionByUID (MakeUserID(function_die->GetOffset())).get(); 275382b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (sc.function == NULL) 275482b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton sc.function = ParseCompileUnitFunction(sc, dwarf_cu, function_die); 275582b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton } 275682b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton else 275782b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton { 275882b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton // We might have had a compile unit that had discontiguous 275982b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton // address ranges where the gaps are symbols that don't have 276082b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton // any debug info. Discontiguous compile unit address ranges 276182b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton // should only happen when there aren't other functions from 276282b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton // other compile units in these gaps. This helps keep the size 276382b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton // of the aranges down. 2764be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton force_check_line_table = true; 276582b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton } 276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 276782b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (sc.function != NULL) 276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 276982b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton resolved |= eSymbolContextFunction; 277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 277182b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (resolve_scope & eSymbolContextBlock) 277282b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton { 277382b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton Block& block = sc.function->GetBlock (true); 277482b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton 277582b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (block_die != NULL) 277682b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton sc.block = block.FindBlockByID (MakeUserID(block_die->GetOffset())); 277782b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton else 277882b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton sc.block = block.FindBlockByID (MakeUserID(function_die->GetOffset())); 277982b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (sc.block) 278082b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton resolved |= eSymbolContextBlock; 278182b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton } 278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2784be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton 2785be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton if ((resolve_scope & eSymbolContextLineEntry) || force_check_line_table) 2786be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton { 2787be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton LineTable *line_table = sc.comp_unit->GetLineTable(); 2788be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton if (line_table != NULL) 2789be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton { 2790464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // And address that makes it into this function should be in terms 2791464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // of this debug file if there is no debug map, or it will be an 2792464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // address in the .o file which needs to be fixed up to be in terms 2793464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // of the debug map executable. Either way, calling FixupAddress() 2794464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // will work for us. 2795464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton Address exe_so_addr (so_addr); 2796464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (FixupAddress(exe_so_addr)) 2797be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton { 2798464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (line_table->FindLineEntryByAddress (exe_so_addr, sc.line_entry)) 2799be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton { 2800be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton resolved |= eSymbolContextLineEntry; 2801be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton } 2802be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton } 2803be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton } 2804be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton } 2805be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton 2806be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton if (force_check_line_table && !(resolved & eSymbolContextLineEntry)) 2807be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton { 2808be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton // We might have had a compile unit that had discontiguous 2809be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton // address ranges where the gaps are symbols that don't have 2810be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton // any debug info. Discontiguous compile unit address ranges 2811be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton // should only happen when there aren't other functions from 2812be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton // other compile units in these gaps. This helps keep the size 2813be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton // of the aranges down. 2814be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton sc.comp_unit = NULL; 2815be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton resolved &= ~eSymbolContextCompUnit; 2816be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton } 281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 281882b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton else 281982b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton { 282082b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton GetObjectFile()->GetModule()->ReportWarning ("0x%8.8x: compile unit %u failed to create a valid lldb_private::CompileUnit class.", 282182b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton cu_offset, 282282b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton cu_idx); 282382b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton } 282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return resolved; 282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::ResolveSymbolContext(const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t prev_size = sc_list.GetSize(); 283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (resolve_scope & eSymbolContextCompUnit) 283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfo* debug_info = DebugInfo(); 284024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (debug_info) 284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t cu_idx; 28430be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton DWARFCompileUnit* dwarf_cu = NULL; 284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28450be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton for (cu_idx = 0; (dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx)) != NULL; ++cu_idx) 284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28470be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton CompileUnit *dc_cu = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx); 284849ce8969d3154e1560106cfe530444c09410f217Greg Clayton const bool full_match = file_spec.GetDirectory(); 284949ce8969d3154e1560106cfe530444c09410f217Greg Clayton bool file_spec_matches_cu_file_spec = dc_cu != NULL && FileSpec::Equal(file_spec, *dc_cu, full_match); 285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (check_inlines || file_spec_matches_cu_file_spec) 285124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc (m_obj_file->GetModule()); 28530be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx); 285482b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (sc.comp_unit) 285524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 285682b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton uint32_t file_idx = UINT32_MAX; 285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 285882b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton // If we are looking for inline functions only and we don't 285982b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton // find it in the support files, we are done. 286082b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (check_inlines) 286182b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton { 286282b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton file_idx = sc.comp_unit->GetSupportFiles().FindFileIndex (1, file_spec, true); 286382b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (file_idx == UINT32_MAX) 286482b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton continue; 286582b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton } 286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286782b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (line != 0) 286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 286982b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton LineTable *line_table = sc.comp_unit->GetLineTable(); 287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 287182b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (line_table != NULL && line != 0) 287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 287382b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton // We will have already looked up the file index if 287482b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton // we are searching for inline entries. 287582b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (!check_inlines) 287682b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton file_idx = sc.comp_unit->GetSupportFiles().FindFileIndex (1, file_spec, true); 287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 287882b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (file_idx != UINT32_MAX) 287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 288082b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton uint32_t found_line; 288182b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton uint32_t line_idx = line_table->FindLineEntryIndexByFileIndex (0, file_idx, line, false, &sc.line_entry); 288282b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton found_line = sc.line_entry.line; 288382b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton 288482b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton while (line_idx != UINT32_MAX) 288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 288682b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton sc.function = NULL; 288782b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton sc.block = NULL; 288882b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (resolve_scope & (eSymbolContextFunction | eSymbolContextBlock)) 288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 289082b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton const lldb::addr_t file_vm_addr = sc.line_entry.range.GetBaseAddress().GetFileAddress(); 289182b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (file_vm_addr != LLDB_INVALID_ADDRESS) 289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 289382b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton DWARFDebugInfoEntry *function_die = NULL; 289482b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton DWARFDebugInfoEntry *block_die = NULL; 289582b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton dwarf_cu->LookupAddress(file_vm_addr, &function_die, resolve_scope & eSymbolContextBlock ? &block_die : NULL); 289682b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton 289782b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (function_die != NULL) 289882b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton { 289982b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton sc.function = sc.comp_unit->FindFunctionByUID (MakeUserID(function_die->GetOffset())).get(); 290082b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (sc.function == NULL) 290182b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton sc.function = ParseCompileUnitFunction(sc, dwarf_cu, function_die); 290282b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton } 290382b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton 290482b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (sc.function != NULL) 290582b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton { 290682b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton Block& block = sc.function->GetBlock (true); 290782b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton 290882b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (block_die != NULL) 290982b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton sc.block = block.FindBlockByID (MakeUserID(block_die->GetOffset())); 291082b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton else 291182b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton sc.block = block.FindBlockByID (MakeUserID(function_die->GetOffset())); 291282b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton } 291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 291424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 291682b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton sc_list.Append(sc); 291782b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton line_idx = line_table->FindLineEntryIndexByFileIndex (line_idx + 1, file_idx, found_line, true, &sc.line_entry); 291882b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton } 291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 292182b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton else if (file_spec_matches_cu_file_spec && !check_inlines) 292282b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton { 292382b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton // only append the context if we aren't looking for inline call sites 292482b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton // by file and line and if the file spec matches that of the compile unit 292582b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton sc_list.Append(sc); 292682b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton } 292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (file_spec_matches_cu_file_spec && !check_inlines) 292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // only append the context if we aren't looking for inline call sites 293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // by file and line and if the file spec matches that of the compile unit 293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc_list.Append(sc); 293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293582b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton if (!check_inlines) 293682b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton break; 293782b147fd9a5cb8e2144211192b06f4dec22150a7Greg Clayton } 293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - prev_size; 294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::Index () 294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_indexed) 294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_indexed = true; 295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "SymbolFileDWARF::Index (%s)", 295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetObjectFile()->GetFileSpec().GetFilename().AsCString()); 295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfo* debug_info = DebugInfo(); 295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (debug_info) 295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t cu_idx = 0; 295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t num_compile_units = GetNumCompileUnits(); 296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx) 296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29620be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx); 29630be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton 29640be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton bool clear_dies = dwarf_cu->ExtractDIEsIfNeeded (false) > 1; 29650be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton 29660be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton dwarf_cu->Index (cu_idx, 29670be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton m_function_basename_index, 29680be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton m_function_fullname_index, 29690be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton m_function_method_index, 29700be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton m_function_selector_index, 29710be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton m_objc_class_selectors_index, 29720be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton m_global_index, 29730be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton m_type_index, 29740be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton m_namespace_index); 297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Keep memory down by clearing DIEs if this generate function 297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // caused them to be parsed 297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clear_dies) 29790be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton dwarf_cu->ClearDIEs (true); 298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2982144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_function_basename_index.Finalize(); 2983144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_function_fullname_index.Finalize(); 2984144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_function_method_index.Finalize(); 2985144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_function_selector_index.Finalize(); 2986144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_objc_class_selectors_index.Finalize(); 2987144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_global_index.Finalize(); 2988144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_type_index.Finalize(); 2989144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_namespace_index.Finalize(); 299074124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton 2991fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton#if defined (ENABLE_DEBUG_PRINTF) 29927bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton StreamFile s(stdout, false); 299397a19b21dacd9063bb5475812df7781777262198Greg Clayton s.Printf ("DWARF index for '%s':", 299497a19b21dacd9063bb5475812df7781777262198Greg Clayton GetObjectFile()->GetFileSpec().GetPath().c_str()); 2995e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton s.Printf("\nFunction basenames:\n"); m_function_basename_index.Dump (&s); 2996e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton s.Printf("\nFunction fullnames:\n"); m_function_fullname_index.Dump (&s); 2997e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton s.Printf("\nFunction methods:\n"); m_function_method_index.Dump (&s); 2998e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton s.Printf("\nFunction selectors:\n"); m_function_selector_index.Dump (&s); 2999e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton s.Printf("\nObjective C class selectors:\n"); m_objc_class_selectors_index.Dump (&s); 3000e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton s.Printf("\nGlobals and statics:\n"); m_global_index.Dump (&s); 3001fcf06fb0b608f09477d7984938255ebf8f92d0daGreg Clayton s.Printf("\nTypes:\n"); m_type_index.Dump (&s); 3002e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton s.Printf("\nNamepaces:\n"); m_namespace_index.Dump (&s); 300374124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton#endif 300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3006db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton 3007db29bba117a0ea75b89c1280722225a3197b4313Greg Claytonbool 3008db29bba117a0ea75b89c1280722225a3197b4313Greg ClaytonSymbolFileDWARF::NamespaceDeclMatchesThisSymbolFile (const ClangNamespaceDecl *namespace_decl) 3009db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton{ 3010db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton if (namespace_decl == NULL) 3011db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton { 3012db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton // Invalid namespace decl which means we aren't matching only things 3013db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton // in this symbol file, so return true to indicate it matches this 3014db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton // symbol file. 3015db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton return true; 3016db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton } 3017db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton 3018db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton clang::ASTContext *namespace_ast = namespace_decl->GetASTContext(); 3019db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton 3020db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton if (namespace_ast == NULL) 3021db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton return true; // No AST in the "namespace_decl", return true since it 3022db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton // could then match any symbol file, including this one 3023db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton 3024db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton if (namespace_ast == GetClangASTContext().getASTContext()) 3025db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton return true; // The ASTs match, return true 3026db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton 3027db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton // The namespace AST was valid, and it does not match... 3028952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS)); 3029a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 3030a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan if (log) 3031952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage(log, "Valid namespace does not match symbol file"); 3032a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 3033db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton return false; 3034db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton} 3035db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton 303682770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Claytonbool 303782770e0df481f30c46fb7e905e99b45c1e6d31c8Greg ClaytonSymbolFileDWARF::DIEIsInNamespace (const ClangNamespaceDecl *namespace_decl, 303882770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton DWARFCompileUnit* cu, 303982770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton const DWARFDebugInfoEntry* die) 304082770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton{ 304182770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton // No namespace specified, so the answesr i 304282770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton if (namespace_decl == NULL) 304382770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton return true; 3044c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan 3045952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS)); 3046db29bba117a0ea75b89c1280722225a3197b4313Greg Clayton 30477c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton const DWARFDebugInfoEntry *decl_ctx_die = NULL; 30487c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton clang::DeclContext *die_clang_decl_ctx = GetClangDeclContextContainingDIE (cu, die, &decl_ctx_die); 304982770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton if (decl_ctx_die) 30507c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton { 305182770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton clang::NamespaceDecl *clang_namespace_decl = namespace_decl->GetNamespaceDecl(); 30527c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton 305382770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton if (clang_namespace_decl) 305482770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton { 305582770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton if (decl_ctx_die->Tag() != DW_TAG_namespace) 3056c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan { 3057c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan if (log) 3058952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage(log, "Found a match, but its parent is not a namespace"); 305982770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton return false; 3060c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan } 3061c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan 30627c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton if (clang_namespace_decl == die_clang_decl_ctx) 30637c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton return true; 30647c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton else 306582770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton return false; 306682770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton } 306782770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton else 306882770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton { 306982770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton // We have a namespace_decl that was not NULL but it contained 307082770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton // a NULL "clang::NamespaceDecl", so this means the global namespace 307182770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton // So as long the the contained decl context DIE isn't a namespace 307282770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton // we should be ok. 307382770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton if (decl_ctx_die->Tag() != DW_TAG_namespace) 307482770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton return true; 307582770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton } 307682770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton } 3077c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan 3078c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan if (log) 3079952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage(log, "Found a match, but its parent doesn't exist"); 3080c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan 308182770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton return false; 308282770e0df481f30c46fb7e905e99b45c1e6d31c8Greg Clayton} 308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 30840fcec13c6639ab49216fa9447b25888b7bc9ff59Sean CallananSymbolFileDWARF::FindGlobalVariables (const ConstString &name, const lldb_private::ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables) 308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3086952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS)); 3087c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton 3088c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton if (log) 3089c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton { 3090952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 3091df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton "SymbolFileDWARF::FindGlobalVariables (name=\"%s\", namespace_decl=%p, append=%u, max_matches=%u, variables)", 3092df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton name.GetCString(), 3093df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton namespace_decl, 3094df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton append, 3095df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton max_matches); 3096c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton } 30970fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan 30980fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan if (!NamespaceDeclMatchesThisSymbolFile(namespace_decl)) 30990fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return 0; 31000fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan 310174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton DWARFDebugInfo* info = DebugInfo(); 310274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton if (info == NULL) 310374124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton return 0; 310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we aren't appending the results to this list, then clear the list 310624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!append) 310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner variables.Clear(); 310824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 310924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Remember how many variables are in the list before we search in case 311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we are appending the results to a variable list. 311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t original_size = variables.GetSize(); 311224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 311300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton DIEArray die_offsets; 311400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 3115bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_using_apple_tables) 311600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 3117bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_apple_names_ap.get()) 3118bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton { 3119bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton const char *name_cstr = name.GetCString(); 3120bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton const char *base_name_start; 3121bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton const char *base_name_end = NULL; 31228b7b2276132c7353cabd22000287b42badc26613Jim Ingham 3123bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (!CPPLanguageRuntime::StripNamespacesFromVariableName(name_cstr, base_name_start, base_name_end)) 3124bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton base_name_start = name_cstr; 3125bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton 3126bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton m_apple_names_ap->FindByName (base_name_start, die_offsets); 3127bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton } 312800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 312900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton else 313000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 313100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton // Index the DWARF if we haven't already 313200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (!m_indexed) 313300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton Index (); 313424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 313500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton m_global_index.Find (name, die_offsets); 313600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 313724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31387c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton const size_t num_die_matches = die_offsets.size(); 31397c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton if (num_die_matches) 314024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 314100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton SymbolContext sc; 31423508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton sc.module_sp = m_obj_file->GetModule(); 314300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton assert (sc.module_sp); 314400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 3145144188bc458a35997d2f2e52206ab69747439073Greg Clayton DWARFDebugInfo* debug_info = DebugInfo(); 314600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton DWARFCompileUnit* dwarf_cu = NULL; 314700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const DWARFDebugInfoEntry* die = NULL; 31487c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton bool done = false; 31497c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton for (size_t i=0; i<num_die_matches && !done; ++i) 3150144188bc458a35997d2f2e52206ab69747439073Greg Clayton { 3151144188bc458a35997d2f2e52206ab69747439073Greg Clayton const dw_offset_t die_offset = die_offsets[i]; 3152144188bc458a35997d2f2e52206ab69747439073Greg Clayton die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); 315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3154bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (die) 3155bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 31567c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton switch (die->Tag()) 31577c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton { 31587c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton default: 31597c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton case DW_TAG_subprogram: 31607c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton case DW_TAG_inlined_subroutine: 31617c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton case DW_TAG_try_block: 31627c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton case DW_TAG_catch_block: 31637c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton break; 31647c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton 31657c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton case DW_TAG_variable: 31667c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton { 31677c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX); 31687c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton 31697c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton if (namespace_decl && !DIEIsInNamespace (namespace_decl, dwarf_cu, die)) 31707c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton continue; 317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31727c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton ParseVariables(sc, dwarf_cu, LLDB_INVALID_ADDRESS, die, false, false, &variables); 317374124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton 31747c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton if (variables.GetSize() - original_size >= max_matches) 31757c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton done = true; 31767c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton } 31777c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton break; 31787c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton } 3179bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 3180bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton else 3181bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 3182bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (m_using_apple_tables) 3183bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 3184df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')\n", 3185df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton die_offset, name.GetCString()); 3186bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 3187bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 3188144188bc458a35997d2f2e52206ab69747439073Greg Clayton } 318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 319024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Return the number of variable that were appended to the list 31927c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton const uint32_t num_matches = variables.GetSize() - original_size; 31937c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton if (log && num_matches > 0) 31947c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton { 3195952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 31967c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton "SymbolFileDWARF::FindGlobalVariables (name=\"%s\", namespace_decl=%p, append=%u, max_matches=%u, variables) => %u", 31977c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton name.GetCString(), 31987c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton namespace_decl, 31997c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton append, 32007c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton max_matches, 32017c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton num_matches); 32027c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton } 32037c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton return num_matches; 320424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 320524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 320624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 320724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 320824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3209952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS)); 3210c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton 3211c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton if (log) 3212c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton { 3213952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 3214df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton "SymbolFileDWARF::FindGlobalVariables (regex=\"%s\", append=%u, max_matches=%u, variables)", 3215df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton regex.GetText(), 3216df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton append, 3217df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton max_matches); 3218c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton } 3219c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton 322074124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton DWARFDebugInfo* info = DebugInfo(); 322174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton if (info == NULL) 322274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton return 0; 322324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 322424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we aren't appending the results to this list, then clear the list 322524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!append) 322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner variables.Clear(); 322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 322824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Remember how many variables are in the list before we search in case 322924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we are appending the results to a variable list. 323024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t original_size = variables.GetSize(); 323124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 323200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton DIEArray die_offsets; 323300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 3234bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_using_apple_tables) 323500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 3236bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_apple_names_ap.get()) 323737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton { 323837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton DWARFMappedHash::DIEInfoArray hash_data_array; 323937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton if (m_apple_names_ap->AppendAllDIEsThatMatchingRegex (regex, hash_data_array)) 324037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton DWARFMappedHash::ExtractDIEArray (hash_data_array, die_offsets); 324137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton } 324200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 324300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton else 324400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 324500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton // Index the DWARF if we haven't already 324600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (!m_indexed) 324700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton Index (); 324800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 324900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton m_global_index.Find (regex, die_offsets); 325000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 325124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 325274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton SymbolContext sc; 32533508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton sc.module_sp = m_obj_file->GetModule(); 325474124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton assert (sc.module_sp); 325574124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton 3256144188bc458a35997d2f2e52206ab69747439073Greg Clayton DWARFCompileUnit* dwarf_cu = NULL; 325774124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton const DWARFDebugInfoEntry* die = NULL; 325800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const size_t num_matches = die_offsets.size(); 3259144188bc458a35997d2f2e52206ab69747439073Greg Clayton if (num_matches) 326024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3261144188bc458a35997d2f2e52206ab69747439073Greg Clayton DWARFDebugInfo* debug_info = DebugInfo(); 3262144188bc458a35997d2f2e52206ab69747439073Greg Clayton for (size_t i=0; i<num_matches; ++i) 3263144188bc458a35997d2f2e52206ab69747439073Greg Clayton { 3264144188bc458a35997d2f2e52206ab69747439073Greg Clayton const dw_offset_t die_offset = die_offsets[i]; 3265144188bc458a35997d2f2e52206ab69747439073Greg Clayton die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); 3266bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton 3267bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (die) 3268bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 3269bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX); 327024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3271bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton ParseVariables(sc, dwarf_cu, LLDB_INVALID_ADDRESS, die, false, false, &variables); 327224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3273bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (variables.GetSize() - original_size >= max_matches) 3274bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton break; 3275bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 3276bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton else 3277bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 3278bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (m_using_apple_tables) 3279bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 3280df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for regex '%s')\n", 3281df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton die_offset, regex.GetText()); 3282bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 3283bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 3284144188bc458a35997d2f2e52206ab69747439073Greg Clayton } 328524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 328624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Return the number of variable that were appended to the list 328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return variables.GetSize() - original_size; 328924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32917a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton 32928b7b2276132c7353cabd22000287b42badc26613Jim Inghambool 32938b7b2276132c7353cabd22000287b42badc26613Jim InghamSymbolFileDWARF::ResolveFunction (dw_offset_t die_offset, 32948b7b2276132c7353cabd22000287b42badc26613Jim Ingham DWARFCompileUnit *&dwarf_cu, 32958b7b2276132c7353cabd22000287b42badc26613Jim Ingham SymbolContextList& sc_list) 3296d74270e83908066c946d150faec9516349e1118bGreg Clayton{ 32977a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton const DWARFDebugInfoEntry *die = DebugInfo()->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); 32987a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton return ResolveFunction (dwarf_cu, die, sc_list); 32997a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton} 3300d74270e83908066c946d150faec9516349e1118bGreg Clayton 33017a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton 33027a1e5da2bcea7ec37dff72591892015da1f9e125Greg Claytonbool 33037a1e5da2bcea7ec37dff72591892015da1f9e125Greg ClaytonSymbolFileDWARF::ResolveFunction (DWARFCompileUnit *cu, 33047a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton const DWARFDebugInfoEntry *die, 33057a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton SymbolContextList& sc_list) 33067a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton{ 33077a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton SymbolContext sc; 33087a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton 33097a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton if (die == NULL) 33107a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton return false; 33117a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton 33128b7b2276132c7353cabd22000287b42badc26613Jim Ingham // If we were passed a die that is not a function, just return false... 33138b7b2276132c7353cabd22000287b42badc26613Jim Ingham if (die->Tag() != DW_TAG_subprogram && die->Tag() != DW_TAG_inlined_subroutine) 33148b7b2276132c7353cabd22000287b42badc26613Jim Ingham return false; 3315d74270e83908066c946d150faec9516349e1118bGreg Clayton 33168b7b2276132c7353cabd22000287b42badc26613Jim Ingham const DWARFDebugInfoEntry* inlined_die = NULL; 33178b7b2276132c7353cabd22000287b42badc26613Jim Ingham if (die->Tag() == DW_TAG_inlined_subroutine) 3318d74270e83908066c946d150faec9516349e1118bGreg Clayton { 33198b7b2276132c7353cabd22000287b42badc26613Jim Ingham inlined_die = die; 3320d74270e83908066c946d150faec9516349e1118bGreg Clayton 33218b7b2276132c7353cabd22000287b42badc26613Jim Ingham while ((die = die->GetParent()) != NULL) 33226c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton { 33238b7b2276132c7353cabd22000287b42badc26613Jim Ingham if (die->Tag() == DW_TAG_subprogram) 33248b7b2276132c7353cabd22000287b42badc26613Jim Ingham break; 33256c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton } 33268b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 33278b7b2276132c7353cabd22000287b42badc26613Jim Ingham assert (die->Tag() == DW_TAG_subprogram); 33287a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton if (GetFunction (cu, die, sc)) 33298b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 33308b7b2276132c7353cabd22000287b42badc26613Jim Ingham Address addr; 33318b7b2276132c7353cabd22000287b42badc26613Jim Ingham // Parse all blocks if needed 33328b7b2276132c7353cabd22000287b42badc26613Jim Ingham if (inlined_die) 3333d74270e83908066c946d150faec9516349e1118bGreg Clayton { 3334444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton sc.block = sc.function->GetBlock (true).FindBlockByID (MakeUserID(inlined_die->GetOffset())); 33358b7b2276132c7353cabd22000287b42badc26613Jim Ingham assert (sc.block != NULL); 33368b7b2276132c7353cabd22000287b42badc26613Jim Ingham if (sc.block->GetStartAddress (addr) == false) 33378b7b2276132c7353cabd22000287b42badc26613Jim Ingham addr.Clear(); 33388b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 33398b7b2276132c7353cabd22000287b42badc26613Jim Ingham else 33408b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 33418b7b2276132c7353cabd22000287b42badc26613Jim Ingham sc.block = NULL; 33428b7b2276132c7353cabd22000287b42badc26613Jim Ingham addr = sc.function->GetAddressRange().GetBaseAddress(); 3343d74270e83908066c946d150faec9516349e1118bGreg Clayton } 33448b7b2276132c7353cabd22000287b42badc26613Jim Ingham 33458b7b2276132c7353cabd22000287b42badc26613Jim Ingham if (addr.IsValid()) 334624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33478b7b2276132c7353cabd22000287b42badc26613Jim Ingham sc_list.Append(sc); 33487a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton return true; 334924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33518b7b2276132c7353cabd22000287b42badc26613Jim Ingham 33527a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton return false; 335374124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton} 335474124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton 335574124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Claytonvoid 335600db215522a0cf31082d26d7ab30d2aa30965acfGreg ClaytonSymbolFileDWARF::FindFunctions (const ConstString &name, 335700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const NameToDIE &name_to_die, 335800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton SymbolContextList& sc_list) 335974124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton{ 336000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton DIEArray die_offsets; 336100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (name_to_die.Find (name, die_offsets)) 336200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 336300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton ParseFunctions (die_offsets, sc_list); 336400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 336500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton} 336624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 336700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 336800db215522a0cf31082d26d7ab30d2aa30965acfGreg Claytonvoid 336900db215522a0cf31082d26d7ab30d2aa30965acfGreg ClaytonSymbolFileDWARF::FindFunctions (const RegularExpression ®ex, 337000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const NameToDIE &name_to_die, 337100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton SymbolContextList& sc_list) 337200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton{ 3373144188bc458a35997d2f2e52206ab69747439073Greg Clayton DIEArray die_offsets; 337400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (name_to_die.Find (regex, die_offsets)) 337500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 337600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton ParseFunctions (die_offsets, sc_list); 337700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 337800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton} 337900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 338000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 338100db215522a0cf31082d26d7ab30d2aa30965acfGreg Claytonvoid 338200db215522a0cf31082d26d7ab30d2aa30965acfGreg ClaytonSymbolFileDWARF::FindFunctions (const RegularExpression ®ex, 338300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const DWARFMappedHash::MemoryTable &memory_table, 338400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton SymbolContextList& sc_list) 338500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton{ 338600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton DIEArray die_offsets; 338737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton DWARFMappedHash::DIEInfoArray hash_data_array; 338837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton if (memory_table.AppendAllDIEsThatMatchingRegex (regex, hash_data_array)) 338900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 339037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton DWARFMappedHash::ExtractDIEArray (hash_data_array, die_offsets); 339100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton ParseFunctions (die_offsets, sc_list); 339200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 339300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton} 339400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 339500db215522a0cf31082d26d7ab30d2aa30965acfGreg Claytonvoid 339600db215522a0cf31082d26d7ab30d2aa30965acfGreg ClaytonSymbolFileDWARF::ParseFunctions (const DIEArray &die_offsets, 339700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton SymbolContextList& sc_list) 339800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton{ 339900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const size_t num_matches = die_offsets.size(); 3400144188bc458a35997d2f2e52206ab69747439073Greg Clayton if (num_matches) 340174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton { 340200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton SymbolContext sc; 340300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 340400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton DWARFCompileUnit* dwarf_cu = NULL; 3405144188bc458a35997d2f2e52206ab69747439073Greg Clayton for (size_t i=0; i<num_matches; ++i) 340674124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton { 3407144188bc458a35997d2f2e52206ab69747439073Greg Clayton const dw_offset_t die_offset = die_offsets[i]; 34088b7b2276132c7353cabd22000287b42badc26613Jim Ingham ResolveFunction (die_offset, dwarf_cu, sc_list); 34098b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 34108b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 34118b7b2276132c7353cabd22000287b42badc26613Jim Ingham} 34128b7b2276132c7353cabd22000287b42badc26613Jim Ingham 34138b7b2276132c7353cabd22000287b42badc26613Jim Inghambool 34148b7b2276132c7353cabd22000287b42badc26613Jim InghamSymbolFileDWARF::FunctionDieMatchesPartialName (const DWARFDebugInfoEntry* die, 34158b7b2276132c7353cabd22000287b42badc26613Jim Ingham const DWARFCompileUnit *dwarf_cu, 34168b7b2276132c7353cabd22000287b42badc26613Jim Ingham uint32_t name_type_mask, 34178b7b2276132c7353cabd22000287b42badc26613Jim Ingham const char *partial_name, 34188b7b2276132c7353cabd22000287b42badc26613Jim Ingham const char *base_name_start, 34198b7b2276132c7353cabd22000287b42badc26613Jim Ingham const char *base_name_end) 34208b7b2276132c7353cabd22000287b42badc26613Jim Ingham{ 3421b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton // If we are looking only for methods, throw away all the ones that are or aren't in C++ classes: 3422b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton if (name_type_mask == eFunctionNameTypeMethod || name_type_mask == eFunctionNameTypeBase) 34238b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 3424f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIEOffset(die->GetOffset()); 3425f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton if (!containing_decl_ctx) 3426f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton return false; 3427f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton 3428f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton bool is_cxx_method = DeclKindIsCXXClass(containing_decl_ctx->getDeclKind()); 3429f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton 3430b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton if (name_type_mask == eFunctionNameTypeMethod) 3431b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton { 3432b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton if (is_cxx_method == false) 3433b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton return false; 3434b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton } 3435b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton 3436b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton if (name_type_mask == eFunctionNameTypeBase) 3437b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton { 3438b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton if (is_cxx_method == true) 3439b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton return false; 3440b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton } 34418b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 34428b7b2276132c7353cabd22000287b42badc26613Jim Ingham 34438b7b2276132c7353cabd22000287b42badc26613Jim Ingham // Now we need to check whether the name we got back for this type matches the extra specifications 34448b7b2276132c7353cabd22000287b42badc26613Jim Ingham // that were in the name we're looking up: 34458b7b2276132c7353cabd22000287b42badc26613Jim Ingham if (base_name_start != partial_name || *base_name_end != '\0') 34468b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 34478b7b2276132c7353cabd22000287b42badc26613Jim Ingham // First see if the stuff to the left matches the full name. To do that let's see if 34488b7b2276132c7353cabd22000287b42badc26613Jim Ingham // we can pull out the mips linkage name attribute: 34498b7b2276132c7353cabd22000287b42badc26613Jim Ingham 34508b7b2276132c7353cabd22000287b42badc26613Jim Ingham Mangled best_name; 34518b7b2276132c7353cabd22000287b42badc26613Jim Ingham DWARFDebugInfoEntry::Attributes attributes; 3452b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton DWARFFormValue form_value; 34538b7b2276132c7353cabd22000287b42badc26613Jim Ingham die->GetAttributes(this, dwarf_cu, NULL, attributes); 34548b7b2276132c7353cabd22000287b42badc26613Jim Ingham uint32_t idx = attributes.FindAttributeIndex(DW_AT_MIPS_linkage_name); 34556f3a711edcfaeca1efbb998cdea5d0a0782ddfa3Greg Clayton if (idx == UINT32_MAX) 34566f3a711edcfaeca1efbb998cdea5d0a0782ddfa3Greg Clayton idx = attributes.FindAttributeIndex(DW_AT_linkage_name); 34578b7b2276132c7353cabd22000287b42badc26613Jim Ingham if (idx != UINT32_MAX) 34588b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 34598b7b2276132c7353cabd22000287b42badc26613Jim Ingham if (attributes.ExtractFormValueAtIndex(this, idx, form_value)) 34601cee7ab7da6103eed3aca0922e61dab7ab2b1505Greg Clayton { 3461b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton const char *mangled_name = form_value.AsCString(&get_debug_str_data()); 3462b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton if (mangled_name) 3463b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton best_name.SetValue (ConstString(mangled_name), true); 3464b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton } 3465b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton } 3466b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton 3467b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton if (!best_name) 3468b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton { 3469b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton idx = attributes.FindAttributeIndex(DW_AT_name); 3470b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton if (idx != UINT32_MAX && attributes.ExtractFormValueAtIndex(this, idx, form_value)) 3471b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton { 34728b7b2276132c7353cabd22000287b42badc26613Jim Ingham const char *name = form_value.AsCString(&get_debug_str_data()); 3473b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton best_name.SetValue (ConstString(name), false); 3474b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton } 34758b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 3476b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton 3477b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton if (best_name.GetDemangledName()) 34788b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 34798b7b2276132c7353cabd22000287b42badc26613Jim Ingham const char *demangled = best_name.GetDemangledName().GetCString(); 34808b7b2276132c7353cabd22000287b42badc26613Jim Ingham if (demangled) 34818b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 34828b7b2276132c7353cabd22000287b42badc26613Jim Ingham std::string name_no_parens(partial_name, base_name_end - partial_name); 3483b962cbc33382341189298150c11b2d51c86a283aJim Ingham const char *partial_in_demangled = strstr (demangled, name_no_parens.c_str()); 3484b962cbc33382341189298150c11b2d51c86a283aJim Ingham if (partial_in_demangled == NULL) 34858b7b2276132c7353cabd22000287b42badc26613Jim Ingham return false; 3486b962cbc33382341189298150c11b2d51c86a283aJim Ingham else 3487b962cbc33382341189298150c11b2d51c86a283aJim Ingham { 3488b962cbc33382341189298150c11b2d51c86a283aJim Ingham // Sort out the case where our name is something like "Process::Destroy" and the match is 3489b962cbc33382341189298150c11b2d51c86a283aJim Ingham // "SBProcess::Destroy" - that shouldn't be a match. We should really always match on 3490b962cbc33382341189298150c11b2d51c86a283aJim Ingham // namespace boundaries... 3491b962cbc33382341189298150c11b2d51c86a283aJim Ingham 3492b962cbc33382341189298150c11b2d51c86a283aJim Ingham if (partial_name[0] == ':' && partial_name[1] == ':') 3493b962cbc33382341189298150c11b2d51c86a283aJim Ingham { 3494b962cbc33382341189298150c11b2d51c86a283aJim Ingham // The partial name was already on a namespace boundary so all matches are good. 3495b962cbc33382341189298150c11b2d51c86a283aJim Ingham return true; 3496b962cbc33382341189298150c11b2d51c86a283aJim Ingham } 3497b962cbc33382341189298150c11b2d51c86a283aJim Ingham else if (partial_in_demangled == demangled) 3498b962cbc33382341189298150c11b2d51c86a283aJim Ingham { 3499b962cbc33382341189298150c11b2d51c86a283aJim Ingham // They both start the same, so this is an good match. 3500b962cbc33382341189298150c11b2d51c86a283aJim Ingham return true; 3501b962cbc33382341189298150c11b2d51c86a283aJim Ingham } 3502b962cbc33382341189298150c11b2d51c86a283aJim Ingham else 3503b962cbc33382341189298150c11b2d51c86a283aJim Ingham { 3504b962cbc33382341189298150c11b2d51c86a283aJim Ingham if (partial_in_demangled - demangled == 1) 3505b962cbc33382341189298150c11b2d51c86a283aJim Ingham { 3506b962cbc33382341189298150c11b2d51c86a283aJim Ingham // Only one character difference, can't be a namespace boundary... 3507b962cbc33382341189298150c11b2d51c86a283aJim Ingham return false; 3508b962cbc33382341189298150c11b2d51c86a283aJim Ingham } 3509b962cbc33382341189298150c11b2d51c86a283aJim Ingham else if (*(partial_in_demangled - 1) == ':' && *(partial_in_demangled - 2) == ':') 3510b962cbc33382341189298150c11b2d51c86a283aJim Ingham { 3511b962cbc33382341189298150c11b2d51c86a283aJim Ingham // We are on a namespace boundary, so this is also good. 3512b962cbc33382341189298150c11b2d51c86a283aJim Ingham return true; 3513b962cbc33382341189298150c11b2d51c86a283aJim Ingham } 3514b962cbc33382341189298150c11b2d51c86a283aJim Ingham else 3515b962cbc33382341189298150c11b2d51c86a283aJim Ingham return false; 3516b962cbc33382341189298150c11b2d51c86a283aJim Ingham } 3517b962cbc33382341189298150c11b2d51c86a283aJim Ingham } 35181cee7ab7da6103eed3aca0922e61dab7ab2b1505Greg Clayton } 351974124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton } 352074124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton } 35218b7b2276132c7353cabd22000287b42badc26613Jim Ingham 35228b7b2276132c7353cabd22000287b42badc26613Jim Ingham return true; 352312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton} 352412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton 352512bec71b323dc520f0e985a86e09c4712559e115Greg Claytonuint32_t 35266c19c8a7da08b89ee153d7091aa8641348e0482cGreg ClaytonSymbolFileDWARF::FindFunctions (const ConstString &name, 35270fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan const lldb_private::ClangNamespaceDecl *namespace_decl, 3528302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan uint32_t name_type_mask, 3529302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan bool include_inlines, 35306c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton bool append, 35316c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton SymbolContextList& sc_list) 353212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{ 353312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton Timer scoped_timer (__PRETTY_FUNCTION__, 353412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton "SymbolFileDWARF::FindFunctions (name = '%s')", 353512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton name.AsCString()); 353612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton 3537296b06d325413723f5aac5988eed977b278a7807Greg Clayton // eFunctionNameTypeAuto should be pre-resolved by a call to Module::PrepareForFunctionNameLookup() 3538296b06d325413723f5aac5988eed977b278a7807Greg Clayton assert ((name_type_mask & eFunctionNameTypeAuto) == 0); 3539296b06d325413723f5aac5988eed977b278a7807Greg Clayton 3540952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS)); 3541c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton 3542c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton if (log) 3543c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton { 3544952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 3545df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton "SymbolFileDWARF::FindFunctions (name=\"%s\", name_type_mask=0x%x, append=%u, sc_list)", 3546df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton name.GetCString(), 3547df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton name_type_mask, 3548df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton append); 3549c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton } 3550c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton 355112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton // If we aren't appending the results to this list, then clear the list 355212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton if (!append) 355312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton sc_list.Clear(); 35540fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan 35550fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan if (!NamespaceDeclMatchesThisSymbolFile(namespace_decl)) 35560fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return 0; 35578b7b2276132c7353cabd22000287b42badc26613Jim Ingham 35588b7b2276132c7353cabd22000287b42badc26613Jim Ingham // If name is empty then we won't find anything. 35598b7b2276132c7353cabd22000287b42badc26613Jim Ingham if (name.IsEmpty()) 35608b7b2276132c7353cabd22000287b42badc26613Jim Ingham return 0; 356112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton 356212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton // Remember how many sc_list are in the list before we search in case 356312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton // we are appending the results to a variable list. 3564d74270e83908066c946d150faec9516349e1118bGreg Clayton 35658b7b2276132c7353cabd22000287b42badc26613Jim Ingham const char *name_cstr = name.GetCString(); 3566296b06d325413723f5aac5988eed977b278a7807Greg Clayton 3567296b06d325413723f5aac5988eed977b278a7807Greg Clayton const uint32_t original_size = sc_list.GetSize(); 3568296b06d325413723f5aac5988eed977b278a7807Greg Clayton 35698b7b2276132c7353cabd22000287b42badc26613Jim Ingham DWARFDebugInfo* info = DebugInfo(); 35708b7b2276132c7353cabd22000287b42badc26613Jim Ingham if (info == NULL) 35718b7b2276132c7353cabd22000287b42badc26613Jim Ingham return 0; 35728b7b2276132c7353cabd22000287b42badc26613Jim Ingham 35737a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton DWARFCompileUnit *dwarf_cu = NULL; 3574296b06d325413723f5aac5988eed977b278a7807Greg Clayton std::set<const DWARFDebugInfoEntry *> resolved_dies; 3575bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_using_apple_tables) 357600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 3577bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_apple_names_ap.get()) 35788b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 3579bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton 3580bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton DIEArray die_offsets; 3581bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton 3582bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton uint32_t num_matches = 0; 3583bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton 3584296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (name_type_mask & eFunctionNameTypeFull) 35858b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 3586bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton // If they asked for the full name, match what they typed. At some point we may 3587bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton // want to canonicalize this (strip double spaces, etc. For now, we just add all the 3588bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton // dies that we find by exact match. 35898b7b2276132c7353cabd22000287b42badc26613Jim Ingham num_matches = m_apple_names_ap->FindByName (name_cstr, die_offsets); 35908b7b2276132c7353cabd22000287b42badc26613Jim Ingham for (uint32_t i = 0; i < num_matches; i++) 35918b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 3592bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton const dw_offset_t die_offset = die_offsets[i]; 3593bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton const DWARFDebugInfoEntry *die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); 35947a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton if (die) 35957a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton { 3596bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (namespace_decl && !DIEIsInNamespace (namespace_decl, dwarf_cu, die)) 3597bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton continue; 3598bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton 3599302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine) 3600302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan continue; 3601302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan 3602296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (resolved_dies.find(die) == resolved_dies.end()) 3603296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3604296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (ResolveFunction (dwarf_cu, die, sc_list)) 3605296b06d325413723f5aac5988eed977b278a7807Greg Clayton resolved_dies.insert(die); 3606296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 36077a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton } 3608bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton else 3609bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 3610df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')", 3611df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton die_offset, name_cstr); 3612bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 36138b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 36148b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 3615296b06d325413723f5aac5988eed977b278a7807Greg Clayton 3616296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (name_type_mask & eFunctionNameTypeSelector) 3617296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3618296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (namespace_decl && *namespace_decl) 3619296b06d325413723f5aac5988eed977b278a7807Greg Clayton return 0; // no selectors in namespaces 3620bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton 3621296b06d325413723f5aac5988eed977b278a7807Greg Clayton num_matches = m_apple_names_ap->FindByName (name_cstr, die_offsets); 3622296b06d325413723f5aac5988eed977b278a7807Greg Clayton // Now make sure these are actually ObjC methods. In this case we can simply look up the name, 3623296b06d325413723f5aac5988eed977b278a7807Greg Clayton // and if it is an ObjC method name, we're good. 3624296b06d325413723f5aac5988eed977b278a7807Greg Clayton 3625296b06d325413723f5aac5988eed977b278a7807Greg Clayton for (uint32_t i = 0; i < num_matches; i++) 3626296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3627296b06d325413723f5aac5988eed977b278a7807Greg Clayton const dw_offset_t die_offset = die_offsets[i]; 3628296b06d325413723f5aac5988eed977b278a7807Greg Clayton const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); 3629296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (die) 3630bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton { 3631296b06d325413723f5aac5988eed977b278a7807Greg Clayton const char *die_name = die->GetName(this, dwarf_cu); 3632296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (ObjCLanguageRuntime::IsPossibleObjCMethodName(die_name)) 3633bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton { 3634296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine) 3635296b06d325413723f5aac5988eed977b278a7807Greg Clayton continue; 3636296b06d325413723f5aac5988eed977b278a7807Greg Clayton 3637296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (resolved_dies.find(die) == resolved_dies.end()) 3638302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan { 3639296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (ResolveFunction (dwarf_cu, die, sc_list)) 3640296b06d325413723f5aac5988eed977b278a7807Greg Clayton resolved_dies.insert(die); 3641302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan } 3642bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton } 3643bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton } 3644296b06d325413723f5aac5988eed977b278a7807Greg Clayton else 3645296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3646296b06d325413723f5aac5988eed977b278a7807Greg Clayton GetObjectFile()->GetModule()->ReportError ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')", 3647296b06d325413723f5aac5988eed977b278a7807Greg Clayton die_offset, name_cstr); 3648296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 3649bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton } 3650296b06d325413723f5aac5988eed977b278a7807Greg Clayton die_offsets.clear(); 3651296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 3652296b06d325413723f5aac5988eed977b278a7807Greg Clayton 3653296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (((name_type_mask & eFunctionNameTypeMethod) && !namespace_decl) || name_type_mask & eFunctionNameTypeBase) 3654296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3655296b06d325413723f5aac5988eed977b278a7807Greg Clayton // The apple_names table stores just the "base name" of C++ methods in the table. So we have to 3656296b06d325413723f5aac5988eed977b278a7807Greg Clayton // extract the base name, look that up, and if there is any other information in the name we were 3657296b06d325413723f5aac5988eed977b278a7807Greg Clayton // passed in we have to post-filter based on that. 36588b7b2276132c7353cabd22000287b42badc26613Jim Ingham 3659296b06d325413723f5aac5988eed977b278a7807Greg Clayton // FIXME: Arrange the logic above so that we don't calculate the base name twice: 3660296b06d325413723f5aac5988eed977b278a7807Greg Clayton num_matches = m_apple_names_ap->FindByName (name_cstr, die_offsets); 3661296b06d325413723f5aac5988eed977b278a7807Greg Clayton 3662296b06d325413723f5aac5988eed977b278a7807Greg Clayton for (uint32_t i = 0; i < num_matches; i++) 36638b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 3664296b06d325413723f5aac5988eed977b278a7807Greg Clayton const dw_offset_t die_offset = die_offsets[i]; 3665296b06d325413723f5aac5988eed977b278a7807Greg Clayton const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); 3666296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (die) 36677a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton { 3668296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine) 3669296b06d325413723f5aac5988eed977b278a7807Greg Clayton continue; 3670296b06d325413723f5aac5988eed977b278a7807Greg Clayton 3671296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (namespace_decl && !DIEIsInNamespace (namespace_decl, dwarf_cu, die)) 3672296b06d325413723f5aac5988eed977b278a7807Greg Clayton continue; 3673296b06d325413723f5aac5988eed977b278a7807Greg Clayton 3674296b06d325413723f5aac5988eed977b278a7807Greg Clayton // If we get to here, the die is good, and we should add it: 3675296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (resolved_dies.find(die) == resolved_dies.end()) 3676296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (ResolveFunction (dwarf_cu, die, sc_list)) 3677bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton { 3678296b06d325413723f5aac5988eed977b278a7807Greg Clayton bool keep_die = true; 3679296b06d325413723f5aac5988eed977b278a7807Greg Clayton if ((name_type_mask & (eFunctionNameTypeBase|eFunctionNameTypeMethod)) != (eFunctionNameTypeBase|eFunctionNameTypeMethod)) 3680296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3681296b06d325413723f5aac5988eed977b278a7807Greg Clayton // We are looking for either basenames or methods, so we need to 3682296b06d325413723f5aac5988eed977b278a7807Greg Clayton // trim out the ones we won't want by looking at the type 3683296b06d325413723f5aac5988eed977b278a7807Greg Clayton SymbolContext sc; 3684296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (sc_list.GetLastContext(sc)) 3685296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3686296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (sc.block) 3687296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3688296b06d325413723f5aac5988eed977b278a7807Greg Clayton // We have an inlined function 3689296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 3690296b06d325413723f5aac5988eed977b278a7807Greg Clayton else if (sc.function) 3691296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3692296b06d325413723f5aac5988eed977b278a7807Greg Clayton Type *type = sc.function->GetType(); 3693296b06d325413723f5aac5988eed977b278a7807Greg Clayton 3694296b06d325413723f5aac5988eed977b278a7807Greg Clayton clang::DeclContext* decl_ctx = GetClangDeclContextContainingTypeUID (type->GetID()); 3695296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (decl_ctx->isRecord()) 3696296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3697296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (name_type_mask & eFunctionNameTypeBase) 3698296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3699296b06d325413723f5aac5988eed977b278a7807Greg Clayton sc_list.RemoveContextAtIndex(sc_list.GetSize()-1); 3700296b06d325413723f5aac5988eed977b278a7807Greg Clayton keep_die = false; 3701296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 3702296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 3703296b06d325413723f5aac5988eed977b278a7807Greg Clayton else 3704296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3705296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (name_type_mask & eFunctionNameTypeMethod) 3706296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3707296b06d325413723f5aac5988eed977b278a7807Greg Clayton sc_list.RemoveContextAtIndex(sc_list.GetSize()-1); 3708296b06d325413723f5aac5988eed977b278a7807Greg Clayton keep_die = false; 3709296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 3710296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 3711296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 3712296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 3713296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 3714296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (keep_die) 3715296b06d325413723f5aac5988eed977b278a7807Greg Clayton resolved_dies.insert(die); 3716bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton } 37177a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton } 3718296b06d325413723f5aac5988eed977b278a7807Greg Clayton else 3719296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3720296b06d325413723f5aac5988eed977b278a7807Greg Clayton GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')", 3721296b06d325413723f5aac5988eed977b278a7807Greg Clayton die_offset, name_cstr); 3722296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 37238b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 3724296b06d325413723f5aac5988eed977b278a7807Greg Clayton die_offsets.clear(); 37258b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 37268b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 372700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 372800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton else 372900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 373012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton 373100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton // Index the DWARF if we haven't already 373200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (!m_indexed) 373300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton Index (); 373412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton 373500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (name_type_mask & eFunctionNameTypeFull) 373696641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec { 373700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton FindFunctions (name, m_function_fullname_index, sc_list); 373812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton 373996641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec // Temporary workaround for global/anonymous namespace functions on linux 374096641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec#if defined (__linux__) 374196641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec // If we didn't find any functions in the global namespace try 374296641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec // looking in the basename index but ignore any returned 374396641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec // functions that have a namespace (ie. mangled names starting with 374496641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec // '_ZN') but keep functions which have an anonymous namespace 374596641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec if (sc_list.GetSize() == 0) 374696641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec { 374796641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec SymbolContextList temp_sc_list; 374896641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec FindFunctions (name, m_function_basename_index, temp_sc_list); 374996641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec if (!namespace_decl) 375096641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec { 375196641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec SymbolContext sc; 375296641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec for (uint32_t i = 0; i < temp_sc_list.GetSize(); i++) 375396641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec { 375496641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec if (temp_sc_list.GetContextAtIndex(i, sc)) 375596641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec { 3756cfc053eb46e8d1b5709ad9b1d29786d70420c78dMatt Kopec ConstString mangled_name = sc.GetFunctionName(Mangled::ePreferMangled); 3757cfc053eb46e8d1b5709ad9b1d29786d70420c78dMatt Kopec ConstString demangled_name = sc.GetFunctionName(Mangled::ePreferDemangled); 3758fb1b8e2dc46be9253116727afc61796abc9c4ccfMatt Kopec if (strncmp(mangled_name.GetCString(), "_ZN", 3) || 3759fb1b8e2dc46be9253116727afc61796abc9c4ccfMatt Kopec !strncmp(demangled_name.GetCString(), "(anonymous namespace)", 21)) 376096641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec { 376196641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec sc_list.Append(sc); 376296641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec } 376396641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec } 376496641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec } 376596641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec } 376696641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec } 376796641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec#endif 376896641d89f901d4f7a1b601d56facf4149ba0b381Matt Kopec } 37698b7b2276132c7353cabd22000287b42badc26613Jim Ingham DIEArray die_offsets; 37708b7b2276132c7353cabd22000287b42badc26613Jim Ingham DWARFCompileUnit *dwarf_cu = NULL; 37718b7b2276132c7353cabd22000287b42badc26613Jim Ingham 3772296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (name_type_mask & eFunctionNameTypeBase) 37738b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 3774296b06d325413723f5aac5988eed977b278a7807Greg Clayton uint32_t num_base = m_function_basename_index.Find(name, die_offsets); 37757a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton for (uint32_t i = 0; i < num_base; i++) 37768b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 37777a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offsets[i], &dwarf_cu); 37787a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton if (die) 37797a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton { 3780b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine) 3781b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton continue; 3782b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton 37830fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan if (namespace_decl && !DIEIsInNamespace (namespace_decl, dwarf_cu, die)) 37840fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan continue; 37850fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan 37867a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton // If we get to here, the die is good, and we should add it: 3787296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (resolved_dies.find(die) == resolved_dies.end()) 3788296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3789296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (ResolveFunction (dwarf_cu, die, sc_list)) 3790296b06d325413723f5aac5988eed977b278a7807Greg Clayton resolved_dies.insert(die); 3791296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 37927a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton } 37938b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 37948b7b2276132c7353cabd22000287b42badc26613Jim Ingham die_offsets.clear(); 37958b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 37968b7b2276132c7353cabd22000287b42badc26613Jim Ingham 3797296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (name_type_mask & eFunctionNameTypeMethod) 37988b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 37990fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan if (namespace_decl && *namespace_decl) 38000fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return 0; // no methods in namespaces 38010fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan 3802296b06d325413723f5aac5988eed977b278a7807Greg Clayton uint32_t num_base = m_function_method_index.Find(name, die_offsets); 38038b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 38047a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton for (uint32_t i = 0; i < num_base; i++) 38057a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton { 38067a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offsets[i], &dwarf_cu); 38077a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton if (die) 38087a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton { 3809b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine) 3810b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton continue; 3811b5bdf6a7e0b9f73de880d9b12d55ab4aeed8634fGreg Clayton 38127a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton // If we get to here, the die is good, and we should add it: 3813296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (resolved_dies.find(die) == resolved_dies.end()) 3814296b06d325413723f5aac5988eed977b278a7807Greg Clayton { 3815296b06d325413723f5aac5988eed977b278a7807Greg Clayton if (ResolveFunction (dwarf_cu, die, sc_list)) 3816296b06d325413723f5aac5988eed977b278a7807Greg Clayton resolved_dies.insert(die); 3817296b06d325413723f5aac5988eed977b278a7807Greg Clayton } 38187a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton } 38197a1e5da2bcea7ec37dff72591892015da1f9e125Greg Clayton } 38208b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 38218b7b2276132c7353cabd22000287b42badc26613Jim Ingham die_offsets.clear(); 38228b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 382312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton 3824296b06d325413723f5aac5988eed977b278a7807Greg Clayton if ((name_type_mask & eFunctionNameTypeSelector) && (!namespace_decl || !*namespace_decl)) 38258b7b2276132c7353cabd22000287b42badc26613Jim Ingham { 382600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton FindFunctions (name, m_function_selector_index, sc_list); 38278b7b2276132c7353cabd22000287b42badc26613Jim Ingham } 38288b7b2276132c7353cabd22000287b42badc26613Jim Ingham 38299a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton } 38309a93fcd1c343560eb33770c2e73eb3bd431535d6Greg Clayton 383124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Return the number of variable that were appended to the list 38327c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton const uint32_t num_matches = sc_list.GetSize() - original_size; 38337c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton 38347c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton if (log && num_matches > 0) 38357c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton { 3836952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 38377c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton "SymbolFileDWARF::FindFunctions (name=\"%s\", name_type_mask=0x%x, append=%u, sc_list) => %u", 38387c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton name.GetCString(), 38397c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton name_type_mask, 38407c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton append, 38417c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton num_matches); 38427c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton } 38437c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton return num_matches; 384424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 384524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 384624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 3847302d78c71902398ce1f422bd09216dd53a6abb88Sean CallananSymbolFileDWARF::FindFunctions(const RegularExpression& regex, bool include_inlines, bool append, SymbolContextList& sc_list) 384824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 384924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 385024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "SymbolFileDWARF::FindFunctions (regex = '%s')", 385124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regex.GetText()); 385224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3853952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS)); 3854c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton 3855c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton if (log) 3856c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton { 3857952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 3858df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton "SymbolFileDWARF::FindFunctions (regex=\"%s\", append=%u, sc_list)", 3859df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton regex.GetText(), 3860df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton append); 3861c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton } 3862c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton 3863c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton 386424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we aren't appending the results to this list, then clear the list 386524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!append) 386624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc_list.Clear(); 386724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 386824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Remember how many sc_list are in the list before we search in case 386924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we are appending the results to a variable list. 387024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t original_size = sc_list.GetSize(); 387124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3872bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_using_apple_tables) 387300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 3874bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_apple_names_ap.get()) 3875bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton FindFunctions (regex, *m_apple_names_ap, sc_list); 387600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 387700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton else 387800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 38798b7b2276132c7353cabd22000287b42badc26613Jim Ingham // Index the DWARF if we haven't already 388000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (!m_indexed) 388100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton Index (); 388224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 388300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton FindFunctions (regex, m_function_basename_index, sc_list); 388424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 388500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton FindFunctions (regex, m_function_fullname_index, sc_list); 388600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 388724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 388824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Return the number of variable that were appended to the list 388924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - original_size; 389024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3891545489247a7b520dd603c9e5b0f0ef05a77ba9e3Jim Ingham 389224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 389337bb8ddd443da172f42bb8657f15ec856a525c84Greg ClaytonSymbolFileDWARF::FindTypes (const SymbolContext& sc, 389437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton const ConstString &name, 389537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton const lldb_private::ClangNamespaceDecl *namespace_decl, 389637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton bool append, 389737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton uint32_t max_matches, 389837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton TypeList& types) 389924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 390074124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton DWARFDebugInfo* info = DebugInfo(); 390174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton if (info == NULL) 390274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton return 0; 390374124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton 3904952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS)); 3905c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton 3906c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton if (log) 3907c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton { 39087c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton if (namespace_decl) 39097c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton { 3910952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 39117c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton "SymbolFileDWARF::FindTypes (sc, name=\"%s\", clang::NamespaceDecl(%p) \"%s\", append=%u, max_matches=%u, type_list)", 39127c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton name.GetCString(), 39137c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton namespace_decl->GetNamespaceDecl(), 39147c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton namespace_decl->GetQualifiedName().c_str(), 39157c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton append, 39167c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton max_matches); 39177c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton } 39187c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton else 39197c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton { 3920952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 39217c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton "SymbolFileDWARF::FindTypes (sc, name=\"%s\", clang::NamespaceDecl(NULL), append=%u, max_matches=%u, type_list)", 39227c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton name.GetCString(), 39237c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton append, 39247c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton max_matches); 39257c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton } 3926c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton } 3927c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton 392824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we aren't appending the results to this list, then clear the list 392924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!append) 393024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner types.Clear(); 39310fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan 39320fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan if (!NamespaceDeclMatchesThisSymbolFile(namespace_decl)) 39330fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return 0; 393424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3935144188bc458a35997d2f2e52206ab69747439073Greg Clayton DIEArray die_offsets; 393600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 3937bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_using_apple_tables) 393800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 3939bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_apple_types_ap.get()) 3940bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton { 3941bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton const char *name_cstr = name.GetCString(); 3942bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton m_apple_types_ap->FindByName (name_cstr, die_offsets); 3943bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton } 394400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 394500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton else 394600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 394700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (!m_indexed) 394800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton Index (); 394900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 395000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton m_type_index.Find (name, die_offsets); 395100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 395200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 39537c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton const size_t num_die_matches = die_offsets.size(); 395400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 39557c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton if (num_die_matches) 395624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 395700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const uint32_t initial_types_size = types.GetSize(); 395800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton DWARFCompileUnit* dwarf_cu = NULL; 395900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const DWARFDebugInfoEntry* die = NULL; 3960144188bc458a35997d2f2e52206ab69747439073Greg Clayton DWARFDebugInfo* debug_info = DebugInfo(); 39617c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton for (size_t i=0; i<num_die_matches; ++i) 396224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3963144188bc458a35997d2f2e52206ab69747439073Greg Clayton const dw_offset_t die_offset = die_offsets[i]; 3964144188bc458a35997d2f2e52206ab69747439073Greg Clayton die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); 3965144188bc458a35997d2f2e52206ab69747439073Greg Clayton 3966bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (die) 396763afdb07641f04aa7b60d895120b056124d3469bGreg Clayton { 3968bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (namespace_decl && !DIEIsInNamespace (namespace_decl, dwarf_cu, die)) 3969bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton continue; 3970bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton 3971bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton Type *matching_type = ResolveType (dwarf_cu, die); 3972bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (matching_type) 3973bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 3974bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton // We found a type pointer, now find the shared pointer form our type list 397513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton types.InsertUnique (matching_type->shared_from_this()); 3976bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (types.GetSize() >= max_matches) 3977bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton break; 3978bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 397963afdb07641f04aa7b60d895120b056124d3469bGreg Clayton } 3980bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton else 3981bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 3982bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (m_using_apple_tables) 3983bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 3984df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n", 3985df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton die_offset, name.GetCString()); 3986bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 3987bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 3988bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton 398924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39907c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton const uint32_t num_matches = types.GetSize() - initial_types_size; 39917c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton if (log && num_matches) 39927c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton { 39937c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton if (namespace_decl) 39947c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton { 3995952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 39967c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton "SymbolFileDWARF::FindTypes (sc, name=\"%s\", clang::NamespaceDecl(%p) \"%s\", append=%u, max_matches=%u, type_list) => %u", 39977c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton name.GetCString(), 39987c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton namespace_decl->GetNamespaceDecl(), 39997c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton namespace_decl->GetQualifiedName().c_str(), 40007c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton append, 40017c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton max_matches, 40027c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton num_matches); 40037c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton } 40047c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton else 40057c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton { 4006952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 40077c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton "SymbolFileDWARF::FindTypes (sc, name=\"%s\", clang::NamespaceDecl(NULL), append=%u, max_matches=%u, type_list) => %u", 40087c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton name.GetCString(), 40097c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton append, 40107c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton max_matches, 40117c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton num_matches); 40127c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton } 40137c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton } 40147c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton return num_matches; 401524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 401600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton return 0; 401724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 401824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 401924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40206916e358c9725b75ed91f31236c147f26c9af10eGreg ClaytonClangNamespaceDecl 4021d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg ClaytonSymbolFileDWARF::FindNamespace (const SymbolContext& sc, 40220fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan const ConstString &name, 40230fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan const lldb_private::ClangNamespaceDecl *parent_namespace_decl) 4024d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton{ 4025952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS)); 4026c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton 4027c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton if (log) 4028c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton { 4029952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 4030df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton "SymbolFileDWARF::FindNamespace (sc, name=\"%s\")", 4031df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton name.GetCString()); 4032c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton } 40330fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan 40340fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan if (!NamespaceDeclMatchesThisSymbolFile(parent_namespace_decl)) 40350fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return ClangNamespaceDecl(); 4036c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Clayton 40376916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton ClangNamespaceDecl namespace_decl; 4038d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton DWARFDebugInfo* info = DebugInfo(); 40396916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (info) 4040d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton { 404100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton DIEArray die_offsets; 404200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 40436916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton // Index if we already haven't to make sure the compile units 40446916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton // get indexed and make their global DIE index list 4045bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_using_apple_tables) 404600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 4047bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_apple_namespaces_ap.get()) 4048bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton { 4049bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton const char *name_cstr = name.GetCString(); 4050bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton m_apple_namespaces_ap->FindByName (name_cstr, die_offsets); 4051bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton } 405200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 405300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton else 405400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 405500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (!m_indexed) 405600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton Index (); 40576916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 405800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton m_namespace_index.Find (name, die_offsets); 405900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 4060144188bc458a35997d2f2e52206ab69747439073Greg Clayton 4061144188bc458a35997d2f2e52206ab69747439073Greg Clayton DWARFCompileUnit* dwarf_cu = NULL; 40626916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton const DWARFDebugInfoEntry* die = NULL; 406300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const size_t num_matches = die_offsets.size(); 4064144188bc458a35997d2f2e52206ab69747439073Greg Clayton if (num_matches) 40656916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton { 4066144188bc458a35997d2f2e52206ab69747439073Greg Clayton DWARFDebugInfo* debug_info = DebugInfo(); 4067144188bc458a35997d2f2e52206ab69747439073Greg Clayton for (size_t i=0; i<num_matches; ++i) 40686916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton { 4069144188bc458a35997d2f2e52206ab69747439073Greg Clayton const dw_offset_t die_offset = die_offsets[i]; 4070144188bc458a35997d2f2e52206ab69747439073Greg Clayton die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); 40710fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan 4072bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (die) 4073144188bc458a35997d2f2e52206ab69747439073Greg Clayton { 4074bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (parent_namespace_decl && !DIEIsInNamespace (parent_namespace_decl, dwarf_cu, die)) 4075bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton continue; 4076bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton 4077bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton clang::NamespaceDecl *clang_namespace_decl = ResolveNamespaceDIE (dwarf_cu, die); 4078bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (clang_namespace_decl) 4079bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 4080bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton namespace_decl.SetASTContext (GetClangASTContext().getASTContext()); 4081bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton namespace_decl.SetNamespaceDecl (clang_namespace_decl); 408237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton break; 4083bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 4084144188bc458a35997d2f2e52206ab69747439073Greg Clayton } 4085bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton else 4086bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 4087bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (m_using_apple_tables) 4088bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 4089df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_namespaces accelerator table had bad die 0x%8.8x for '%s')\n", 4090df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton die_offset, name.GetCString()); 4091bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 4092bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 4093bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton 40946916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton } 40956916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton } 4096d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton } 40977c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton if (log && namespace_decl.GetNamespaceDecl()) 40987c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton { 4099952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 41007c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton "SymbolFileDWARF::FindNamespace (sc, name=\"%s\") => clang::NamespaceDecl(%p) \"%s\"", 41017c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton name.GetCString(), 41027c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton namespace_decl.GetNamespaceDecl(), 41037c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton namespace_decl.GetQualifiedName().c_str()); 41047c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton } 41057c2d140366f64229b17fe6703cf58cd197e56518Greg Clayton 41066916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton return namespace_decl; 4107d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton} 4108d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton 410924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 4110960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonSymbolFileDWARF::FindTypes(std::vector<dw_offset_t> die_offsets, uint32_t max_matches, TypeList& types) 411124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 411224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Remember how many sc_list are in the list before we search in case 411324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we are appending the results to a variable list. 4114960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton uint32_t original_size = types.GetSize(); 411524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 411624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t num_die_offsets = die_offsets.size(); 411724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse all of the types we found from the pubtypes matches 411824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 411924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_matches = 0; 412024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i = 0; i < num_die_offsets; ++i) 412124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4122960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton Type *matching_type = ResolveTypeUID (die_offsets[i]); 4123960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (matching_type) 412424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4125960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // We found a type pointer, now find the shared pointer form our type list 412613d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton types.InsertUnique (matching_type->shared_from_this()); 4127960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton ++num_matches; 4128960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (num_matches >= max_matches) 4129960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 413024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 413124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 413224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 413324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Return the number of variable that were appended to the list 4134960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return types.GetSize() - original_size; 413524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 413624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 413724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 413824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 4139c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg ClaytonSymbolFileDWARF::ParseChildParameters (const SymbolContext& sc, 4140c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton clang::DeclContext *containing_decl_ctx, 4141c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton DWARFCompileUnit* dwarf_cu, 4142c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton const DWARFDebugInfoEntry *parent_die, 4143c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton bool skip_artificial, 4144c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton bool &is_static, 4145c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton TypeList* type_list, 414652f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::vector<ClangASTType>& function_param_types, 4147c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton std::vector<clang::ParmVarDecl*>& function_param_decls, 4148b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton unsigned &type_quals, 4149b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton ClangASTContext::TemplateParameterInfos &template_param_infos) 415024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 415124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_die == NULL) 415224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 415324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41545fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize()); 41555fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 41562403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton size_t arg_idx = 0; 415724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *die; 415824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling()) 415924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 416024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_tag_t tag = die->Tag(); 416124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (tag) 416224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 416324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_formal_parameter: 416424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 416524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::Attributes attributes; 41665fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const size_t num_attributes = die->GetAttributes(this, dwarf_cu, fixed_form_sizes, attributes); 416724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_attributes > 0) 416824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 416924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name = NULL; 417024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Declaration decl; 417124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_offset_t param_type_die_offset = DW_INVALID_OFFSET; 4172412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton bool is_artificial = false; 417324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // one of None, Auto, Register, Extern, Static, PrivateExtern 417424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 417547a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan clang::StorageClass storage = clang::SC_None; 417624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 417724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_attributes; ++i) 417824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 417924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const dw_attr_t attr = attributes.AttributeAtIndex(i); 418024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFFormValue form_value; 418124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 418224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 418324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (attr) 418424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 418524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 418624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 418724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 418824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_name: name = form_value.AsCString(&get_debug_str_data()); break; 418924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_type: param_type_die_offset = form_value.Reference(dwarf_cu); break; 4190f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton case DW_AT_artificial: is_artificial = form_value.Boolean(); break; 419124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_location: 419224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // if (form_value.BlockData()) 419324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // { 419424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // const DataExtractor& debug_info_data = debug_info(); 419524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // uint32_t block_length = form_value.Unsigned(); 419624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // DataExtractor location(debug_info_data, form_value.BlockData() - debug_info_data.GetDataStart(), block_length); 419724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // } 419824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // else 419924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // { 420024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // } 420124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // break; 420224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_const_value: 420324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_default_value: 420424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_description: 420524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_endianity: 420624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_is_optional: 420724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_segment: 420824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_variable_parameter: 420924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 421024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_abstract_origin: 421124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_sibling: 421224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 421324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 421424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 421524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4216412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton 42171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool skip = false; 42181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (skip_artificial) 42191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 42201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (is_artificial) 42212403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton { 42222403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton // In order to determine if a C++ member function is 42232403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton // "const" we have to look at the const-ness of "this"... 42242403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton // Ugly, but that 42252403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton if (arg_idx == 0) 42262403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton { 4227f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton if (DeclKindIsCXXClass(containing_decl_ctx->getDeclKind())) 422899309909259eacf4693458bfe44f913c316a09c6Sean Callanan { 4229c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton // Often times compilers omit the "this" name for the 4230c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton // specification DIEs, so we can't rely upon the name 4231c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton // being in the formal parameter DIE... 4232c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton if (name == NULL || ::strcmp(name, "this")==0) 42332403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton { 4234c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton Type *this_type = ResolveTypeUID (param_type_die_offset); 4235c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton if (this_type) 4236c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton { 4237c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton uint32_t encoding_mask = this_type->GetEncodingMask(); 4238c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton if (encoding_mask & Type::eEncodingIsPointerUID) 4239c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton { 4240c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton is_static = false; 4241c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton 4242c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton if (encoding_mask & (1u << Type::eEncodingIsConstUID)) 4243c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton type_quals |= clang::Qualifiers::Const; 4244c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton if (encoding_mask & (1u << Type::eEncodingIsVolatileUID)) 4245c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton type_quals |= clang::Qualifiers::Volatile; 42462403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton } 42472403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton } 42482403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton } 42492403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton } 42502403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton } 42511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton skip = true; 42522403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton } 42531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton else 42541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 42551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 42561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton // HACK: Objective C formal parameters "self" and "_cmd" 42571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton // are not marked as artificial in the DWARF... 42580be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton CompileUnit *comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX); 42590be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton if (comp_unit) 42601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 42610be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton switch (comp_unit->GetLanguage()) 42620be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton { 42630be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton case eLanguageTypeObjC: 42640be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton case eLanguageTypeObjC_plus_plus: 42650be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton if (name && name[0] && (strcmp (name, "self") == 0 || strcmp (name, "_cmd") == 0)) 42660be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton skip = true; 42670be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton break; 42680be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton default: 42690be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton break; 42700be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton } 42711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 42721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 42731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 4274412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton 42751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!skip) 427624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton Type *type = ResolveTypeUID(param_type_die_offset); 42781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (type) 42791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 4280b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton function_param_types.push_back (type->GetClangForwardType()); 428124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4282bcb0adc2d1d32baa111c0a11eded0e2b4fbef383Greg Clayton clang::ParmVarDecl *param_var_decl = GetClangASTContext().CreateParameterDeclaration (name, 4283bcb0adc2d1d32baa111c0a11eded0e2b4fbef383Greg Clayton type->GetClangForwardType(), 4284bcb0adc2d1d32baa111c0a11eded0e2b4fbef383Greg Clayton storage); 42851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton assert(param_var_decl); 42861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton function_param_decls.push_back(param_var_decl); 4287fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan 4288017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton GetClangASTContext().SetMetadataAsUserID (param_var_decl, MakeUserID(die->GetOffset())); 42891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 429024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 429124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42922403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton arg_idx++; 429324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 429424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 429524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4296b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton case DW_TAG_template_type_parameter: 4297b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton case DW_TAG_template_value_parameter: 4298b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton ParseTemplateDIE (dwarf_cu, die,template_param_infos); 4299b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton break; 4300b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton 430124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 430224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 430324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 430424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43052403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton return arg_idx; 430624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 430724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 430824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 430924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::ParseChildEnumerators 431024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 431124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const SymbolContext& sc, 431252f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb_private::ClangASTType &clang_type, 4313d5e48bd4029b47cd298fd065429bb3a350a08324Greg Clayton bool is_signed, 431424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t enumerator_byte_size, 43151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton DWARFCompileUnit* dwarf_cu, 431624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *parent_die 431724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 431824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 431924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_die == NULL) 432024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 432124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 432224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t enumerators_added = 0; 432324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *die; 43245fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize()); 43255fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 432624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling()) 432724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 432824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const dw_tag_t tag = die->Tag(); 432924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag == DW_TAG_enumerator) 433024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 433124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::Attributes attributes; 43325fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const size_t num_child_attributes = die->GetAttributes(this, dwarf_cu, fixed_form_sizes, attributes); 433324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_child_attributes > 0) 433424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 433524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name = NULL; 433624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool got_value = false; 433724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t enum_value = 0; 433824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Declaration decl; 433924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 434024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 434124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_child_attributes; ++i) 434224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 434324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const dw_attr_t attr = attributes.AttributeAtIndex(i); 434424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFFormValue form_value; 434524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 434624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 434724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (attr) 434824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 434924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_const_value: 435024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner got_value = true; 4351d5e48bd4029b47cd298fd065429bb3a350a08324Greg Clayton if (is_signed) 4352d5e48bd4029b47cd298fd065429bb3a350a08324Greg Clayton enum_value = form_value.Signed(); 4353d5e48bd4029b47cd298fd065429bb3a350a08324Greg Clayton else 4354d5e48bd4029b47cd298fd065429bb3a350a08324Greg Clayton enum_value = form_value.Unsigned(); 435524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 435624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 435724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_name: 435824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name = form_value.AsCString(&get_debug_str_data()); 435924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 436024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 436124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_description: 436224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 436324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 436424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 436524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 436624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_sibling: 436724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 436824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 436924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 437024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 437124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 437224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && name[0] && got_value) 437324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 437452f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.AddEnumerationValueToEnumerationType (clang_type.GetEnumerationIntegerType(), 437552f792329be5db8e38961350589e97e8f2823acdGreg Clayton decl, 437652f792329be5db8e38961350589e97e8f2823acdGreg Clayton name, 437752f792329be5db8e38961350589e97e8f2823acdGreg Clayton enum_value, 437852f792329be5db8e38961350589e97e8f2823acdGreg Clayton enumerator_byte_size * 8); 437924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++enumerators_added; 438024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 438124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 438224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 438324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 438424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return enumerators_added; 438524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 438624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 438724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 438824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::ParseChildArrayInfo 438924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 439024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const SymbolContext& sc, 43911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton DWARFCompileUnit* dwarf_cu, 439224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *parent_die, 439324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t& first_index, 439424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint64_t>& element_orders, 439524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t& byte_stride, 439624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t& bit_stride 439724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 439824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 439924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_die == NULL) 440024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 440124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 440224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *die; 44035fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize()); 440424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling()) 440524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 440624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const dw_tag_t tag = die->Tag(); 440724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (tag) 440824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 440924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_subrange_type: 441024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 441124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::Attributes attributes; 44125fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const size_t num_child_attributes = die->GetAttributes(this, dwarf_cu, fixed_form_sizes, attributes); 441324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_child_attributes > 0) 441424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 441524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t num_elements = 0; 441624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t lower_bound = 0; 441724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t upper_bound = 0; 4418b912457e1eb6f97d3ee3adc74d1e0f6393e35d3cGreg Clayton bool upper_bound_valid = false; 441924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 442024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_child_attributes; ++i) 442124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 442224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const dw_attr_t attr = attributes.AttributeAtIndex(i); 442324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFFormValue form_value; 442424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 442524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 442624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (attr) 442724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 442824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_name: 442924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 443024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 443124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_count: 443224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_elements = form_value.Unsigned(); 443324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 443424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 443524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_bit_stride: 443624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_stride = form_value.Unsigned(); 443724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 443824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 443924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_byte_stride: 444024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_stride = form_value.Unsigned(); 444124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 444224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 444324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_lower_bound: 444424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lower_bound = form_value.Unsigned(); 444524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 444624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 444724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_upper_bound: 4448b912457e1eb6f97d3ee3adc74d1e0f6393e35d3cGreg Clayton upper_bound_valid = true; 444924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner upper_bound = form_value.Unsigned(); 445024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 445124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 445224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 445324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_abstract_origin: 445424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_accessibility: 445524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_allocated: 445624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_associated: 445724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_data_location: 445824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_declaration: 445924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_description: 446024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_sibling: 446124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_threads_scaled: 446224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_type: 446324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_visibility: 446424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 446524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 446624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 446724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 446824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4469a7eb2484d2be5a517b96fa04a76ac03db16712d6Greg Clayton if (num_elements == 0) 4470a7eb2484d2be5a517b96fa04a76ac03db16712d6Greg Clayton { 4471b912457e1eb6f97d3ee3adc74d1e0f6393e35d3cGreg Clayton if (upper_bound_valid && upper_bound >= lower_bound) 4472a7eb2484d2be5a517b96fa04a76ac03db16712d6Greg Clayton num_elements = upper_bound - lower_bound + 1; 4473a7eb2484d2be5a517b96fa04a76ac03db16712d6Greg Clayton } 447424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4475b8183d463ca7b2ba106f000d69cb99a50dbb20f8Sean Callanan element_orders.push_back (num_elements); 447624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 447724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 447824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 447924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 448024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 448124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 448224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 448324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeSP 44840be1edd34ff46e017b1b973c5a57e3de9f613bafGreg ClaytonSymbolFileDWARF::GetTypeForDIE (DWARFCompileUnit *dwarf_cu, const DWARFDebugInfoEntry* die) 448524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 448624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeSP type_sp; 448724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (die != NULL) 448824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44890be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton assert(dwarf_cu != NULL); 44904fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton Type *type_ptr = m_die_to_type.lookup (die); 449124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_ptr == NULL) 449224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44930be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton CompileUnit* lldb_cu = GetCompUnitForDWARFCompUnit(dwarf_cu); 44940d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton assert (lldb_cu); 44950d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton SymbolContext sc(lldb_cu); 44960be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton type_sp = ParseType(sc, dwarf_cu, die, NULL); 449724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 449824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (type_ptr != DIE_IS_BEING_PARSED) 449924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 450024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Grab the existing type from the master types lists 450113d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton type_sp = type_ptr->shared_from_this(); 450224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 450324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 450424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 450524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return type_sp; 450624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 450724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 450824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclang::DeclContext * 4509c617a4cb4a451be9d7e97d7af6e165d282b5390fSean CallananSymbolFileDWARF::GetClangDeclContextContainingDIEOffset (dw_offset_t die_offset) 451024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 451124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (die_offset != DW_INVALID_OFFSET) 451224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 451324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFCompileUnitSP cu_sp; 451424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry* die = DebugInfo()->GetDIEPtr(die_offset, &cu_sp); 451503fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton return GetClangDeclContextContainingDIE (cu_sp.get(), die, NULL); 451624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 451724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 451824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 451924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4520c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callananclang::DeclContext * 4521c617a4cb4a451be9d7e97d7af6e165d282b5390fSean CallananSymbolFileDWARF::GetClangDeclContextForDIEOffset (const SymbolContext &sc, dw_offset_t die_offset) 4522c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan{ 4523c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan if (die_offset != DW_INVALID_OFFSET) 4524c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan { 4525b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton DWARFDebugInfo* debug_info = DebugInfo(); 4526b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton if (debug_info) 4527b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton { 4528b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton DWARFCompileUnitSP cu_sp; 4529b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton const DWARFDebugInfoEntry* die = debug_info->GetDIEPtr(die_offset, &cu_sp); 4530b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton if (die) 4531b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton return GetClangDeclContextForDIE (sc, cu_sp.get(), die); 4532b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton } 4533c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan } 4534c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan return NULL; 4535c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan} 453624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4537d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Claytonclang::NamespaceDecl * 45380be1edd34ff46e017b1b973c5a57e3de9f613bafGreg ClaytonSymbolFileDWARF::ResolveNamespaceDIE (DWARFCompileUnit *dwarf_cu, const DWARFDebugInfoEntry *die) 4539d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton{ 45406364304894596829a96c8cd3b07b4ea5e00029daGreg Clayton if (die && die->Tag() == DW_TAG_namespace) 4541d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton { 45426364304894596829a96c8cd3b07b4ea5e00029daGreg Clayton // See if we already parsed this namespace DIE and associated it with a 45436364304894596829a96c8cd3b07b4ea5e00029daGreg Clayton // uniqued namespace declaration 45446364304894596829a96c8cd3b07b4ea5e00029daGreg Clayton clang::NamespaceDecl *namespace_decl = static_cast<clang::NamespaceDecl *>(m_die_to_decl_ctx[die]); 45456364304894596829a96c8cd3b07b4ea5e00029daGreg Clayton if (namespace_decl) 4546d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton return namespace_decl; 45476364304894596829a96c8cd3b07b4ea5e00029daGreg Clayton else 45486364304894596829a96c8cd3b07b4ea5e00029daGreg Clayton { 45490be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton const char *namespace_name = die->GetAttributeValueAsString(this, dwarf_cu, DW_AT_name, NULL); 45500be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIE (dwarf_cu, die, NULL); 4551b51693999473f5dc7cb9681bbbc4a65028eea35bGreg Clayton namespace_decl = GetClangASTContext().GetUniqueNamespaceDeclaration (namespace_name, containing_decl_ctx); 4552952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO)); 4553b51693999473f5dc7cb9681bbbc4a65028eea35bGreg Clayton if (log) 45546364304894596829a96c8cd3b07b4ea5e00029daGreg Clayton { 4555b51693999473f5dc7cb9681bbbc4a65028eea35bGreg Clayton if (namespace_name) 45566364304894596829a96c8cd3b07b4ea5e00029daGreg Clayton { 4557952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 45585f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea "ASTContext => %p: 0x%8.8" PRIx64 ": DW_TAG_namespace with DW_AT_name(\"%s\") => clang::NamespaceDecl *%p (original = %p)", 4559df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetClangASTContext().getASTContext(), 4560df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton MakeUserID(die->GetOffset()), 4561df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton namespace_name, 4562df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton namespace_decl, 4563df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton namespace_decl->getOriginalNamespace()); 45646364304894596829a96c8cd3b07b4ea5e00029daGreg Clayton } 4565b51693999473f5dc7cb9681bbbc4a65028eea35bGreg Clayton else 4566b51693999473f5dc7cb9681bbbc4a65028eea35bGreg Clayton { 4567952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 45685f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea "ASTContext => %p: 0x%8.8" PRIx64 ": DW_TAG_namespace (anonymous) => clang::NamespaceDecl *%p (original = %p)", 4569df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetClangASTContext().getASTContext(), 4570df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton MakeUserID(die->GetOffset()), 4571df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton namespace_decl, 4572df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton namespace_decl->getOriginalNamespace()); 4573b51693999473f5dc7cb9681bbbc4a65028eea35bGreg Clayton } 45746364304894596829a96c8cd3b07b4ea5e00029daGreg Clayton } 4575b51693999473f5dc7cb9681bbbc4a65028eea35bGreg Clayton 4576b51693999473f5dc7cb9681bbbc4a65028eea35bGreg Clayton if (namespace_decl) 4577b51693999473f5dc7cb9681bbbc4a65028eea35bGreg Clayton LinkDeclContextToDIE((clang::DeclContext*)namespace_decl, die); 4578b51693999473f5dc7cb9681bbbc4a65028eea35bGreg Clayton return namespace_decl; 4579d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton } 4580d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton } 4581d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton return NULL; 4582d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton} 458324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 458424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclang::DeclContext * 4585d7088cf9454164ce3a54e345a2c0a07bc1015335Greg ClaytonSymbolFileDWARF::GetClangDeclContextForDIE (const SymbolContext &sc, DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die) 4586c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan{ 4587b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton clang::DeclContext *clang_decl_ctx = GetCachedClangDeclContextForDIE (die); 4588b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton if (clang_decl_ctx) 4589b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton return clang_decl_ctx; 4590c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan // If this DIE has a specification, or an abstract origin, then trace to those. 4591c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 4592d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton dw_offset_t die_offset = die->GetAttributeValueAsReference(this, cu, DW_AT_specification, DW_INVALID_OFFSET); 4593c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan if (die_offset != DW_INVALID_OFFSET) 4594c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan return GetClangDeclContextForDIEOffset (sc, die_offset); 4595c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 4596d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton die_offset = die->GetAttributeValueAsReference(this, cu, DW_AT_abstract_origin, DW_INVALID_OFFSET); 4597c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan if (die_offset != DW_INVALID_OFFSET) 4598c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan return GetClangDeclContextForDIEOffset (sc, die_offset); 4599c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 4600952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO)); 4601d7fc5b8d107b3df44acfcc694f26875e06c1b4e0Greg Clayton if (log) 4602952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage(log, "SymbolFileDWARF::GetClangDeclContextForDIE (die = 0x%8.8x) %s '%s'", die->GetOffset(), DW_TAG_value_to_name(die->Tag()), die->GetName(this, cu)); 4603c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan // This is the DIE we want. Parse it, then query our map. 4604d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton bool assert_not_being_parsed = true; 4605d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton ResolveTypeUID (cu, die, assert_not_being_parsed); 4606d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton 4607b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton clang_decl_ctx = GetCachedClangDeclContextForDIE (die); 4608b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton 4609b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton return clang_decl_ctx; 4610c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan} 4611c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 4612c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callananclang::DeclContext * 461303fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg ClaytonSymbolFileDWARF::GetClangDeclContextContainingDIE (DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die, const DWARFDebugInfoEntry **decl_ctx_die_copy) 461424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 46150d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton if (m_clang_tu_decl == NULL) 46160d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton m_clang_tu_decl = GetClangASTContext().getASTContext()->getTranslationUnitDecl(); 461724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46186c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton const DWARFDebugInfoEntry *decl_ctx_die = GetDeclContextDIEContainingDIE (cu, die); 461903fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton 462003fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton if (decl_ctx_die_copy) 462103fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton *decl_ctx_die_copy = decl_ctx_die; 46226c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton 46236c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton if (decl_ctx_die) 462424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 462503fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton 46266c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton DIEToDeclContextMap::iterator pos = m_die_to_decl_ctx.find (decl_ctx_die); 46276c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton if (pos != m_die_to_decl_ctx.end()) 46286c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton return pos->second; 46290d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton 46306c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton switch (decl_ctx_die->Tag()) 46316c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton { 46326c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton case DW_TAG_compile_unit: 46336c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton return m_clang_tu_decl; 46340d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton 46356c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton case DW_TAG_namespace: 46366364304894596829a96c8cd3b07b4ea5e00029daGreg Clayton return ResolveNamespaceDIE (cu, decl_ctx_die); 46376c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton break; 463824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46396c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton case DW_TAG_structure_type: 46406c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton case DW_TAG_union_type: 46416c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton case DW_TAG_class_type: 46426c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton { 46436c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton Type* type = ResolveType (cu, decl_ctx_die); 46446c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton if (type) 46450d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton { 464652f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::DeclContext *decl_ctx = type->GetClangForwardType().GetDeclContextForType (); 46476c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton if (decl_ctx) 46480d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton { 46496c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton LinkDeclContextToDIE (decl_ctx, decl_ctx_die); 46506c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton if (decl_ctx) 46516c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton return decl_ctx; 465278bce00166fee49ce77bd00d94899be697ef855aGreg Clayton } 46530d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton } 46540d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton } 46556c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton break; 46560d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton 46576c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton default: 46586c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton break; 46590d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton } 46606c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton } 46616c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton return m_clang_tu_decl; 46626c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton} 46636c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton 466424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46656c19c8a7da08b89ee153d7091aa8641348e0482cGreg Claytonconst DWARFDebugInfoEntry * 46666c19c8a7da08b89ee153d7091aa8641348e0482cGreg ClaytonSymbolFileDWARF::GetDeclContextDIEContainingDIE (DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die) 46676c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton{ 46686c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton if (cu && die) 46696c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton { 46706c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton const DWARFDebugInfoEntry * const decl_die = die; 46716c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton 46726c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton while (die != NULL) 46730d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton { 46746c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton // If this is the original DIE that we are searching for a declaration 46756c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton // for, then don't look in the cache as we don't want our own decl 46766c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton // context to be our decl context... 46776c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton if (decl_die != die) 46786c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton { 46796c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton switch (die->Tag()) 46806c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton { 46816c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton case DW_TAG_compile_unit: 46826c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton case DW_TAG_namespace: 46836c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton case DW_TAG_structure_type: 46846c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton case DW_TAG_union_type: 46856c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton case DW_TAG_class_type: 46866c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton return die; 46876c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton 46886c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton default: 46896c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton break; 46906c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton } 46916c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton } 46926c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton 46936c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton dw_offset_t die_offset = die->GetAttributeValueAsReference(this, cu, DW_AT_specification, DW_INVALID_OFFSET); 46946c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton if (die_offset != DW_INVALID_OFFSET) 46956c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton { 46966c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton DWARFCompileUnit *spec_cu = cu; 46976c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton const DWARFDebugInfoEntry *spec_die = DebugInfo()->GetDIEPtrWithCompileUnitHint (die_offset, &spec_cu); 46986c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton const DWARFDebugInfoEntry *spec_die_decl_ctx_die = GetDeclContextDIEContainingDIE (spec_cu, spec_die); 46996c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton if (spec_die_decl_ctx_die) 47006c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton return spec_die_decl_ctx_die; 47016c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton } 47026c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton 47036c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton die_offset = die->GetAttributeValueAsReference(this, cu, DW_AT_abstract_origin, DW_INVALID_OFFSET); 47046c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton if (die_offset != DW_INVALID_OFFSET) 47056c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton { 47066c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton DWARFCompileUnit *abs_cu = cu; 47076c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton const DWARFDebugInfoEntry *abs_die = DebugInfo()->GetDIEPtrWithCompileUnitHint (die_offset, &abs_cu); 47086c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton const DWARFDebugInfoEntry *abs_die_decl_ctx_die = GetDeclContextDIEContainingDIE (abs_cu, abs_die); 47096c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton if (abs_die_decl_ctx_die) 47106c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton return abs_die_decl_ctx_die; 47116c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton } 47126c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton 47136c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton die = die->GetParent(); 47140d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton } 471524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 47166c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton return NULL; 471724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 471824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47196c19c8a7da08b89ee153d7091aa8641348e0482cGreg Clayton 472077917228890a15d40ec6dd28c5865dd1b7895053Greg ClaytonSymbol * 472177917228890a15d40ec6dd28c5865dd1b7895053Greg ClaytonSymbolFileDWARF::GetObjCClassSymbol (const ConstString &objc_class_name) 472277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton{ 472377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton Symbol *objc_class_symbol = NULL; 472477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (m_obj_file) 472577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 47267940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton Symtab *symtab = m_obj_file->GetSymtab (); 472777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (symtab) 472877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 472977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton objc_class_symbol = symtab->FindFirstSymbolWithNameAndType (objc_class_name, 473077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton eSymbolTypeObjCClass, 473177917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton Symtab::eDebugNo, 473277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton Symtab::eVisibilityAny); 473377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 473477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 473577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton return objc_class_symbol; 473677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton} 473777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 4738e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton// Some compilers don't emit the DW_AT_APPLE_objc_complete_type attribute. If they don't 4739e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton// then we can end up looking through all class types for a complete type and never find 4740e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton// the full definition. We need to know if this attribute is supported, so we determine 4741e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton// this here and cache th result. We also need to worry about the debug map DWARF file 4742e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton// if we are doing darwin DWARF in .o file debugging. 4743e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Claytonbool 4744e6b976d3f1c42f18c85c87cb179954af7df5a542Greg ClaytonSymbolFileDWARF::Supports_DW_AT_APPLE_objc_complete_type (DWARFCompileUnit *cu) 4745e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton{ 4746e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolCalculate) 4747e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 4748e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolNo; 4749e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton if (cu && cu->Supports_DW_AT_APPLE_objc_complete_type()) 4750e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes; 4751e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton else 4752e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 4753e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton DWARFDebugInfo* debug_info = DebugInfo(); 4754e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton const uint32_t num_compile_units = GetNumCompileUnits(); 4755e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx) 4756e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 47570be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx); 47580be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton if (dwarf_cu != cu && dwarf_cu->Supports_DW_AT_APPLE_objc_complete_type()) 4759e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 4760e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes; 4761e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton break; 4762e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 4763e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 4764e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 476549ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolNo && GetDebugMapSymfile ()) 4766e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton return m_debug_map_symfile->Supports_DW_AT_APPLE_objc_complete_type (this); 4767e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 4768e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton return m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolYes; 4769e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton} 477077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 477177917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton// This function can be used when a DIE is found that is a forward declaration 477277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton// DIE and we want to try and find a type that has the complete definition. 477377917228890a15d40ec6dd28c5865dd1b7895053Greg ClaytonTypeSP 4774e6b976d3f1c42f18c85c87cb179954af7df5a542Greg ClaytonSymbolFileDWARF::FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die, 4775e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton const ConstString &type_name, 4776e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton bool must_be_implementation) 477777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton{ 477877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 477977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton TypeSP type_sp; 478077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 4781e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton if (!type_name || (must_be_implementation && !GetObjCClassSymbol (type_name))) 478277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton return type_sp; 478377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 478477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton DIEArray die_offsets; 478577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 478677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (m_using_apple_tables) 478777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 478877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (m_apple_types_ap.get()) 478977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 479077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton const char *name_cstr = type_name.GetCString(); 4791cc63936a21c8cf41e6fffe88daec21c1412cab69Greg Clayton m_apple_types_ap->FindCompleteObjCClassByName (name_cstr, die_offsets, must_be_implementation); 479277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 479377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 479477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton else 479577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 479677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (!m_indexed) 479777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton Index (); 479877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 479977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton m_type_index.Find (type_name, die_offsets); 480077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 480177917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 480277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton const size_t num_matches = die_offsets.size(); 480377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 480477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton DWARFCompileUnit* type_cu = NULL; 480577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton const DWARFDebugInfoEntry* type_die = NULL; 480677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (num_matches) 480777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 480877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton DWARFDebugInfo* debug_info = DebugInfo(); 480977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton for (size_t i=0; i<num_matches; ++i) 481077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 481177917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton const dw_offset_t die_offset = die_offsets[i]; 481277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton type_die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &type_cu); 481377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 481477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (type_die) 481577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 481677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton bool try_resolving_type = false; 481777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 481877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton // Don't try and resolve the DIE we are looking for with the DIE itself! 481977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (type_die != die) 482077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 4821e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton switch (type_die->Tag()) 482277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 4823e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton case DW_TAG_class_type: 4824e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton case DW_TAG_structure_type: 4825e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton try_resolving_type = true; 4826e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton break; 4827e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton default: 4828e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton break; 482977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 483077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 483177917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 483277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (try_resolving_type) 483377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 4834e0028b827759c5ad2cbc45947371c362193a63bcSean Callanan if (must_be_implementation && type_cu->Supports_DW_AT_APPLE_objc_complete_type()) 4835e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton try_resolving_type = type_die->GetAttributeValueAsUnsigned (this, type_cu, DW_AT_APPLE_objc_complete_type, 0); 483677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 483777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (try_resolving_type) 483877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 483977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton Type *resolved_type = ResolveType (type_cu, type_die, false); 484077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (resolved_type && resolved_type != DIE_IS_BEING_PARSED) 484177917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 48425f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea DEBUG_PRINTF ("resolved 0x%8.8" PRIx64 " (cu 0x%8.8" PRIx64 ") from %s to 0x%8.8" PRIx64 " (cu 0x%8.8" PRIx64 ")\n", 484377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton MakeUserID(die->GetOffset()), 48440be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton MakeUserID(dwarf_cu->GetOffset()), 484577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton m_obj_file->GetFileSpec().GetFilename().AsCString(), 484677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton MakeUserID(type_die->GetOffset()), 484777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton MakeUserID(type_cu->GetOffset())); 484877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 4849e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton if (die) 4850e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton m_die_to_type[die] = resolved_type; 485113d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton type_sp = resolved_type->shared_from_this(); 485277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton break; 485377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 485477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 485577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 485677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 485777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton else 485877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 485977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (m_using_apple_tables) 486077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 4861df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n", 4862df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton die_offset, type_name.GetCString()); 486377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 486477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 486577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 486677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 486777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 486877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton return type_sp; 486977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton} 487077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 4871cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 4872eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton//---------------------------------------------------------------------- 4873eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton// This function helps to ensure that the declaration contexts match for 4874eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton// two different DIEs. Often times debug information will refer to a 4875eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton// forward declaration of a type (the equivalent of "struct my_struct;". 4876eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton// There will often be a declaration of that type elsewhere that has the 4877eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton// full definition. When we go looking for the full type "my_struct", we 4878eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton// will find one or more matches in the accelerator tables and we will 4879eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton// then need to make sure the type was in the same declaration context 4880eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton// as the original DIE. This function can efficiently compare two DIEs 4881eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton// and will return true when the declaration context matches, and false 4882eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton// when they don't. 4883eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton//---------------------------------------------------------------------- 4884b88575efac471db9156c731c3e28ad7e6d14b5efGreg Claytonbool 4885b88575efac471db9156c731c3e28ad7e6d14b5efGreg ClaytonSymbolFileDWARF::DIEDeclContextsMatch (DWARFCompileUnit* cu1, const DWARFDebugInfoEntry *die1, 4886b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton DWARFCompileUnit* cu2, const DWARFDebugInfoEntry *die2) 4887b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton{ 4888cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (die1 == die2) 4889cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton return true; 4890cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 4891cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton#if defined (LLDB_CONFIGURATION_DEBUG) 4892cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // You can't and shouldn't call this function with a compile unit from 4893cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // two different SymbolFileDWARF instances. 4894cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton assert (DebugInfo()->ContainsCompileUnit (cu1)); 4895cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton assert (DebugInfo()->ContainsCompileUnit (cu2)); 4896cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton#endif 4897cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 4898b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton DWARFDIECollection decl_ctx_1; 4899b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton DWARFDIECollection decl_ctx_2; 4900eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton //The declaration DIE stack is a stack of the declaration context 4901eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // DIEs all the way back to the compile unit. If a type "T" is 4902eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // declared inside a class "B", and class "B" is declared inside 4903eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // a class "A" and class "A" is in a namespace "lldb", and the 4904eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // namespace is in a compile unit, there will be a stack of DIEs: 4905eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // 4906eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // [0] DW_TAG_class_type for "B" 4907eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // [1] DW_TAG_class_type for "A" 4908eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // [2] DW_TAG_namespace for "lldb" 4909eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // [3] DW_TAG_compile_unit for the source file. 4910eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // 4911eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // We grab both contexts and make sure that everything matches 4912eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // all the way back to the compiler unit. 4913eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton 4914eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // First lets grab the decl contexts for both DIEs 4915b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton die1->GetDeclContextDIEs (this, cu1, decl_ctx_1); 49168f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan die2->GetDeclContextDIEs (this, cu2, decl_ctx_2); 4917eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // Make sure the context arrays have the same size, otherwise 4918eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // we are done 4919b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton const size_t count1 = decl_ctx_1.Size(); 4920b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton const size_t count2 = decl_ctx_2.Size(); 4921b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton if (count1 != count2) 4922b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton return false; 4923eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton 4924eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // Make sure the DW_TAG values match all the way back up the the 4925eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // compile unit. If they don't, then we are done. 4926b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton const DWARFDebugInfoEntry *decl_ctx_die1; 4927b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton const DWARFDebugInfoEntry *decl_ctx_die2; 4928b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton size_t i; 4929b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton for (i=0; i<count1; i++) 4930b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton { 4931b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton decl_ctx_die1 = decl_ctx_1.GetDIEPtrAtIndex (i); 4932b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton decl_ctx_die2 = decl_ctx_2.GetDIEPtrAtIndex (i); 4933b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton if (decl_ctx_die1->Tag() != decl_ctx_die2->Tag()) 4934b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton return false; 4935b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton } 4936b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton#if defined LLDB_CONFIGURATION_DEBUG 4937eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton 4938eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // Make sure the top item in the decl context die array is always 4939eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // DW_TAG_compile_unit. If it isn't then something went wrong in 4940eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // the DWARFDebugInfoEntry::GetDeclContextDIEs() function... 4941b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton assert (decl_ctx_1.GetDIEPtrAtIndex (count1 - 1)->Tag() == DW_TAG_compile_unit); 4942eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton 4943b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton#endif 4944b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton // Always skip the compile unit when comparing by only iterating up to 4945eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // "count - 1". Here we compare the names as we go. 4946b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton for (i=0; i<count1 - 1; i++) 4947b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton { 4948b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton decl_ctx_die1 = decl_ctx_1.GetDIEPtrAtIndex (i); 4949b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton decl_ctx_die2 = decl_ctx_2.GetDIEPtrAtIndex (i); 4950b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton const char *name1 = decl_ctx_die1->GetName(this, cu1); 49518f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan const char *name2 = decl_ctx_die2->GetName(this, cu2); 4952b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton // If the string was from a DW_FORM_strp, then the pointer will often 4953b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton // be the same! 49547dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton if (name1 == name2) 49557dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton continue; 49567dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton 49577dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton // Name pointers are not equal, so only compare the strings 49587dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton // if both are not NULL. 49597dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton if (name1 && name2) 4960b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton { 49617dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton // If the strings don't compare, we are done... 49627dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton if (strcmp(name1, name2) != 0) 4963b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton return false; 49647dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton } 49657dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton else 49667dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton { 49677dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton // One name was NULL while the other wasn't 49687dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton return false; 4969b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton } 4970b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton } 4971eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // We made it through all of the checks and the declaration contexts 4972eac62c0514a516436a4be51bf7cdd829b00f25ccGreg Clayton // are equal. 4973b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton return true; 4974b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton} 4975b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton 497695e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton// This function can be used when a DIE is found that is a forward declaration 497795e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton// DIE and we want to try and find a type that has the complete definition. 4978cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton// "cu" and "die" must be from this SymbolFileDWARF 497995e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg ClaytonTypeSP 4980cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg ClaytonSymbolFileDWARF::FindDefinitionTypeForDIE (DWARFCompileUnit* cu, 498100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const DWARFDebugInfoEntry *die, 498200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const ConstString &type_name) 498395e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton{ 498495e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton TypeSP type_sp; 498595e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton 4986cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton#if defined (LLDB_CONFIGURATION_DEBUG) 4987cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // You can't and shouldn't call this function with a compile unit from 4988cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // another SymbolFileDWARF instance. 4989cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton assert (DebugInfo()->ContainsCompileUnit (cu)); 4990cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton#endif 4991cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 4992bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton if (cu == NULL || die == NULL || !type_name) 499395e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton return type_sp; 499495e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton 4995732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton std::string qualified_name; 4996732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton 4997952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_TYPE_COMPLETION|DWARF_LOG_LOOKUPS)); 4998e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton if (log) 4999e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton { 5000e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton die->GetQualifiedName(this, cu, qualified_name); 5001952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 5002e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton "SymbolFileDWARF::FindDefinitionTypeForDIE(die=0x%8.8x (%s), name='%s')", 5003e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton die->GetOffset(), 5004e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton qualified_name.c_str(), 5005e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton type_name.GetCString()); 5006e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton } 5007e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton 500800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton DIEArray die_offsets; 500900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 5010bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_using_apple_tables) 501100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 5012bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_apple_types_ap.get()) 5013bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton { 5014732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton const bool has_tag = m_apple_types_ap->GetHeader().header_data.ContainsAtom (DWARFMappedHash::eAtomTypeTag); 5015732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton const bool has_qualified_name_hash = m_apple_types_ap->GetHeader().header_data.ContainsAtom (DWARFMappedHash::eAtomTypeQualNameHash); 5016732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton if (has_tag && has_qualified_name_hash) 5017732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton { 5018732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton if (qualified_name.empty()) 5019732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton die->GetQualifiedName(this, cu, qualified_name); 5020732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton 5021732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton const uint32_t qualified_name_hash = MappedHash::HashStringUsingDJB (qualified_name.c_str()); 5022732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton if (log) 5023952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log,"FindByNameAndTagAndQualifiedNameHash()"); 5024732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton m_apple_types_ap->FindByNameAndTagAndQualifiedNameHash (type_name.GetCString(), die->Tag(), qualified_name_hash, die_offsets); 5025732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton } 5026732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton else if (has_tag > 1) 502737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton { 5028732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton if (log) 5029952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log,"FindByNameAndTag()"); 5030c80dca73893e5b24f4d16c092da75532715b405eGreg Clayton m_apple_types_ap->FindByNameAndTag (type_name.GetCString(), die->Tag(), die_offsets); 503137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton } 503237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton else 503337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton { 503437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton m_apple_types_ap->FindByName (type_name.GetCString(), die_offsets); 503537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton } 5036bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton } 503700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 503800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton else 503900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 504000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (!m_indexed) 504100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton Index (); 504200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 504300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton m_type_index.Find (type_name, die_offsets); 504400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 504500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 504600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const size_t num_matches = die_offsets.size(); 5047539d945ea975ebbbc5fceb632f7969e0ee55d24bGreg Clayton 5048a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton const dw_tag_t die_tag = die->Tag(); 5049144188bc458a35997d2f2e52206ab69747439073Greg Clayton 5050144188bc458a35997d2f2e52206ab69747439073Greg Clayton DWARFCompileUnit* type_cu = NULL; 5051144188bc458a35997d2f2e52206ab69747439073Greg Clayton const DWARFDebugInfoEntry* type_die = NULL; 5052144188bc458a35997d2f2e52206ab69747439073Greg Clayton if (num_matches) 505395e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton { 5054144188bc458a35997d2f2e52206ab69747439073Greg Clayton DWARFDebugInfo* debug_info = DebugInfo(); 505595e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton for (size_t i=0; i<num_matches; ++i) 505695e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton { 5057144188bc458a35997d2f2e52206ab69747439073Greg Clayton const dw_offset_t die_offset = die_offsets[i]; 5058144188bc458a35997d2f2e52206ab69747439073Greg Clayton type_die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &type_cu); 505995e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton 5060bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (type_die) 506195e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton { 5062a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton bool try_resolving_type = false; 5063a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton 5064a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton // Don't try and resolve the DIE we are looking for with the DIE itself! 5065a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton if (type_die != die) 506695e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton { 5067a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton const dw_tag_t type_die_tag = type_die->Tag(); 5068a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton // Make sure the tags match 5069a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton if (type_die_tag == die_tag) 5070a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton { 5071a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton // The tags match, lets try resolving this type 5072a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton try_resolving_type = true; 5073a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton } 5074a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton else 507595e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton { 5076a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton // The tags don't match, but we need to watch our for a 5077a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton // forward declaration for a struct and ("struct foo") 5078a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton // ends up being a class ("class foo { ... };") or 5079a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton // vice versa. 5080a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton switch (type_die_tag) 5081bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 5082a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton case DW_TAG_class_type: 5083a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton // We had a "class foo", see if we ended up with a "struct foo { ... };" 5084a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton try_resolving_type = (die_tag == DW_TAG_structure_type); 5085a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton break; 5086a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton case DW_TAG_structure_type: 5087a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton // We had a "struct foo", see if we ended up with a "class foo { ... };" 5088a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton try_resolving_type = (die_tag == DW_TAG_class_type); 5089a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton break; 5090a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton default: 5091a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton // Tags don't match, don't event try to resolve 5092a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton // using this type whose name matches.... 5093bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton break; 5094bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 509595e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton } 509695e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton } 5097a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton 5098a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton if (try_resolving_type) 5099a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton { 5100e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton if (log) 5101e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton { 5102e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton std::string qualified_name; 5103e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton type_die->GetQualifiedName(this, cu, qualified_name); 5104952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 5105e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton "SymbolFileDWARF::FindDefinitionTypeForDIE(die=0x%8.8x, name='%s') trying die=0x%8.8x (%s)", 5106e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton die->GetOffset(), 5107e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton type_name.GetCString(), 5108e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton type_die->GetOffset(), 5109e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton qualified_name.c_str()); 5110e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton } 5111e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton 5112b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton // Make sure the decl contexts match all the way up 5113b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton if (DIEDeclContextsMatch(cu, die, type_cu, type_die)) 5114a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton { 5115b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton Type *resolved_type = ResolveType (type_cu, type_die, false); 5116b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton if (resolved_type && resolved_type != DIE_IS_BEING_PARSED) 5117b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton { 51185f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea DEBUG_PRINTF ("resolved 0x%8.8" PRIx64 " (cu 0x%8.8" PRIx64 ") from %s to 0x%8.8" PRIx64 " (cu 0x%8.8" PRIx64 ")\n", 5119b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton MakeUserID(die->GetOffset()), 51200be1edd34ff46e017b1b973c5a57e3de9f613bafGreg Clayton MakeUserID(dwarf_cu->GetOffset()), 5121b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton m_obj_file->GetFileSpec().GetFilename().AsCString(), 5122b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton MakeUserID(type_die->GetOffset()), 5123b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton MakeUserID(type_cu->GetOffset())); 5124b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton 5125b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton m_die_to_type[die] = resolved_type; 5126efa4e22f9e02b77918edc42ad3ec3fad65520970Greg Clayton type_sp = resolved_type->shared_from_this(); 5127b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton break; 5128b88575efac471db9156c731c3e28ad7e6d14b5efGreg Clayton } 5129a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton } 5130a32dc70b583a0d4ea0e95967763606ef28f55d18Greg Clayton } 5131e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton else 5132e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton { 5133e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton if (log) 5134e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton { 5135e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton std::string qualified_name; 5136e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton type_die->GetQualifiedName(this, cu, qualified_name); 5137952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 5138e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton "SymbolFileDWARF::FindDefinitionTypeForDIE(die=0x%8.8x, name='%s') ignoring die=0x%8.8x (%s)", 5139e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton die->GetOffset(), 5140e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton type_name.GetCString(), 5141e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton type_die->GetOffset(), 5142e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton qualified_name.c_str()); 5143e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton } 5144e7cf9c43ee41ba062710e6ee6eb8604cc5ab5665Greg Clayton } 514595e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton } 5146bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton else 5147bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 5148bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (m_using_apple_tables) 5149bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 5150df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n", 5151df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton die_offset, type_name.GetCString()); 5152bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 5153bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 5154bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton 515595e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton } 515695e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton } 515795e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton return type_sp; 515895e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton} 515995e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton 516024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeSP 5161cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg ClaytonSymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &dwarf_decl_ctx) 5162cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton{ 5163cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton TypeSP type_sp; 5164cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5165cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton const uint32_t dwarf_decl_ctx_count = dwarf_decl_ctx.GetSize(); 5166cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (dwarf_decl_ctx_count > 0) 5167cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5168cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton const ConstString type_name(dwarf_decl_ctx[0].name); 5169cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton const dw_tag_t tag = dwarf_decl_ctx[0].tag; 5170cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5171cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (type_name) 5172cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5173952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_TYPE_COMPLETION|DWARF_LOG_LOOKUPS)); 5174cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (log) 5175cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5176952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 5177cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton "SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(tag=%s, qualified-name='%s')", 5178cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton DW_TAG_value_to_name(dwarf_decl_ctx[0].tag), 5179cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton dwarf_decl_ctx.GetQualifiedName()); 5180cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5181cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5182cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton DIEArray die_offsets; 5183cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5184cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (m_using_apple_tables) 5185cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5186cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (m_apple_types_ap.get()) 5187cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5188732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton const bool has_tag = m_apple_types_ap->GetHeader().header_data.ContainsAtom (DWARFMappedHash::eAtomTypeTag); 5189732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton const bool has_qualified_name_hash = m_apple_types_ap->GetHeader().header_data.ContainsAtom (DWARFMappedHash::eAtomTypeQualNameHash); 5190732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton if (has_tag && has_qualified_name_hash) 5191732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton { 5192732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton const char *qualified_name = dwarf_decl_ctx.GetQualifiedName(); 5193732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton const uint32_t qualified_name_hash = MappedHash::HashStringUsingDJB (qualified_name); 5194732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton if (log) 5195952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log,"FindByNameAndTagAndQualifiedNameHash()"); 5196732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton m_apple_types_ap->FindByNameAndTagAndQualifiedNameHash (type_name.GetCString(), tag, qualified_name_hash, die_offsets); 5197732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton } 5198732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton else if (has_tag) 5199cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5200732579b63a2624512812c8e33cc110a1437e49b6Greg Clayton if (log) 5201952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log,"FindByNameAndTag()"); 5202cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton m_apple_types_ap->FindByNameAndTag (type_name.GetCString(), tag, die_offsets); 5203cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5204cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton else 5205cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5206cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton m_apple_types_ap->FindByName (type_name.GetCString(), die_offsets); 5207cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5208cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5209cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5210cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton else 5211cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5212cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (!m_indexed) 5213cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton Index (); 5214cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5215cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton m_type_index.Find (type_name, die_offsets); 5216cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5217cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5218cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton const size_t num_matches = die_offsets.size(); 5219cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5220cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5221cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton DWARFCompileUnit* type_cu = NULL; 5222cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton const DWARFDebugInfoEntry* type_die = NULL; 5223cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (num_matches) 5224cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5225cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton DWARFDebugInfo* debug_info = DebugInfo(); 5226cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton for (size_t i=0; i<num_matches; ++i) 5227cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5228cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton const dw_offset_t die_offset = die_offsets[i]; 5229cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton type_die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &type_cu); 5230cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5231cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (type_die) 5232cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5233cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton bool try_resolving_type = false; 5234cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5235cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // Don't try and resolve the DIE we are looking for with the DIE itself! 5236cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton const dw_tag_t type_tag = type_die->Tag(); 5237cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // Make sure the tags match 5238cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (type_tag == tag) 5239cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5240cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // The tags match, lets try resolving this type 5241cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton try_resolving_type = true; 5242cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5243cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton else 5244cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5245cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // The tags don't match, but we need to watch our for a 5246cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // forward declaration for a struct and ("struct foo") 5247cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // ends up being a class ("class foo { ... };") or 5248cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // vice versa. 5249cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton switch (type_tag) 5250cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5251cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton case DW_TAG_class_type: 5252cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // We had a "class foo", see if we ended up with a "struct foo { ... };" 5253cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton try_resolving_type = (tag == DW_TAG_structure_type); 5254cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton break; 5255cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton case DW_TAG_structure_type: 5256cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // We had a "struct foo", see if we ended up with a "class foo { ... };" 5257cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton try_resolving_type = (tag == DW_TAG_class_type); 5258cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton break; 5259cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton default: 5260cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // Tags don't match, don't event try to resolve 5261cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // using this type whose name matches.... 5262cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton break; 5263cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5264cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5265cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5266cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (try_resolving_type) 5267cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5268cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton DWARFDeclContext type_dwarf_decl_ctx; 5269cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton type_die->GetDWARFDeclContext (this, type_cu, type_dwarf_decl_ctx); 5270cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5271cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (log) 5272cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5273952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 5274cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton "SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(tag=%s, qualified-name='%s') trying die=0x%8.8x (%s)", 5275cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton DW_TAG_value_to_name(dwarf_decl_ctx[0].tag), 5276cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton dwarf_decl_ctx.GetQualifiedName(), 5277cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton type_die->GetOffset(), 5278cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton type_dwarf_decl_ctx.GetQualifiedName()); 5279cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5280cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5281cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton // Make sure the decl contexts match all the way up 5282cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (dwarf_decl_ctx == type_dwarf_decl_ctx) 5283cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5284cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton Type *resolved_type = ResolveType (type_cu, type_die, false); 5285cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (resolved_type && resolved_type != DIE_IS_BEING_PARSED) 5286cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5287cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton type_sp = resolved_type->shared_from_this(); 5288cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton break; 5289cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5290cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5291cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5292cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton else 5293cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5294cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (log) 5295cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5296cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton std::string qualified_name; 5297cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton type_die->GetQualifiedName(this, type_cu, qualified_name); 5298952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 5299cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton "SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(tag=%s, qualified-name='%s') ignoring die=0x%8.8x (%s)", 5300cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton DW_TAG_value_to_name(dwarf_decl_ctx[0].tag), 5301cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton dwarf_decl_ctx.GetQualifiedName(), 5302cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton type_die->GetOffset(), 5303cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton qualified_name.c_str()); 5304cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5305cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5306cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5307cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton else 5308cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5309cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton if (m_using_apple_tables) 5310cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton { 5311cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n", 5312cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton die_offset, type_name.GetCString()); 5313cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5314cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5315cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5316cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5317cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5318cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5319cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton } 5320cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton return type_sp; 5321cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton} 5322cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5323bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Claytonbool 532489a86ef06d0f72468111344aa84d364fe7b32f10Greg ClaytonSymbolFileDWARF::CopyUniqueClassMethodTypes (SymbolFileDWARF *src_symfile, 5325d3beda617568982a0295481551d23f9b42df801dSean Callanan Type *class_type, 5326bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton DWARFCompileUnit* src_cu, 5327bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton const DWARFDebugInfoEntry *src_class_die, 5328bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton DWARFCompileUnit* dst_cu, 5329d3beda617568982a0295481551d23f9b42df801dSean Callanan const DWARFDebugInfoEntry *dst_class_die, 5330d3beda617568982a0295481551d23f9b42df801dSean Callanan llvm::SmallVectorImpl <const DWARFDebugInfoEntry *> &failures) 5331bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton{ 5332bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (!class_type || !src_cu || !src_class_die || !dst_cu || !dst_class_die) 5333bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton return false; 5334bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (src_class_die->Tag() != dst_class_die->Tag()) 5335bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton return false; 5336bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 5337bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton // We need to complete the class type so we can get all of the method types 5338bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton // parsed so we can then unique those types to their equivalent counterparts 5339bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton // in "dst_cu" and "dst_class_die" 5340bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton class_type->GetClangFullType(); 5341bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 5342bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton const DWARFDebugInfoEntry *src_die; 5343bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton const DWARFDebugInfoEntry *dst_die; 5344bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton UniqueCStringMap<const DWARFDebugInfoEntry *> src_name_to_die; 5345bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton UniqueCStringMap<const DWARFDebugInfoEntry *> dst_name_to_die; 5346e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton UniqueCStringMap<const DWARFDebugInfoEntry *> src_name_to_die_artificial; 5347e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton UniqueCStringMap<const DWARFDebugInfoEntry *> dst_name_to_die_artificial; 5348bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton for (src_die = src_class_die->GetFirstChild(); src_die != NULL; src_die = src_die->GetSibling()) 5349bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 5350bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (src_die->Tag() == DW_TAG_subprogram) 5351bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 5352b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton // Make sure this is a declaration and not a concrete instance by looking 5353b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton // for DW_AT_declaration set to 1. Sometimes concrete function instances 5354b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton // are placed inside the class definitions and shouldn't be included in 5355b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton // the list of things are are tracking here. 535689a86ef06d0f72468111344aa84d364fe7b32f10Greg Clayton if (src_die->GetAttributeValueAsUnsigned(src_symfile, src_cu, DW_AT_declaration, 0) == 1) 5357b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton { 535889a86ef06d0f72468111344aa84d364fe7b32f10Greg Clayton const char *src_name = src_die->GetMangledName (src_symfile, src_cu); 5359b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton if (src_name) 5360e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton { 5361e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton ConstString src_const_name(src_name); 536289a86ef06d0f72468111344aa84d364fe7b32f10Greg Clayton if (src_die->GetAttributeValueAsUnsigned(src_symfile, src_cu, DW_AT_artificial, 0)) 5363e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton src_name_to_die_artificial.Append(src_const_name.GetCString(), src_die); 5364e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton else 5365e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton src_name_to_die.Append(src_const_name.GetCString(), src_die); 5366e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton } 5367b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton } 5368bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 5369bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 5370bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton for (dst_die = dst_class_die->GetFirstChild(); dst_die != NULL; dst_die = dst_die->GetSibling()) 5371bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 5372bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (dst_die->Tag() == DW_TAG_subprogram) 5373bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 5374b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton // Make sure this is a declaration and not a concrete instance by looking 5375b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton // for DW_AT_declaration set to 1. Sometimes concrete function instances 5376b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton // are placed inside the class definitions and shouldn't be included in 5377b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton // the list of things are are tracking here. 5378b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton if (dst_die->GetAttributeValueAsUnsigned(this, dst_cu, DW_AT_declaration, 0) == 1) 5379b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton { 5380b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton const char *dst_name = dst_die->GetMangledName (this, dst_cu); 5381b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton if (dst_name) 5382e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton { 5383e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton ConstString dst_const_name(dst_name); 5384e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton if (dst_die->GetAttributeValueAsUnsigned(this, dst_cu, DW_AT_artificial, 0)) 5385e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton dst_name_to_die_artificial.Append(dst_const_name.GetCString(), dst_die); 5386e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton else 5387e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton dst_name_to_die.Append(dst_const_name.GetCString(), dst_die); 5388e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton } 5389b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton } 5390bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 5391bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 5392bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton const uint32_t src_size = src_name_to_die.GetSize (); 5393bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton const uint32_t dst_size = dst_name_to_die.GetSize (); 5394952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO | DWARF_LOG_TYPE_COMPLETION)); 5395d3beda617568982a0295481551d23f9b42df801dSean Callanan 5396d3beda617568982a0295481551d23f9b42df801dSean Callanan // Is everything kosher so we can go through the members at top speed? 5397d3beda617568982a0295481551d23f9b42df801dSean Callanan bool fast_path = true; 5398d3beda617568982a0295481551d23f9b42df801dSean Callanan 5399d3beda617568982a0295481551d23f9b42df801dSean Callanan if (src_size != dst_size) 5400d3beda617568982a0295481551d23f9b42df801dSean Callanan { 5401d3beda617568982a0295481551d23f9b42df801dSean Callanan if (src_size != 0 && dst_size != 0) 5402d3beda617568982a0295481551d23f9b42df801dSean Callanan { 5403d3beda617568982a0295481551d23f9b42df801dSean Callanan if (log) 5404d3beda617568982a0295481551d23f9b42df801dSean Callanan log->Printf("warning: trying to unique class DIE 0x%8.8x to 0x%8.8x, but they didn't have the same size (src=%d, dst=%d)", 5405d3beda617568982a0295481551d23f9b42df801dSean Callanan src_class_die->GetOffset(), 5406d3beda617568982a0295481551d23f9b42df801dSean Callanan dst_class_die->GetOffset(), 5407d3beda617568982a0295481551d23f9b42df801dSean Callanan src_size, 5408d3beda617568982a0295481551d23f9b42df801dSean Callanan dst_size); 5409d3beda617568982a0295481551d23f9b42df801dSean Callanan } 5410d3beda617568982a0295481551d23f9b42df801dSean Callanan 5411d3beda617568982a0295481551d23f9b42df801dSean Callanan fast_path = false; 5412d3beda617568982a0295481551d23f9b42df801dSean Callanan } 5413d3beda617568982a0295481551d23f9b42df801dSean Callanan 5414d3beda617568982a0295481551d23f9b42df801dSean Callanan uint32_t idx; 5415bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 5416d3beda617568982a0295481551d23f9b42df801dSean Callanan if (fast_path) 5417bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 5418bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton for (idx = 0; idx < src_size; ++idx) 5419bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 5420bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton src_die = src_name_to_die.GetValueAtIndexUnchecked (idx); 5421bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton dst_die = dst_name_to_die.GetValueAtIndexUnchecked (idx); 5422bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 5423bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (src_die->Tag() != dst_die->Tag()) 5424bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 5425bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (log) 5426bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton log->Printf("warning: tried to unique class DIE 0x%8.8x to 0x%8.8x, but 0x%8.8x (%s) tags didn't match 0x%8.8x (%s)", 5427bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton src_class_die->GetOffset(), 5428bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton dst_class_die->GetOffset(), 5429bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton src_die->GetOffset(), 5430bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton DW_TAG_value_to_name(src_die->Tag()), 5431bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton dst_die->GetOffset(), 5432bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton DW_TAG_value_to_name(src_die->Tag())); 5433d3beda617568982a0295481551d23f9b42df801dSean Callanan fast_path = false; 5434bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 5435bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 543689a86ef06d0f72468111344aa84d364fe7b32f10Greg Clayton const char *src_name = src_die->GetMangledName (src_symfile, src_cu); 5437bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton const char *dst_name = dst_die->GetMangledName (this, dst_cu); 5438bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 5439bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton // Make sure the names match 5440bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (src_name == dst_name || (strcmp (src_name, dst_name) == 0)) 5441bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton continue; 5442bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 5443bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (log) 5444bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton log->Printf("warning: tried to unique class DIE 0x%8.8x to 0x%8.8x, but 0x%8.8x (%s) names didn't match 0x%8.8x (%s)", 5445bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton src_class_die->GetOffset(), 5446bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton dst_class_die->GetOffset(), 5447bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton src_die->GetOffset(), 5448bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton src_name, 5449bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton dst_die->GetOffset(), 5450bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton dst_name); 5451bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 5452d3beda617568982a0295481551d23f9b42df801dSean Callanan fast_path = false; 5453bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 5454d3beda617568982a0295481551d23f9b42df801dSean Callanan } 5455bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 5456d3beda617568982a0295481551d23f9b42df801dSean Callanan // Now do the work of linking the DeclContexts and Types. 5457d3beda617568982a0295481551d23f9b42df801dSean Callanan if (fast_path) 5458d3beda617568982a0295481551d23f9b42df801dSean Callanan { 5459d3beda617568982a0295481551d23f9b42df801dSean Callanan // We can do this quickly. Just run across the tables index-for-index since 5460d3beda617568982a0295481551d23f9b42df801dSean Callanan // we know each node has matching names and tags. 5461bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton for (idx = 0; idx < src_size; ++idx) 5462bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 5463bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton src_die = src_name_to_die.GetValueAtIndexUnchecked (idx); 5464bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton dst_die = dst_name_to_die.GetValueAtIndexUnchecked (idx); 5465bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 546689a86ef06d0f72468111344aa84d364fe7b32f10Greg Clayton clang::DeclContext *src_decl_ctx = src_symfile->m_die_to_decl_ctx[src_die]; 5467bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (src_decl_ctx) 5468bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 5469bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (log) 5470e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton log->Printf ("uniquing decl context %p from 0x%8.8x for 0x%8.8x", src_decl_ctx, src_die->GetOffset(), dst_die->GetOffset()); 5471bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton LinkDeclContextToDIE (src_decl_ctx, dst_die); 5472bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 5473bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton else 5474bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 5475bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (log) 5476e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton log->Printf ("warning: tried to unique decl context from 0x%8.8x for 0x%8.8x, but none was found", src_die->GetOffset(), dst_die->GetOffset()); 5477bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 5478bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 5479bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton Type *src_child_type = m_die_to_type[src_die]; 5480bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (src_child_type) 5481bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 5482bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (log) 54835f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("uniquing type %p (uid=0x%" PRIx64 ") from 0x%8.8x for 0x%8.8x", src_child_type, src_child_type->GetID(), src_die->GetOffset(), dst_die->GetOffset()); 5484bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton m_die_to_type[dst_die] = src_child_type; 5485bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 5486bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton else 5487bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 5488bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (log) 5489e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton log->Printf ("warning: tried to unique lldb_private::Type from 0x%8.8x for 0x%8.8x, but none was found", src_die->GetOffset(), dst_die->GetOffset()); 5490e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton } 5491e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton } 5492d3beda617568982a0295481551d23f9b42df801dSean Callanan } 5493d3beda617568982a0295481551d23f9b42df801dSean Callanan else 5494d3beda617568982a0295481551d23f9b42df801dSean Callanan { 5495d3beda617568982a0295481551d23f9b42df801dSean Callanan // We must do this slowly. For each member of the destination, look 5496d3beda617568982a0295481551d23f9b42df801dSean Callanan // up a member in the source with the same name, check its tag, and 5497d3beda617568982a0295481551d23f9b42df801dSean Callanan // unique them if everything matches up. Report failures. 5498e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton 5499d3beda617568982a0295481551d23f9b42df801dSean Callanan if (!src_name_to_die.IsEmpty() && !dst_name_to_die.IsEmpty()) 5500d3beda617568982a0295481551d23f9b42df801dSean Callanan { 5501d3beda617568982a0295481551d23f9b42df801dSean Callanan src_name_to_die.Sort(); 5502e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton 5503d3beda617568982a0295481551d23f9b42df801dSean Callanan for (idx = 0; idx < dst_size; ++idx) 5504d3beda617568982a0295481551d23f9b42df801dSean Callanan { 5505d3beda617568982a0295481551d23f9b42df801dSean Callanan const char *dst_name = dst_name_to_die.GetCStringAtIndex(idx); 5506d3beda617568982a0295481551d23f9b42df801dSean Callanan dst_die = dst_name_to_die.GetValueAtIndexUnchecked(idx); 5507d3beda617568982a0295481551d23f9b42df801dSean Callanan src_die = src_name_to_die.Find(dst_name, NULL); 5508d3beda617568982a0295481551d23f9b42df801dSean Callanan 5509d3beda617568982a0295481551d23f9b42df801dSean Callanan if (src_die && (src_die->Tag() == dst_die->Tag())) 5510d3beda617568982a0295481551d23f9b42df801dSean Callanan { 551189a86ef06d0f72468111344aa84d364fe7b32f10Greg Clayton clang::DeclContext *src_decl_ctx = src_symfile->m_die_to_decl_ctx[src_die]; 5512d3beda617568982a0295481551d23f9b42df801dSean Callanan if (src_decl_ctx) 5513d3beda617568982a0295481551d23f9b42df801dSean Callanan { 5514d3beda617568982a0295481551d23f9b42df801dSean Callanan if (log) 5515d3beda617568982a0295481551d23f9b42df801dSean Callanan log->Printf ("uniquing decl context %p from 0x%8.8x for 0x%8.8x", src_decl_ctx, src_die->GetOffset(), dst_die->GetOffset()); 5516d3beda617568982a0295481551d23f9b42df801dSean Callanan LinkDeclContextToDIE (src_decl_ctx, dst_die); 5517d3beda617568982a0295481551d23f9b42df801dSean Callanan } 5518d3beda617568982a0295481551d23f9b42df801dSean Callanan else 5519d3beda617568982a0295481551d23f9b42df801dSean Callanan { 5520d3beda617568982a0295481551d23f9b42df801dSean Callanan if (log) 5521d3beda617568982a0295481551d23f9b42df801dSean Callanan log->Printf ("warning: tried to unique decl context from 0x%8.8x for 0x%8.8x, but none was found", src_die->GetOffset(), dst_die->GetOffset()); 5522d3beda617568982a0295481551d23f9b42df801dSean Callanan } 5523d3beda617568982a0295481551d23f9b42df801dSean Callanan 5524d3beda617568982a0295481551d23f9b42df801dSean Callanan Type *src_child_type = m_die_to_type[src_die]; 5525d3beda617568982a0295481551d23f9b42df801dSean Callanan if (src_child_type) 5526d3beda617568982a0295481551d23f9b42df801dSean Callanan { 5527d3beda617568982a0295481551d23f9b42df801dSean Callanan if (log) 5528d3beda617568982a0295481551d23f9b42df801dSean Callanan log->Printf ("uniquing type %p (uid=0x%" PRIx64 ") from 0x%8.8x for 0x%8.8x", src_child_type, src_child_type->GetID(), src_die->GetOffset(), dst_die->GetOffset()); 5529d3beda617568982a0295481551d23f9b42df801dSean Callanan m_die_to_type[dst_die] = src_child_type; 5530d3beda617568982a0295481551d23f9b42df801dSean Callanan } 5531d3beda617568982a0295481551d23f9b42df801dSean Callanan else 5532d3beda617568982a0295481551d23f9b42df801dSean Callanan { 5533d3beda617568982a0295481551d23f9b42df801dSean Callanan if (log) 5534d3beda617568982a0295481551d23f9b42df801dSean Callanan log->Printf ("warning: tried to unique lldb_private::Type from 0x%8.8x for 0x%8.8x, but none was found", src_die->GetOffset(), dst_die->GetOffset()); 5535d3beda617568982a0295481551d23f9b42df801dSean Callanan } 5536d3beda617568982a0295481551d23f9b42df801dSean Callanan } 5537d3beda617568982a0295481551d23f9b42df801dSean Callanan else 5538d3beda617568982a0295481551d23f9b42df801dSean Callanan { 5539d3beda617568982a0295481551d23f9b42df801dSean Callanan if (log) 5540d3beda617568982a0295481551d23f9b42df801dSean Callanan log->Printf ("warning: couldn't find a match for 0x%8.8x", dst_die->GetOffset()); 5541e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton 5542d3beda617568982a0295481551d23f9b42df801dSean Callanan failures.push_back(dst_die); 5543d3beda617568982a0295481551d23f9b42df801dSean Callanan } 5544d3beda617568982a0295481551d23f9b42df801dSean Callanan } 5545d3beda617568982a0295481551d23f9b42df801dSean Callanan } 5546d3beda617568982a0295481551d23f9b42df801dSean Callanan } 5547d3beda617568982a0295481551d23f9b42df801dSean Callanan 5548d3beda617568982a0295481551d23f9b42df801dSean Callanan const uint32_t src_size_artificial = src_name_to_die_artificial.GetSize (); 5549d3beda617568982a0295481551d23f9b42df801dSean Callanan const uint32_t dst_size_artificial = dst_name_to_die_artificial.GetSize (); 5550d3beda617568982a0295481551d23f9b42df801dSean Callanan 5551d3beda617568982a0295481551d23f9b42df801dSean Callanan UniqueCStringMap<const DWARFDebugInfoEntry *> name_to_die_artificial_not_in_src; 5552d3beda617568982a0295481551d23f9b42df801dSean Callanan 5553d3beda617568982a0295481551d23f9b42df801dSean Callanan if (src_size_artificial && dst_size_artificial) 5554d3beda617568982a0295481551d23f9b42df801dSean Callanan { 5555d3beda617568982a0295481551d23f9b42df801dSean Callanan dst_name_to_die_artificial.Sort(); 5556d3beda617568982a0295481551d23f9b42df801dSean Callanan 5557e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton for (idx = 0; idx < src_size_artificial; ++idx) 5558e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton { 5559e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton const char *src_name_artificial = src_name_to_die_artificial.GetCStringAtIndex(idx); 5560e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton src_die = src_name_to_die_artificial.GetValueAtIndexUnchecked (idx); 5561e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton dst_die = dst_name_to_die_artificial.Find(src_name_artificial, NULL); 5562e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton 5563e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton if (dst_die) 5564e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton { 5565e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton // Both classes have the artificial types, link them 5566e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton clang::DeclContext *src_decl_ctx = m_die_to_decl_ctx[src_die]; 5567e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton if (src_decl_ctx) 5568e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton { 5569e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton if (log) 5570e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton log->Printf ("uniquing decl context %p from 0x%8.8x for 0x%8.8x", src_decl_ctx, src_die->GetOffset(), dst_die->GetOffset()); 5571e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton LinkDeclContextToDIE (src_decl_ctx, dst_die); 5572e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton } 5573e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton else 5574e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton { 5575e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton if (log) 5576e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton log->Printf ("warning: tried to unique decl context from 0x%8.8x for 0x%8.8x, but none was found", src_die->GetOffset(), dst_die->GetOffset()); 5577e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton } 5578e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton 5579e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton Type *src_child_type = m_die_to_type[src_die]; 5580e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton if (src_child_type) 5581e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton { 5582e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton if (log) 55835f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("uniquing type %p (uid=0x%" PRIx64 ") from 0x%8.8x for 0x%8.8x", src_child_type, src_child_type->GetID(), src_die->GetOffset(), dst_die->GetOffset()); 5584e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton m_die_to_type[dst_die] = src_child_type; 5585e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton } 5586e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton else 5587e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton { 5588e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton if (log) 5589e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton log->Printf ("warning: tried to unique lldb_private::Type from 0x%8.8x for 0x%8.8x, but none was found", src_die->GetOffset(), dst_die->GetOffset()); 5590e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton } 5591e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton } 5592e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton } 5593d3beda617568982a0295481551d23f9b42df801dSean Callanan } 5594e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton 5595d3beda617568982a0295481551d23f9b42df801dSean Callanan if (dst_size_artificial) 5596d3beda617568982a0295481551d23f9b42df801dSean Callanan { 5597d3beda617568982a0295481551d23f9b42df801dSean Callanan for (idx = 0; idx < dst_size_artificial; ++idx) 5598e727b87cb85f75ff1a6d56010c4390ccaa8152a9Greg Clayton { 5599d3beda617568982a0295481551d23f9b42df801dSean Callanan const char *dst_name_artificial = dst_name_to_die_artificial.GetCStringAtIndex(idx); 5600d3beda617568982a0295481551d23f9b42df801dSean Callanan dst_die = dst_name_to_die_artificial.GetValueAtIndexUnchecked (idx); 5601d3beda617568982a0295481551d23f9b42df801dSean Callanan if (log) 5602d3beda617568982a0295481551d23f9b42df801dSean Callanan log->Printf ("warning: need to create artificial method for 0x%8.8x for method '%s'", dst_die->GetOffset(), dst_name_artificial); 5603d3beda617568982a0295481551d23f9b42df801dSean Callanan 5604d3beda617568982a0295481551d23f9b42df801dSean Callanan failures.push_back(dst_die); 5605bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 5606bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 5607d3beda617568982a0295481551d23f9b42df801dSean Callanan 5608d3beda617568982a0295481551d23f9b42df801dSean Callanan return (failures.size() != 0); 5609bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton} 5610cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 5611cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg ClaytonTypeSP 5612462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonSymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die, bool *type_is_new_ptr) 561324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 561424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeSP type_sp; 561524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5616462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (type_is_new_ptr) 5617462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton *type_is_new_ptr = false; 5618e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton 5619e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton#if defined(LLDB_CONFIGURATION_DEBUG) or defined(LLDB_CONFIGURATION_RELEASE) 5620e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton static DIEStack g_die_stack; 5621e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton DIEStack::ScopedPopper scoped_die_logger(g_die_stack); 5622e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton#endif 5623462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 562470a4f92d0e5f605c8ed1662fa959d465c96b0fb9Sean Callanan AccessType accessibility = eAccessNone; 562524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (die != NULL) 562624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5627952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO)); 5628d7fc5b8d107b3df44acfcc694f26875e06c1b4e0Greg Clayton if (log) 56298f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan { 56308f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan const DWARFDebugInfoEntry *context_die; 56318f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan clang::DeclContext *context = GetClangDeclContextContainingDIE (dwarf_cu, die, &context_die); 56328f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 5633952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x, decl_ctx = %p (die 0x%8.8x)) %s name = '%s')", 56348f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan die->GetOffset(), 56358f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan context, 56368f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan context_die->GetOffset(), 5637d7fc5b8d107b3df44acfcc694f26875e06c1b4e0Greg Clayton DW_TAG_value_to_name(die->Tag()), 5638e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton die->GetName(this, dwarf_cu)); 5639e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton 5640e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton#if defined(LLDB_CONFIGURATION_DEBUG) or defined(LLDB_CONFIGURATION_RELEASE) 5641e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton scoped_die_logger.Push (dwarf_cu, die); 5642952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton g_die_stack.LogDIEs(log, this); 5643e7a8e4621a0b74997ad564a9288800f752208dabGreg Clayton#endif 56448f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan } 5645d7fc5b8d107b3df44acfcc694f26875e06c1b4e0Greg Clayton// 5646952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton// Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO)); 5647d7fc5b8d107b3df44acfcc694f26875e06c1b4e0Greg Clayton// if (log && dwarf_cu) 5648d7fc5b8d107b3df44acfcc694f26875e06c1b4e0Greg Clayton// { 5649d7fc5b8d107b3df44acfcc694f26875e06c1b4e0Greg Clayton// StreamString s; 5650d7fc5b8d107b3df44acfcc694f26875e06c1b4e0Greg Clayton// die->DumpLocation (this, dwarf_cu, s); 5651952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton// GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDwarf::%s %s", __FUNCTION__, s.GetData()); 5652d7fc5b8d107b3df44acfcc694f26875e06c1b4e0Greg Clayton// 5653d7fc5b8d107b3df44acfcc694f26875e06c1b4e0Greg Clayton// } 56549ecdaac6b0b2d3c6f9ec498fb94cbdeeee153ee7Jim Ingham 56554fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton Type *type_ptr = m_die_to_type.lookup (die); 5656e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton TypeList* type_list = GetTypeList(); 56574fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton if (type_ptr == NULL) 565824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5659e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton ClangASTContext &ast = GetClangASTContext(); 5660462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (type_is_new_ptr) 5661462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton *type_is_new_ptr = true; 566224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56634fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton const dw_tag_t tag = die->Tag(); 56644fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton 566524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_forward_declaration = false; 566624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::Attributes attributes; 566724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *type_name_cstr = NULL; 5668fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton ConstString type_name_const_str; 56696916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton Type::ResolveState resolve_state = Type::eResolveStateUnresolved; 5670fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton uint64_t byte_size = 0; 56716916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton Declaration decl; 56726916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 56734b40711e7950310afb74835820eb669004cd8c44Greg Clayton Type::EncodingDataType encoding_data_type = Type::eEncodingIsUID; 567452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type; 567524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 567624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_attr_t attr; 567724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 567824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (tag) 567924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 568024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_base_type: 568124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_pointer_type: 568224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_reference_type: 568357e0ff42f10d1245f9e8d5b3418d5066aea6ea05Sean Callanan case DW_TAG_rvalue_reference_type: 568424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_typedef: 568524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_const_type: 568624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_restrict_type: 568724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_volatile_type: 568818fedd7f4d22cf46d34698c1094ebc544a6f8bd8Greg Clayton case DW_TAG_unspecified_type: 568924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 569024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set a bit that lets us know that we are currently parsing this 56914fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton m_die_to_type[die] = DIE_IS_BEING_PARSED; 569224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56935fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); 569424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t encoding = 0; 569524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t encoding_uid = LLDB_INVALID_UID; 569624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 569724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_attributes > 0) 569824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 569924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 570024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_attributes; ++i) 570124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 570224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner attr = attributes.AttributeAtIndex(i); 570324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFFormValue form_value; 570424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 570524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 570624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (attr) 570724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 570824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 570924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 571024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 571124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_name: 571287a58ce764030f37ed674577cbb900f42c677824Jim Ingham 571324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner type_name_cstr = form_value.AsCString(&get_debug_str_data()); 571487a58ce764030f37ed674577cbb900f42c677824Jim Ingham // Work around a bug in llvm-gcc where they give a name to a reference type which doesn't 571587a58ce764030f37ed674577cbb900f42c677824Jim Ingham // include the "&"... 571687a58ce764030f37ed674577cbb900f42c677824Jim Ingham if (tag == DW_TAG_reference_type) 571787a58ce764030f37ed674577cbb900f42c677824Jim Ingham { 571887a58ce764030f37ed674577cbb900f42c677824Jim Ingham if (strchr (type_name_cstr, '&') == NULL) 571987a58ce764030f37ed674577cbb900f42c677824Jim Ingham type_name_cstr = NULL; 572087a58ce764030f37ed674577cbb900f42c677824Jim Ingham } 572187a58ce764030f37ed674577cbb900f42c677824Jim Ingham if (type_name_cstr) 572287a58ce764030f37ed674577cbb900f42c677824Jim Ingham type_name_const_str.SetCString(type_name_cstr); 572324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 57244a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_AT_byte_size: byte_size = form_value.Unsigned(); break; 572524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_encoding: encoding = form_value.Unsigned(); break; 572624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_type: encoding_uid = form_value.Reference(dwarf_cu); break; 572724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 572824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_sibling: 572924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 573024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 573124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 573224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 573324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 573424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57355f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\") type => 0x%8.8x\n", MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr, encoding_uid); 5736b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton 573724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (tag) 573824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 573924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 57406916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton break; 57416916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 574218fedd7f4d22cf46d34698c1094ebc544a6f8bd8Greg Clayton case DW_TAG_unspecified_type: 574349409a5f463bd7dca9d8c400b9271b1534bcfcfbGreg Clayton if (strcmp(type_name_cstr, "nullptr_t") == 0 || 574449409a5f463bd7dca9d8c400b9271b1534bcfcfbGreg Clayton strcmp(type_name_cstr, "decltype(nullptr)") == 0 ) 574518fedd7f4d22cf46d34698c1094ebc544a6f8bd8Greg Clayton { 574618fedd7f4d22cf46d34698c1094ebc544a6f8bd8Greg Clayton resolve_state = Type::eResolveStateFull; 574752f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type = ast.GetBasicType(eBasicTypeNullPtr); 574818fedd7f4d22cf46d34698c1094ebc544a6f8bd8Greg Clayton break; 574918fedd7f4d22cf46d34698c1094ebc544a6f8bd8Greg Clayton } 575018fedd7f4d22cf46d34698c1094ebc544a6f8bd8Greg Clayton // Fall through to base type below in case we can handle the type there... 575118fedd7f4d22cf46d34698c1094ebc544a6f8bd8Greg Clayton 575224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_base_type: 57536916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton resolve_state = Type::eResolveStateFull; 5754e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton clang_type = ast.GetBuiltinTypeForDWARFEncodingAndBitSize (type_name_cstr, 5755e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton encoding, 5756e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton byte_size * 8); 575724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 575824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 575957e0ff42f10d1245f9e8d5b3418d5066aea6ea05Sean Callanan case DW_TAG_pointer_type: encoding_data_type = Type::eEncodingIsPointerUID; break; 576057e0ff42f10d1245f9e8d5b3418d5066aea6ea05Sean Callanan case DW_TAG_reference_type: encoding_data_type = Type::eEncodingIsLValueReferenceUID; break; 576157e0ff42f10d1245f9e8d5b3418d5066aea6ea05Sean Callanan case DW_TAG_rvalue_reference_type: encoding_data_type = Type::eEncodingIsRValueReferenceUID; break; 576257e0ff42f10d1245f9e8d5b3418d5066aea6ea05Sean Callanan case DW_TAG_typedef: encoding_data_type = Type::eEncodingIsTypedefUID; break; 576357e0ff42f10d1245f9e8d5b3418d5066aea6ea05Sean Callanan case DW_TAG_const_type: encoding_data_type = Type::eEncodingIsConstUID; break; 576457e0ff42f10d1245f9e8d5b3418d5066aea6ea05Sean Callanan case DW_TAG_restrict_type: encoding_data_type = Type::eEncodingIsRestrictUID; break; 576557e0ff42f10d1245f9e8d5b3418d5066aea6ea05Sean Callanan case DW_TAG_volatile_type: encoding_data_type = Type::eEncodingIsVolatileUID; break; 576624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 576724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 576852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!clang_type && (encoding_data_type == Type::eEncodingIsPointerUID || encoding_data_type == Type::eEncodingIsTypedefUID) && sc.comp_unit != NULL) 5769960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 5770aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan bool translation_unit_is_objc = (sc.comp_unit->GetLanguage() == eLanguageTypeObjC || sc.comp_unit->GetLanguage() == eLanguageTypeObjC_plus_plus); 5771aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan 5772aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan if (translation_unit_is_objc) 5773960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 5774aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan if (type_name_cstr != NULL) 5775e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 5776aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan static ConstString g_objc_type_name_id("id"); 5777aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan static ConstString g_objc_type_name_Class("Class"); 5778aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan static ConstString g_objc_type_name_selector("SEL"); 5779aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan 5780aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan if (type_name_const_str == g_objc_type_name_id) 5781aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan { 5782aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan if (log) 5783952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is Objective C 'id' built-in type.", 5784aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan die->GetOffset(), 5785aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan DW_TAG_value_to_name(die->Tag()), 5786aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan die->GetName(this, dwarf_cu)); 578752f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type = ast.GetBasicType(eBasicTypeObjCID); 5788aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan encoding_data_type = Type::eEncodingIsUID; 5789aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan encoding_uid = LLDB_INVALID_UID; 5790aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan resolve_state = Type::eResolveStateFull; 57916916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 5792aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan } 5793aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan else if (type_name_const_str == g_objc_type_name_Class) 5794aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan { 5795aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan if (log) 5796952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is Objective C 'Class' built-in type.", 5797aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan die->GetOffset(), 5798aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan DW_TAG_value_to_name(die->Tag()), 5799aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan die->GetName(this, dwarf_cu)); 580052f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type = ast.GetBasicType(eBasicTypeObjCClass); 5801aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan encoding_data_type = Type::eEncodingIsUID; 5802aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan encoding_uid = LLDB_INVALID_UID; 5803aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan resolve_state = Type::eResolveStateFull; 5804aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan } 5805aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan else if (type_name_const_str == g_objc_type_name_selector) 5806aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan { 5807aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan if (log) 5808952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is Objective C 'selector' built-in type.", 5809aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan die->GetOffset(), 5810aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan DW_TAG_value_to_name(die->Tag()), 5811aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan die->GetName(this, dwarf_cu)); 581252f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type = ast.GetBasicType(eBasicTypeObjCSel); 5813aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan encoding_data_type = Type::eEncodingIsUID; 5814aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan encoding_uid = LLDB_INVALID_UID; 5815aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan resolve_state = Type::eResolveStateFull; 5816aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan } 5817e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 5818aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan else if (encoding_data_type == Type::eEncodingIsPointerUID && encoding_uid != LLDB_INVALID_UID) 5819e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 5820aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan // Clang sometimes erroneously emits id as objc_object*. In that case we fix up the type to "id". 5821aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan 5822aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan DWARFDebugInfoEntry* encoding_die = dwarf_cu->GetDIEPtr(encoding_uid); 5823aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan 5824aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan if (encoding_die && encoding_die->Tag() == DW_TAG_structure_type) 5825aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan { 5826aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan if (const char *struct_name = encoding_die->GetAttributeValueAsString(this, dwarf_cu, DW_AT_name, NULL)) 5827aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan { 5828aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan if (!strcmp(struct_name, "objc_object")) 5829aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan { 5830aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan if (log) 5831952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is 'objc_object*', which we overrode to 'id'.", 5832aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan die->GetOffset(), 5833aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan DW_TAG_value_to_name(die->Tag()), 5834aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan die->GetName(this, dwarf_cu)); 583552f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type = ast.GetBasicType(eBasicTypeObjCID); 5836aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan encoding_data_type = Type::eEncodingIsUID; 5837aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan encoding_uid = LLDB_INVALID_UID; 5838aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan resolve_state = Type::eResolveStateFull; 5839aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan } 5840aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan } 5841aadc7f7df57ab1883ca7aa0da792c57611f2f49fSean Callanan } 5842e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 5843960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 5844960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 5845960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 5846444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton type_sp.reset( new Type (MakeUserID(die->GetOffset()), 5847e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton this, 5848e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton type_name_const_str, 5849e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton byte_size, 5850e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton NULL, 5851e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton encoding_uid, 5852e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton encoding_data_type, 5853e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton &decl, 5854e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton clang_type, 58556916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton resolve_state)); 5856e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton 58574fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton m_die_to_type[die] = type_sp.get(); 585824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 585924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Type* encoding_type = GetUniquedTypeForDIEOffset(encoding_uid, type_sp, NULL, 0, 0, false); 586024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (encoding_type != NULL) 586124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 586224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (encoding_type != DIE_IS_BEING_PARSED) 586324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// type_sp->SetEncodingType(encoding_type); 586424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else 586524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// m_indirect_fixups.push_back(type_sp.get()); 586624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 586724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 586824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 586924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 587024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_structure_type: 587124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_union_type: 587224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_class_type: 587324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 587424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set a bit that lets us know that we are currently parsing this 58754fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton m_die_to_type[die] = DIE_IS_BEING_PARSED; 58764a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton bool byte_size_valid = false; 587724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton LanguageType class_language = eLanguageTypeUnknown; 5879f332c536533a9663bd7f0c2f43203b750b511f39Greg Clayton bool is_complete_objc_class = false; 588024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //bool struct_is_class = false; 58815fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); 588224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_attributes > 0) 588324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 588424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 588524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_attributes; ++i) 588624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 588724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner attr = attributes.AttributeAtIndex(i); 588824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFFormValue form_value; 588924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 589024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 589124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (attr) 589224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 58939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case DW_AT_decl_file: 5894e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton if (dwarf_cu->DW_AT_decl_file_attributes_are_invalid()) 5895e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 5896e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton // llvm-gcc outputs invalid DW_AT_decl_file attributes that always 5897e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton // point to the compile unit file, so we clear this invalid value 5898e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton // so that we can still unique types efficiently. 5899e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton decl.SetFile(FileSpec ("<invalid>", false)); 5900e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 5901e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton else 5902e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); 59039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 59049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 59059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case DW_AT_decl_line: 59069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton decl.SetLine(form_value.Unsigned()); 59079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 59089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 59099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case DW_AT_decl_column: 59109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton decl.SetColumn(form_value.Unsigned()); 59119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 59129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 591324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_name: 591424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner type_name_cstr = form_value.AsCString(&get_debug_str_data()); 5915fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton type_name_const_str.SetCString(type_name_cstr); 591624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 59179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 59189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case DW_AT_byte_size: 59199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton byte_size = form_value.Unsigned(); 5920f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton byte_size_valid = true; 59219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 59229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 59239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case DW_AT_accessibility: 59249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); 59259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 59269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 59279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case DW_AT_declaration: 5928f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton is_forward_declaration = form_value.Boolean(); 59299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 59309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 59319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case DW_AT_APPLE_runtime_class: 59329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_language = (LanguageType)form_value.Signed(); 59339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 59349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 5935f332c536533a9663bd7f0c2f43203b750b511f39Greg Clayton case DW_AT_APPLE_objc_complete_type: 5936f332c536533a9663bd7f0c2f43203b750b511f39Greg Clayton is_complete_objc_class = form_value.Signed(); 5937f332c536533a9663bd7f0c2f43203b750b511f39Greg Clayton break; 5938f332c536533a9663bd7f0c2f43203b750b511f39Greg Clayton 593924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_allocated: 594024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_associated: 594124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_data_location: 594224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_description: 594324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_start_scope: 594424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_visibility: 594524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 594624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_sibling: 594724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 594824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 594924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 595024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 595124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 595224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5953a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton UniqueDWARFASTType unique_ast_entry; 5954361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan 5955c613a8923ce0a457e34e830daf90eb517a655dacGreg Clayton // Only try and unique the type if it has a name. 5956c613a8923ce0a457e34e830daf90eb517a655dacGreg Clayton if (type_name_const_str && 5957c613a8923ce0a457e34e830daf90eb517a655dacGreg Clayton GetUniqueDWARFASTTypeMap().Find (type_name_const_str, 5958361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan this, 5959361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan dwarf_cu, 5960361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan die, 5961361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan decl, 5962361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan byte_size_valid ? byte_size : -1, 5963361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan unique_ast_entry)) 596424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5965361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan // We have already parsed this type or from another 5966361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan // compile unit. GCC loves to use the "one definition 5967361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan // rule" which can result in multiple definitions 5968361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan // of the same class over and over in each compile 5969361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan // unit. 5970361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan type_sp = unique_ast_entry.m_type_sp; 5971361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan if (type_sp) 597257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton { 5973361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan m_die_to_type[die] = type_sp.get(); 5974361c0f849dfdd66ea5b5cbf3010d95a0882f269eSean Callanan return type_sp; 597552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 5976a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton } 5977a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton 59785f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr); 597924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5980a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton int tag_decl_kind = -1; 5981a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton AccessType default_accessibility = eAccessNone; 5982a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton if (tag == DW_TAG_structure_type) 5983a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton { 5984a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton tag_decl_kind = clang::TTK_Struct; 5985a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton default_accessibility = eAccessPublic; 5986a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton } 5987a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton else if (tag == DW_TAG_union_type) 5988a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton { 5989a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton tag_decl_kind = clang::TTK_Union; 5990a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton default_accessibility = eAccessPublic; 5991a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton } 5992a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton else if (tag == DW_TAG_class_type) 5993a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton { 5994a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton tag_decl_kind = clang::TTK_Class; 5995a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton default_accessibility = eAccessPrivate; 5996a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton } 5997d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton 5998d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton if (byte_size_valid && byte_size == 0 && type_name_cstr && 5999d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton die->HasChildren() == false && 6000d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton sc.comp_unit->GetLanguage() == eLanguageTypeObjC) 6001d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton { 6002d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton // Work around an issue with clang at the moment where 6003d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton // forward declarations for objective C classes are emitted 6004d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton // as: 6005d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton // DW_TAG_structure_type [2] 6006d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton // DW_AT_name( "ForwardObjcClass" ) 6007d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton // DW_AT_byte_size( 0x00 ) 6008d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton // DW_AT_decl_file( "..." ) 6009d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton // DW_AT_decl_line( 1 ) 6010d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton // 6011d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton // Note that there is no DW_AT_declaration and there are 6012d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton // no children, and the byte size is zero. 6013d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton is_forward_declaration = true; 6014d37ffd975faf5ac305dbf176e2a171b1b0f1600fGreg Clayton } 601552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton 601649749a79b8f5299bbe4b727ea6399001ddd9bb2dSean Callanan if (class_language == eLanguageTypeObjC || 601749749a79b8f5299bbe4b727ea6399001ddd9bb2dSean Callanan class_language == eLanguageTypeObjC_plus_plus) 6018f332c536533a9663bd7f0c2f43203b750b511f39Greg Clayton { 6019e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton if (!is_complete_objc_class && Supports_DW_AT_APPLE_objc_complete_type(dwarf_cu)) 602077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 602177917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton // We have a valid eSymbolTypeObjCClass class symbol whose 602277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton // name matches the current objective C class that we 602377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton // are trying to find and this DIE isn't the complete 602477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton // definition (we checked is_complete_objc_class above and 602577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton // know it is false), so the real definition is in here somewhere 6026e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton type_sp = FindCompleteObjCDefinitionTypeForDIE (die, type_name_const_str, true); 602777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 602849ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (!type_sp && GetDebugMapSymfile ()) 602977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 603077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton // We weren't able to find a full declaration in 603177917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton // this DWARF, see if we have a declaration anywhere 603277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton // else... 6033e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton type_sp = m_debug_map_symfile->FindCompleteObjCDefinitionTypeForDIE (die, type_name_const_str, true); 603477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 603577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 603677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (type_sp) 603777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 603877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (log) 603977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 6040952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 60415f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea "SymbolFileDWARF(%p) - 0x%8.8x: %s type \"%s\" is an incomplete objc type, complete type is 0x%8.8" PRIx64, 6042df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton this, 6043df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton die->GetOffset(), 6044df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton DW_TAG_value_to_name(tag), 6045df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton type_name_cstr, 6046df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton type_sp->GetID()); 604777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 604877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 604977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton // We found a real definition for this type elsewhere 605077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton // so lets use it and cache the fact that we found 605177917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton // a complete type for this die 605277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton m_die_to_type[die] = type_sp.get(); 605377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton return type_sp; 605477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 605577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 6056f332c536533a9663bd7f0c2f43203b750b511f39Greg Clayton } 605777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 605852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton 605977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (is_forward_declaration) 6060a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton { 6061a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // We have a forward declaration to a type and we need 6062a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // to try and find a full declaration. We look in the 6063a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // current type index just in case we have a forward 6064a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // declaration followed by an actual declarations in the 6065a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // DWARF. If this fails, we need to look elsewhere... 606675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (log) 606775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 6068952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 6069df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton "SymbolFileDWARF(%p) - 0x%8.8x: %s type \"%s\" is a forward declaration, trying to find complete type", 6070df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton this, 6071df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton die->GetOffset(), 6072df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton DW_TAG_value_to_name(tag), 6073df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton type_name_cstr); 607475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 6075a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton 6076cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton DWARFDeclContext die_decl_ctx; 6077cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton die->GetDWARFDeclContext(this, dwarf_cu, die_decl_ctx); 6078cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton 6079cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton //type_sp = FindDefinitionTypeForDIE (dwarf_cu, die, type_name_const_str); 6080cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton type_sp = FindDefinitionTypeForDWARFDeclContext (die_decl_ctx); 6081a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton 608249ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (!type_sp && GetDebugMapSymfile ()) 608352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 6084a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // We weren't able to find a full declaration in 6085a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // this DWARF, see if we have a declaration anywhere 6086a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // else... 6087cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton type_sp = m_debug_map_symfile->FindDefinitionTypeForDWARFDeclContext (die_decl_ctx); 608852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 6089a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton 6090a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton if (type_sp) 609152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 609275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (log) 609375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 6094952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 60955f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea "SymbolFileDWARF(%p) - 0x%8.8x: %s type \"%s\" is a forward declaration, complete type is 0x%8.8" PRIx64, 6096df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton this, 6097df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton die->GetOffset(), 6098df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton DW_TAG_value_to_name(tag), 6099df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton type_name_cstr, 6100df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton type_sp->GetID()); 610175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 610275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 6103a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // We found a real definition for this type elsewhere 6104a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // so lets use it and cache the fact that we found 6105a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // a complete type for this die 6106a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton m_die_to_type[die] = type_sp.get(); 6107a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton return type_sp; 610852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 6109462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 6110a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton assert (tag_decl_kind != -1); 6111a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton bool clang_type_was_created = false; 611252f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.SetClangType(ast.getASTContext(), m_forward_decl_die_to_clang_type.lookup (die)); 611352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!clang_type) 6114a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton { 6115caffddc39bf640bb1fce58b0cc5791d6c42dce28Sean Callanan const DWARFDebugInfoEntry *decl_ctx_die; 6116caffddc39bf640bb1fce58b0cc5791d6c42dce28Sean Callanan 6117caffddc39bf640bb1fce58b0cc5791d6c42dce28Sean Callanan clang::DeclContext *decl_ctx = GetClangDeclContextContainingDIE (dwarf_cu, die, &decl_ctx_die); 61185e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton if (accessibility == eAccessNone && decl_ctx) 61195e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton { 61205e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton // Check the decl context that contains this class/struct/union. 61215e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton // If it is a class we must give it an accessability. 61225e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton const clang::Decl::Kind containing_decl_kind = decl_ctx->getDeclKind(); 61235e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton if (DeclKindIsCXXClass (containing_decl_kind)) 61245e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton accessibility = default_accessibility; 61255e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton } 61265e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton 61279c09181404cc35f65d5353231246959135fb7684Greg Clayton ClangASTMetadata metadata; 61289c09181404cc35f65d5353231246959135fb7684Greg Clayton metadata.SetUserID(MakeUserID(die->GetOffset())); 61299c09181404cc35f65d5353231246959135fb7684Greg Clayton metadata.SetIsDynamicCXXType(ClassOrStructIsVirtual (dwarf_cu, die)); 61309c09181404cc35f65d5353231246959135fb7684Greg Clayton 6131f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton if (type_name_cstr && strchr (type_name_cstr, '<')) 6132f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton { 6133f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton ClangASTContext::TemplateParameterInfos template_param_infos; 6134f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton if (ParseTemplateParameterInfos (dwarf_cu, die, template_param_infos)) 6135f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton { 6136f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton clang::ClassTemplateDecl *class_template_decl = ParseClassTemplateDecl (decl_ctx, 61375e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton accessibility, 6138f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton type_name_cstr, 6139f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton tag_decl_kind, 6140f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton template_param_infos); 6141f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton 6142f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton clang::ClassTemplateSpecializationDecl *class_specialization_decl = ast.CreateClassTemplateSpecializationDecl (decl_ctx, 6143f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton class_template_decl, 6144f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton tag_decl_kind, 6145f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton template_param_infos); 6146f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton clang_type = ast.CreateClassTemplateSpecializationType (class_specialization_decl); 6147f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton clang_type_was_created = true; 6148fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan 6149017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton GetClangASTContext().SetMetadata (class_template_decl, metadata); 6150017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton GetClangASTContext().SetMetadata (class_specialization_decl, metadata); 6151f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton } 6152f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton } 6153f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton 6154f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton if (!clang_type_was_created) 6155f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton { 6156f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton clang_type_was_created = true; 61575e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton clang_type = ast.CreateRecordType (decl_ctx, 61585e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton accessibility, 61595e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton type_name_cstr, 6160f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton tag_decl_kind, 6161fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan class_language, 6162a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham &metadata); 6163f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton } 6164a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton } 6165a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton 6166a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // Store a forward declaration to this class type in case any 6167a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // parameters in any class methods need it for the clang 6168e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton // types for function prototypes. 616952f792329be5db8e38961350589e97e8f2823acdGreg Clayton LinkDeclContextToDIE(clang_type.GetDeclContextForType(), die); 6170444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton type_sp.reset (new Type (MakeUserID(die->GetOffset()), 6171a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton this, 6172a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton type_name_const_str, 6173a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton byte_size, 6174a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton NULL, 6175a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton LLDB_INVALID_UID, 6176a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton Type::eEncodingIsUID, 6177a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton &decl, 6178a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton clang_type, 6179a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton Type::eResolveStateForward)); 6180931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 6181931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan type_sp->SetIsCompleteObjCClass(is_complete_objc_class); 6182a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton 6183a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton 6184a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // Add our type to the unique type map so we don't 6185a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // end up creating many copies of the same type over 6186a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // and over in the ASTContext for our module 6187a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton unique_ast_entry.m_type_sp = type_sp; 6188f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton unique_ast_entry.m_symfile = this; 6189f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton unique_ast_entry.m_cu = dwarf_cu; 6190a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton unique_ast_entry.m_die = die; 6191a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton unique_ast_entry.m_declaration = decl; 6192f4cbc323e33dd6f3f4379d174c953c7f05baadb9Sean Callanan unique_ast_entry.m_byte_size = byte_size; 6193c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton GetUniqueDWARFASTTypeMap().Insert (type_name_const_str, 6194c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton unique_ast_entry); 6195a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton 6196b2027ec7cc8c15dfdc7c945dc6aed4b5d684321eSean Callanan if (!is_forward_declaration) 61973356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton { 61983356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton // Always start the definition for a class type so that 61993356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton // if the class has child classes or types that require 62003356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton // the class to be created for use as their decl contexts 62013356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton // the class will be ready to accept these child definitions. 6202b2027ec7cc8c15dfdc7c945dc6aed4b5d684321eSean Callanan if (die->HasChildren() == false) 6203b2027ec7cc8c15dfdc7c945dc6aed4b5d684321eSean Callanan { 6204b2027ec7cc8c15dfdc7c945dc6aed4b5d684321eSean Callanan // No children for this struct/union/class, lets finish it 620552f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.StartTagDeclarationDefinition (); 620652f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.CompleteTagDeclarationDefinition (); 6207c7e570897429c442bb835becdb6cfac48de38694Sean Callanan 6208c7e570897429c442bb835becdb6cfac48de38694Sean Callanan if (tag == DW_TAG_structure_type) // this only applies in C 6209c7e570897429c442bb835becdb6cfac48de38694Sean Callanan { 621052f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::RecordDecl *record_decl = clang_type.GetAsRecordDecl(); 6211c7e570897429c442bb835becdb6cfac48de38694Sean Callanan 621252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (record_decl) 6213c7e570897429c442bb835becdb6cfac48de38694Sean Callanan { 621452f792329be5db8e38961350589e97e8f2823acdGreg Clayton LayoutInfo layout_info; 6215c7e570897429c442bb835becdb6cfac48de38694Sean Callanan 621652f792329be5db8e38961350589e97e8f2823acdGreg Clayton layout_info.alignment = 0; 621752f792329be5db8e38961350589e97e8f2823acdGreg Clayton layout_info.bit_size = 0; 621852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 621952f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_record_decl_to_layout_map.insert(std::make_pair(record_decl, layout_info)); 6220c7e570897429c442bb835becdb6cfac48de38694Sean Callanan } 6221c7e570897429c442bb835becdb6cfac48de38694Sean Callanan } 6222b2027ec7cc8c15dfdc7c945dc6aed4b5d684321eSean Callanan } 6223b2027ec7cc8c15dfdc7c945dc6aed4b5d684321eSean Callanan else if (clang_type_was_created) 6224b2027ec7cc8c15dfdc7c945dc6aed4b5d684321eSean Callanan { 62253356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton // Start the definition if the class is not objective C since 62263356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton // the underlying decls respond to isCompleteDefinition(). Objective 62273356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton // C decls dont' respond to isCompleteDefinition() so we can't 62283356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton // start the declaration definition right away. For C++ classs/union/structs 62293356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton // we want to start the definition in case the class is needed as the 62303356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton // declaration context for a contained class or type without the need 62313356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton // to complete that type.. 62323356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton 623349749a79b8f5299bbe4b727ea6399001ddd9bb2dSean Callanan if (class_language != eLanguageTypeObjC && 623449749a79b8f5299bbe4b727ea6399001ddd9bb2dSean Callanan class_language != eLanguageTypeObjC_plus_plus) 623552f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.StartTagDeclarationDefinition (); 62363356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton 6237b2027ec7cc8c15dfdc7c945dc6aed4b5d684321eSean Callanan // Leave this as a forward declaration until we need 6238b2027ec7cc8c15dfdc7c945dc6aed4b5d684321eSean Callanan // to know the details of the type. lldb_private::Type 6239b2027ec7cc8c15dfdc7c945dc6aed4b5d684321eSean Callanan // will automatically call the SymbolFile virtual function 6240b2027ec7cc8c15dfdc7c945dc6aed4b5d684321eSean Callanan // "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition(Type *)" 6241b2027ec7cc8c15dfdc7c945dc6aed4b5d684321eSean Callanan // When the definition needs to be defined. 624252f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_forward_decl_die_to_clang_type[die] = clang_type.GetOpaqueQualType(); 624352f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_forward_decl_clang_type_to_die[clang_type.RemoveFastQualifiers().GetOpaqueQualType()] = die; 624452f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.SetHasExternalStorage (true); 6245b2027ec7cc8c15dfdc7c945dc6aed4b5d684321eSean Callanan } 6246a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton } 6247d7088cf9454164ce3a54e345a2c0a07bc1015335Greg Clayton 624824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 624924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 625024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 625124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_enumeration_type: 625224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 625324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set a bit that lets us know that we are currently parsing this 62544fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton m_die_to_type[die] = DIE_IS_BEING_PARSED; 625524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 625624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t encoding_uid = DW_INVALID_OFFSET; 625724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62585fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); 625924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_attributes > 0) 626024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 626124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 626224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 626324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_attributes; ++i) 626424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 626524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner attr = attributes.AttributeAtIndex(i); 626624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFFormValue form_value; 626724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 626824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 626924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (attr) 627024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6271e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 6272e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 6273e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 627424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_name: 627524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner type_name_cstr = form_value.AsCString(&get_debug_str_data()); 6276fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton type_name_const_str.SetCString(type_name_cstr); 627724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 6278e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton case DW_AT_type: encoding_uid = form_value.Reference(dwarf_cu); break; 62794a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_AT_byte_size: byte_size = form_value.Unsigned(); break; 62804a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_AT_accessibility: break; //accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break; 6281f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton case DW_AT_declaration: break; //is_forward_declaration = form_value.Boolean(); break; 628224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_allocated: 628324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_associated: 628424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_bit_stride: 628524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_byte_stride: 628624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_data_location: 628724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_description: 628824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_start_scope: 628924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_visibility: 629024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_specification: 629124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_abstract_origin: 629224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_sibling: 629324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 629424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 629524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 629624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 629724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62985f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr); 6299b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton 630052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType enumerator_clang_type; 630152f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.SetClangType (ast.getASTContext(), m_forward_decl_die_to_clang_type.lookup (die)); 630252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!clang_type) 6303462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 6304d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton if (encoding_uid != DW_INVALID_OFFSET) 6305d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton { 6306d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton Type *enumerator_type = ResolveTypeUID(encoding_uid); 6307d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton if (enumerator_type) 6308d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton enumerator_clang_type = enumerator_type->GetClangFullType(); 6309d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton } 6310d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton 631152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!enumerator_clang_type) 6312d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton enumerator_clang_type = ast.GetBuiltinTypeForDWARFEncodingAndBitSize (NULL, 6313d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton DW_ATE_signed, 6314d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton byte_size * 8); 6315d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton 63160d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton clang_type = ast.CreateEnumerationType (type_name_cstr, 631703fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton GetClangDeclContextContainingDIE (dwarf_cu, die, NULL), 63180d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton decl, 6319e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton enumerator_clang_type); 6320462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 6321462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton else 6322462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 632352f792329be5db8e38961350589e97e8f2823acdGreg Clayton enumerator_clang_type = clang_type.GetEnumerationIntegerType (); 6324462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 6325462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 632652f792329be5db8e38961350589e97e8f2823acdGreg Clayton LinkDeclContextToDIE(clang_type.GetDeclContextForType(), die); 6327e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 6328444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton type_sp.reset( new Type (MakeUserID(die->GetOffset()), 6329e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton this, 6330e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton type_name_const_str, 6331e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton byte_size, 6332e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton NULL, 6333e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton encoding_uid, 6334e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton Type::eEncodingIsUID, 6335e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton &decl, 6336e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton clang_type, 63376916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton Type::eResolveStateForward)); 633824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 633952f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.StartTagDeclarationDefinition (); 6340b01000fd063629facd45044f137446fb748ee179Greg Clayton if (die->HasChildren()) 6341b01000fd063629facd45044f137446fb748ee179Greg Clayton { 6342bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton SymbolContext cu_sc(GetCompUnitForDWARFCompUnit(dwarf_cu)); 6343d5e48bd4029b47cd298fd065429bb3a350a08324Greg Clayton bool is_signed = false; 634452f792329be5db8e38961350589e97e8f2823acdGreg Clayton enumerator_clang_type.IsIntegerType(is_signed); 6345d5e48bd4029b47cd298fd065429bb3a350a08324Greg Clayton ParseChildEnumerators(cu_sc, clang_type, is_signed, type_sp->GetByteSize(), dwarf_cu, die); 6346b01000fd063629facd45044f137446fb748ee179Greg Clayton } 634752f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.CompleteTagDeclarationDefinition (); 634824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 634924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 635024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 635124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63520007dfff776edec41a108a57d0a0924b1068977bJim Ingham case DW_TAG_inlined_subroutine: 635324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_subprogram: 635424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_subroutine_type: 635524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 635624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set a bit that lets us know that we are currently parsing this 63574fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton m_die_to_type[die] = DIE_IS_BEING_PARSED; 635824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63594a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton //const char *mangled = NULL; 636024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_offset_t type_die_offset = DW_INVALID_OFFSET; 6361412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton bool is_variadic = false; 636224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_inline = false; 63631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_static = false; 63641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_virtual = false; 636530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_explicit = false; 63662581dbf7292c6272bb771fe396ab30921385d669Sean Callanan bool is_artificial = false; 63676c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton dw_offset_t specification_die_offset = DW_INVALID_OFFSET; 63686c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton dw_offset_t abstract_origin_die_offset = DW_INVALID_OFFSET; 6369a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham dw_offset_t object_pointer_die_offset = DW_INVALID_OFFSET; 63701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 637124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unsigned type_quals = 0; 637247a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan clang::StorageClass storage = clang::SC_None;//, Extern, Static, PrivateExtern 637324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 637424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63755fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); 637624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_attributes > 0) 637724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 637824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 637924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_attributes; ++i) 638024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6381bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton attr = attributes.AttributeAtIndex(i); 638224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFFormValue form_value; 638324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 638424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 638524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (attr) 638624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 638724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 638824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 638924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 639024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_name: 639124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner type_name_cstr = form_value.AsCString(&get_debug_str_data()); 6392fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton type_name_const_str.SetCString(type_name_cstr); 639324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 639424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63956f3a711edcfaeca1efbb998cdea5d0a0782ddfa3Greg Clayton case DW_AT_linkage_name: 63964a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_AT_MIPS_linkage_name: break; // mangled = form_value.AsCString(&get_debug_str_data()); break; 639724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_type: type_die_offset = form_value.Reference(dwarf_cu); break; 639884f8075072eef306234f8109573067647735c111Greg Clayton case DW_AT_accessibility: accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break; 6399f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton case DW_AT_declaration: break; // is_forward_declaration = form_value.Boolean(); break; 6400f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton case DW_AT_inline: is_inline = form_value.Boolean(); break; 6401f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton case DW_AT_virtuality: is_virtual = form_value.Boolean(); break; 6402f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton case DW_AT_explicit: is_explicit = form_value.Boolean(); break; 6403f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton case DW_AT_artificial: is_artificial = form_value.Boolean(); break; 64042581dbf7292c6272bb771fe396ab30921385d669Sean Callanan 640530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 640624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_external: 640724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (form_value.Unsigned()) 640824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 640947a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan if (storage == clang::SC_None) 641047a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan storage = clang::SC_Extern; 641124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 641247a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan storage = clang::SC_PrivateExtern; 641324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 641424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 641524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64166c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton case DW_AT_specification: 64176c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton specification_die_offset = form_value.Reference(dwarf_cu); 64186c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton break; 64196c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton 64206c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton case DW_AT_abstract_origin: 64216c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton abstract_origin_die_offset = form_value.Reference(dwarf_cu); 64226c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton break; 64236c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton 6424a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham case DW_AT_object_pointer: 6425a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham object_pointer_die_offset = form_value.Reference(dwarf_cu); 6426a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham break; 6427a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham 642824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_allocated: 642924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_associated: 643024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_address_class: 643124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_calling_convention: 643224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_data_location: 643324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_elemental: 643424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_entry_pc: 643524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_frame_base: 643624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_high_pc: 643724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_low_pc: 643824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_prototyped: 643924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_pure: 644024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_ranges: 644124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_recursive: 644224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_return_addr: 644324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_segment: 644424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_start_scope: 644524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_static_link: 644624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_trampoline: 644724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_visibility: 644824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_vtable_elem_location: 644924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_description: 645024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_sibling: 645124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 645224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 645324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 645424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6455fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton } 645624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6457a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham std::string object_pointer_name; 6458a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham if (object_pointer_die_offset != DW_INVALID_OFFSET) 6459a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham { 6460a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham // Get the name from the object pointer die 6461a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham StreamString s; 6462a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham if (DWARFDebugInfoEntry::GetName (this, dwarf_cu, object_pointer_die_offset, s)) 6463a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham { 6464a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham object_pointer_name.assign(s.GetData()); 6465a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham } 6466a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham } 6467a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham 64685f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr); 6469b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton 647052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType return_clang_type; 6471fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton Type *func_type = NULL; 6472fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton 6473fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton if (type_die_offset != DW_INVALID_OFFSET) 6474fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton func_type = ResolveTypeUID(type_die_offset); 647530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 6476fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton if (func_type) 6477bcb0adc2d1d32baa111c0a11eded0e2b4fbef383Greg Clayton return_clang_type = func_type->GetClangForwardType(); 6478fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton else 647952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return_clang_type = ast.GetBasicType(eBasicTypeVoid); 648024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 648130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 648252f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::vector<ClangASTType> function_param_types; 6483fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton std::vector<clang::ParmVarDecl*> function_param_decls; 648424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6485fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton // Parse the function children for the parameters 648699309909259eacf4693458bfe44f913c316a09c6Sean Callanan 648703fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton const DWARFDebugInfoEntry *decl_ctx_die = NULL; 648803fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIE (dwarf_cu, die, &decl_ctx_die); 6489c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton const clang::Decl::Kind containing_decl_kind = containing_decl_ctx->getDeclKind(); 6490c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton 6491f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton const bool is_cxx_method = DeclKindIsCXXClass (containing_decl_kind); 6492c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton // Start off static. This will be set to false in ParseChildParameters(...) 6493c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton // if we find a "this" paramters as the first parameter 6494c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton if (is_cxx_method) 649599309909259eacf4693458bfe44f913c316a09c6Sean Callanan is_static = true; 6496b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton ClangASTContext::TemplateParameterInfos template_param_infos; 6497b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton 6498fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton if (die->HasChildren()) 6499fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton { 65001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool skip_artificial = true; 6501a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham ParseChildParameters (sc, 6502c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton containing_decl_ctx, 6503a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham dwarf_cu, 6504a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham die, 650599309909259eacf4693458bfe44f913c316a09c6Sean Callanan skip_artificial, 650699309909259eacf4693458bfe44f913c316a09c6Sean Callanan is_static, 6507a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham type_list, 6508a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham function_param_types, 65092403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton function_param_decls, 6510b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton type_quals, 6511b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton template_param_infos); 6512fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton } 651324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6514fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton // clang_type will get the function prototype clang type after this call 6515e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton clang_type = ast.CreateFunctionType (return_clang_type, 65164756b6747228a7905719c48a47bb1191504b7e53Greg Clayton function_param_types.data(), 6517e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton function_param_types.size(), 6518e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton is_variadic, 6519e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton type_quals); 6520e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton 65219d3587012e5077ab416ecb8e688fd6fbcab71bcaSean Callanan bool ignore_containing_context = false; 65229d3587012e5077ab416ecb8e688fd6fbcab71bcaSean Callanan 6523fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton if (type_name_cstr) 6524fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton { 6525fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton bool type_handled = false; 6526fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton if (tag == DW_TAG_subprogram) 652724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6528f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton ObjCLanguageRuntime::MethodName objc_method (type_name_cstr, true); 6529f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton if (objc_method.IsValid(true)) 65301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 6531fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton SymbolContext empty_sc; 653252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType class_opaque_type; 6533f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton ConstString class_name(objc_method.GetClassName()); 6534445c086e19b9d8e26f3bc0eae1cd475d9d7ec5b1Greg Clayton if (class_name) 65351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 6536fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton TypeList types; 6537e14d3d3209f4260acc6e84d656460d5bdeade2c2Greg Clayton TypeSP complete_objc_class_type_sp (FindCompleteObjCDefinitionTypeForDIE (NULL, class_name, false)); 6538e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton 6539e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton if (complete_objc_class_type_sp) 65401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 654152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType type_clang_forward_type = complete_objc_class_type_sp->GetClangForwardType(); 654252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (type_clang_forward_type.IsObjCObjectOrInterfaceType ()) 6543e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton class_opaque_type = type_clang_forward_type; 65441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 6545fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton } 65461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 6547fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton if (class_opaque_type) 6548fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton { 6549fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton // If accessibility isn't set to anything valid, assume public for 6550fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton // now... 6551fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton if (accessibility == eAccessNone) 6552fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton accessibility = eAccessPublic; 6553fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton 655452f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::ObjCMethodDecl *objc_method_decl = class_opaque_type.AddMethodToObjCObjectType (type_name_cstr, 655552f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type, 655652f792329be5db8e38961350589e97e8f2823acdGreg Clayton accessibility, 655752f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_artificial); 6558fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton type_handled = objc_method_decl != NULL; 6559b4ba18e32369ea22ea57b9dac454684fcab266f3Sean Callanan if (type_handled) 6560b4ba18e32369ea22ea57b9dac454684fcab266f3Sean Callanan { 6561b4ba18e32369ea22ea57b9dac454684fcab266f3Sean Callanan LinkDeclContextToDIE(ClangASTContext::GetAsDeclContext(objc_method_decl), die); 6562017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton GetClangASTContext().SetMetadataAsUserID (objc_method_decl, MakeUserID(die->GetOffset())); 6563b4ba18e32369ea22ea57b9dac454684fcab266f3Sean Callanan } 65644a58456ee1ac2b38f7e11dc04760f86afd2d80caSean Callanan else 65654a58456ee1ac2b38f7e11dc04760f86afd2d80caSean Callanan { 6566e2f06c36775360a53013fdbc94c3fd8da5b874f5Jason Molenda GetObjectFile()->GetModule()->ReportError ("{0x%8.8x}: invalid Objective-C method 0x%4.4x (%s), please file a bug and attach the file at the start of this error message", 65674a58456ee1ac2b38f7e11dc04760f86afd2d80caSean Callanan die->GetOffset(), 65684a58456ee1ac2b38f7e11dc04760f86afd2d80caSean Callanan tag, 65694a58456ee1ac2b38f7e11dc04760f86afd2d80caSean Callanan DW_TAG_value_to_name(tag)); 65704a58456ee1ac2b38f7e11dc04760f86afd2d80caSean Callanan } 6571fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton } 6572fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton } 6573c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton else if (is_cxx_method) 6574fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton { 6575fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton // Look at the parent of this DIE and see if is is 6576fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton // a class or struct and see if this is actually a 6577fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton // C++ method 657803fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton Type *class_type = ResolveType (dwarf_cu, decl_ctx_die); 6579fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton if (class_type) 6580fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton { 6581bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (class_type->GetID() != MakeUserID(decl_ctx_die->GetOffset())) 6582bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 6583bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton // We uniqued the parent class of this function to another class 6584bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton // so we now need to associate all dies under "decl_ctx_die" to 6585bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton // DIEs in the DIE for "class_type"... 658689a86ef06d0f72468111344aa84d364fe7b32f10Greg Clayton SymbolFileDWARF *class_symfile = NULL; 6587bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton DWARFCompileUnitSP class_type_cu_sp; 658889a86ef06d0f72468111344aa84d364fe7b32f10Greg Clayton const DWARFDebugInfoEntry *class_type_die = NULL; 6589d3beda617568982a0295481551d23f9b42df801dSean Callanan 6590d3beda617568982a0295481551d23f9b42df801dSean Callanan SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile(); 6591d3beda617568982a0295481551d23f9b42df801dSean Callanan if (debug_map_symfile) 6592d3beda617568982a0295481551d23f9b42df801dSean Callanan { 6593d3beda617568982a0295481551d23f9b42df801dSean Callanan class_symfile = debug_map_symfile->GetSymbolFileByOSOIndex(SymbolFileDWARFDebugMap::GetOSOIndexFromUserID(class_type->GetID())); 6594d3beda617568982a0295481551d23f9b42df801dSean Callanan class_type_die = class_symfile->DebugInfo()->GetDIEPtr(class_type->GetID(), &class_type_cu_sp); 6595d3beda617568982a0295481551d23f9b42df801dSean Callanan } 6596d3beda617568982a0295481551d23f9b42df801dSean Callanan else 6597d3beda617568982a0295481551d23f9b42df801dSean Callanan { 6598d3beda617568982a0295481551d23f9b42df801dSean Callanan class_symfile = this; 6599d3beda617568982a0295481551d23f9b42df801dSean Callanan class_type_die = DebugInfo()->GetDIEPtr(class_type->GetID(), &class_type_cu_sp); 6600d3beda617568982a0295481551d23f9b42df801dSean Callanan } 6601bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton if (class_type_die) 6602bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 6603d3beda617568982a0295481551d23f9b42df801dSean Callanan llvm::SmallVector<const DWARFDebugInfoEntry *, 0> failures; 6604d3beda617568982a0295481551d23f9b42df801dSean Callanan 6605d3beda617568982a0295481551d23f9b42df801dSean Callanan CopyUniqueClassMethodTypes (class_symfile, 6606d3beda617568982a0295481551d23f9b42df801dSean Callanan class_type, 6607d3beda617568982a0295481551d23f9b42df801dSean Callanan class_type_cu_sp.get(), 6608d3beda617568982a0295481551d23f9b42df801dSean Callanan class_type_die, 6609d3beda617568982a0295481551d23f9b42df801dSean Callanan dwarf_cu, 6610d3beda617568982a0295481551d23f9b42df801dSean Callanan decl_ctx_die, 6611d3beda617568982a0295481551d23f9b42df801dSean Callanan failures); 6612d3beda617568982a0295481551d23f9b42df801dSean Callanan 6613d3beda617568982a0295481551d23f9b42df801dSean Callanan // FIXME do something with these failures that's smarter than 6614d3beda617568982a0295481551d23f9b42df801dSean Callanan // just dropping them on the ground. Unfortunately classes don't 6615d3beda617568982a0295481551d23f9b42df801dSean Callanan // like having stuff added to them after their definitions are 6616d3beda617568982a0295481551d23f9b42df801dSean Callanan // complete... 6617d3beda617568982a0295481551d23f9b42df801dSean Callanan 6618d3beda617568982a0295481551d23f9b42df801dSean Callanan type_ptr = m_die_to_type[die]; 6619d3beda617568982a0295481551d23f9b42df801dSean Callanan if (type_ptr && type_ptr != DIE_IS_BEING_PARSED) 6620bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 6621d3beda617568982a0295481551d23f9b42df801dSean Callanan type_sp = type_ptr->shared_from_this(); 6622d3beda617568982a0295481551d23f9b42df801dSean Callanan break; 6623bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 6624bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 6625bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 6626bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 66276c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton if (specification_die_offset != DW_INVALID_OFFSET) 66281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 6629b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton // We have a specification which we are going to base our function 6630b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton // prototype off of, so we need this type to be completed so that the 6631b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton // m_die_to_decl_ctx for the method in the specification has a valid 6632b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton // clang decl context. 6633e367aa81e7b6da12d57ceec96bd34c5df51d0468Greg Clayton class_type->GetClangForwardType(); 66346c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton // If we have a specification, then the function type should have been 66356c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton // made with the specification and not with this die. 66366c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton DWARFCompileUnitSP spec_cu_sp; 66376c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton const DWARFDebugInfoEntry* spec_die = DebugInfo()->GetDIEPtr(specification_die_offset, &spec_cu_sp); 66389ff34285e9658d948711077e9c265883b1425880Eric Christopher clang::DeclContext *spec_clang_decl_ctx = GetClangDeclContextForDIE (sc, dwarf_cu, spec_die); 6639b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton if (spec_clang_decl_ctx) 6640b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton { 6641b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton LinkDeclContextToDIE(spec_clang_decl_ctx, die); 6642b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton } 6643b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton else 664490b207927e95187f36afb32caf90867d56fc0a03Jim Ingham { 66455f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea GetObjectFile()->GetModule()->ReportWarning ("0x%8.8" PRIx64 ": DW_AT_specification(0x%8.8x) has no decl\n", 6646df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton MakeUserID(die->GetOffset()), 6647df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton specification_die_offset); 664890b207927e95187f36afb32caf90867d56fc0a03Jim Ingham } 66496c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton type_handled = true; 66506c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton } 66516c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton else if (abstract_origin_die_offset != DW_INVALID_OFFSET) 66526c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton { 6653b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton // We have a specification which we are going to base our function 6654b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton // prototype off of, so we need this type to be completed so that the 6655b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton // m_die_to_decl_ctx for the method in the abstract origin has a valid 6656b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton // clang decl context. 6657e367aa81e7b6da12d57ceec96bd34c5df51d0468Greg Clayton class_type->GetClangForwardType(); 6658b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton 66596c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton DWARFCompileUnitSP abs_cu_sp; 66606c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton const DWARFDebugInfoEntry* abs_die = DebugInfo()->GetDIEPtr(abstract_origin_die_offset, &abs_cu_sp); 66619ff34285e9658d948711077e9c265883b1425880Eric Christopher clang::DeclContext *abs_clang_decl_ctx = GetClangDeclContextForDIE (sc, dwarf_cu, abs_die); 6662b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton if (abs_clang_decl_ctx) 6663b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton { 6664b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton LinkDeclContextToDIE (abs_clang_decl_ctx, die); 6665b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton } 6666b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton else 666790b207927e95187f36afb32caf90867d56fc0a03Jim Ingham { 66685f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea GetObjectFile()->GetModule()->ReportWarning ("0x%8.8" PRIx64 ": DW_AT_abstract_origin(0x%8.8x) has no decl\n", 6669df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton MakeUserID(die->GetOffset()), 6670df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton abstract_origin_die_offset); 667190b207927e95187f36afb32caf90867d56fc0a03Jim Ingham } 66726c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton type_handled = true; 66736c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton } 66746c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton else 66756c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton { 667652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType class_opaque_type = class_type->GetClangForwardType(); 667752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_opaque_type.IsCXXClassType ()) 667828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 667952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_opaque_type.IsBeingDefined ()) 66806c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton { 66819f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // Neither GCC 4.2 nor clang++ currently set a valid accessibility 66829f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // in the DWARF for C++ methods... Default to public for now... 66839f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton if (accessibility == eAccessNone) 66849f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton accessibility = eAccessPublic; 66859f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton 66869f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton if (!is_static && !die->HasChildren()) 66879f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton { 66889f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // We have a C++ member function with no children (this pointer!) 66899f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // and clang will get mad if we try and make a function that isn't 66909f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // well formed in the DWARF, so we will just skip it... 66919f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton type_handled = true; 66929f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton } 66939f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton else 66949f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton { 66959f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton clang::CXXMethodDecl *cxx_method_decl; 66969f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // REMOVE THE CRASH DESCRIPTION BELOW 669797a19b21dacd9063bb5475812df7781777262198Greg Clayton Host::SetCrashDescriptionWithFormat ("SymbolFileDWARF::ParseType() is adding a method %s to class %s in DIE 0x%8.8" PRIx64 " from %s", 66989f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton type_name_cstr, 66999f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton class_type->GetName().GetCString(), 6700444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton MakeUserID(die->GetOffset()), 670197a19b21dacd9063bb5475812df7781777262198Greg Clayton m_obj_file->GetFileSpec().GetPath().c_str()); 67029f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton 6703716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan const bool is_attr_used = false; 6704716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan 670552f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_method_decl = class_opaque_type.AddMethodToCXXRecordType (type_name_cstr, 670652f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type, 670752f792329be5db8e38961350589e97e8f2823acdGreg Clayton accessibility, 670852f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_virtual, 670952f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_static, 671052f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_inline, 671152f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_explicit, 671252f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_attr_used, 671352f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_artificial); 6714fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan 6715c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan type_handled = cxx_method_decl != NULL; 6716c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan 6717c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan if (type_handled) 6718a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham { 6719c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan LinkDeclContextToDIE(ClangASTContext::GetAsDeclContext(cxx_method_decl), die); 6720c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan 6721c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan Host::SetCrashDescription (NULL); 6722c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan 6723c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan 6724c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan ClangASTMetadata metadata; 6725c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan metadata.SetUserID(MakeUserID(die->GetOffset())); 6726c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan 6727c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan if (!object_pointer_name.empty()) 6728c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan { 6729c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan metadata.SetObjectPtrName(object_pointer_name.c_str()); 6730c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan if (log) 6731017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton log->Printf ("Setting object pointer name: %s on method object %p.\n", 6732c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan object_pointer_name.c_str(), 6733017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton cxx_method_decl); 6734c71397b43f3d6d7af5a5dc59813fe57e04c2f505Sean Callanan } 6735017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton GetClangASTContext().SetMetadata (cxx_method_decl, metadata); 6736a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham } 6737e9b48f056e241bee683fd87c8eeab08b6f73a722Sean Callanan else 6738e9b48f056e241bee683fd87c8eeab08b6f73a722Sean Callanan { 67399d3587012e5077ab416ecb8e688fd6fbcab71bcaSean Callanan ignore_containing_context = true; 6740e9b48f056e241bee683fd87c8eeab08b6f73a722Sean Callanan } 67419f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton } 67426c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton } 67436c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton else 67446c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton { 67459f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // We were asked to parse the type for a method in a class, yet the 67469f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // class hasn't been asked to complete itself through the 67479f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // clang::ExternalASTSource protocol, so we need to just have the 67489f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // class complete itself and do things the right way, then our 67499f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // DIE should then have an entry in the m_die_to_type map. First 67509f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // we need to modify the m_die_to_type so it doesn't think we are 67519f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // trying to parse this DIE anymore... 67529f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton m_die_to_type[die] = NULL; 67539f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton 67549f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // Now we get the full type to force our class type to complete itself 67559f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // using the clang::ExternalASTSource protocol which will parse all 67569f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // base classes and all methods (including the method for this DIE). 67579f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton class_type->GetClangFullType(); 67589f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton 67599f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton // The type for this DIE should have been filled in the function call above 67609f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton type_ptr = m_die_to_type[die]; 6761246294891b6d2e1772ff535187e876067f492f53Greg Clayton if (type_ptr && type_ptr != DIE_IS_BEING_PARSED) 67629f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton { 676313d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton type_sp = type_ptr->shared_from_this(); 67649f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton break; 67659f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton } 67668f14b3f7b98ebc014c6e23c1b77932e25d1b4a12Sean Callanan 67678f14b3f7b98ebc014c6e23c1b77932e25d1b4a12Sean Callanan // FIXME This is fixing some even uglier behavior but we really need to 67688f14b3f7b98ebc014c6e23c1b77932e25d1b4a12Sean Callanan // uniq the methods of each class as well as the class itself. 67698f14b3f7b98ebc014c6e23c1b77932e25d1b4a12Sean Callanan // <rdar://problem/11240464> 67708f14b3f7b98ebc014c6e23c1b77932e25d1b4a12Sean Callanan type_handled = true; 67716c3e4af0a2ac87382d4c9dfffc12960a1456754cGreg Clayton } 677228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 67731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 67741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 67751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 677624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6777fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton 6778fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton if (!type_handled) 6779fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton { 6780fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton // We just have a function that isn't part of a class 67819d3587012e5077ab416ecb8e688fd6fbcab71bcaSean Callanan clang::FunctionDecl *function_decl = ast.CreateFunctionDeclaration (ignore_containing_context ? GetClangASTContext().GetTranslationUnitDecl() : containing_decl_ctx, 67825f24c5053d9fa99bd20e6b1e5b8c659c68d57be7Greg Clayton type_name_cstr, 6783e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton clang_type, 6784e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton storage, 6785e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton is_inline); 6786b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton 6787b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton// if (template_param_infos.GetSize() > 0) 6788b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton// { 6789b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton// clang::FunctionTemplateDecl *func_template_decl = ast.CreateFunctionTemplateDecl (containing_decl_ctx, 6790b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton// function_decl, 6791b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton// type_name_cstr, 6792b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton// template_param_infos); 6793b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton// 6794b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton// ast.CreateFunctionTemplateSpecializationInfo (function_decl, 6795b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton// func_template_decl, 6796b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton// template_param_infos); 6797b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton// } 6798fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton // Add the decl to our DIE to decl context map 6799fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton assert (function_decl); 6800e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton LinkDeclContextToDIE(function_decl, die); 6801fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton if (!function_param_decls.empty()) 6802e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton ast.SetFunctionParameters (function_decl, 6803e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton &function_param_decls.front(), 6804e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton function_param_decls.size()); 6805fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan 6806a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham ClangASTMetadata metadata; 6807a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham metadata.SetUserID(MakeUserID(die->GetOffset())); 6808a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham 6809a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham if (!object_pointer_name.empty()) 6810a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham { 6811a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham metadata.SetObjectPtrName(object_pointer_name.c_str()); 68128fda922ca66c79c4a373f1cd6092cdd0cd6ee295Jim Ingham if (log) 6813017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton log->Printf ("Setting object pointer name: %s on function object %p.", 68148fda922ca66c79c4a373f1cd6092cdd0cd6ee295Jim Ingham object_pointer_name.c_str(), 6815017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton function_decl); 6816a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham } 6817017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton GetClangASTContext().SetMetadata (function_decl, metadata); 6818fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton } 681924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6820444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton type_sp.reset( new Type (MakeUserID(die->GetOffset()), 6821e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton this, 6822e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton type_name_const_str, 6823e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton 0, 6824e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton NULL, 6825e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton LLDB_INVALID_UID, 6826e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton Type::eEncodingIsUID, 6827e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton &decl, 6828e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton clang_type, 6829a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton Type::eResolveStateFull)); 6830fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton assert(type_sp.get()); 683124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 683224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 683324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 683424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_array_type: 683524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 683624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set a bit that lets us know that we are currently parsing this 68374fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton m_die_to_type[die] = DIE_IS_BEING_PARSED; 683824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 683924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t type_die_offset = DW_INVALID_OFFSET; 684024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t first_index = 0; 684124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t byte_stride = 0; 684224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t bit_stride = 0; 6843f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton bool is_vector = false; 68445fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); 684524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 684624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_attributes > 0) 684724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 684824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 684924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_attributes; ++i) 685024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 685124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner attr = attributes.AttributeAtIndex(i); 685224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFFormValue form_value; 685324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 685424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 685524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (attr) 685624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 685724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 685824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 685924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 686024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_name: 686124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner type_name_cstr = form_value.AsCString(&get_debug_str_data()); 6862fb7c51c07c249bd611051c76e4ff491f1a17cf2dGreg Clayton type_name_const_str.SetCString(type_name_cstr); 686324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 686424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 686524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_type: type_die_offset = form_value.Reference(dwarf_cu); break; 68664a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_AT_byte_size: break; // byte_size = form_value.Unsigned(); break; 686724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_byte_stride: byte_stride = form_value.Unsigned(); break; 686824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_bit_stride: bit_stride = form_value.Unsigned(); break; 6869f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton case DW_AT_GNU_vector: is_vector = form_value.Boolean(); break; 68704a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_AT_accessibility: break; // accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break; 6871f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton case DW_AT_declaration: break; // is_forward_declaration = form_value.Boolean(); break; 687224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_allocated: 687324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_associated: 687424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_data_location: 687524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_description: 687624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_ordering: 687724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_start_scope: 687824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_visibility: 687924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_specification: 688024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_abstract_origin: 688124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_sibling: 688224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 688324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 688424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 688524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 688624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68875f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", MakeUserID(die->GetOffset()), DW_TAG_value_to_name(tag), type_name_cstr); 6888b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton 688924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *element_type = ResolveTypeUID(type_die_offset); 689024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 689124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (element_type) 689224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 689324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint64_t> element_orders; 689424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ParseChildArrayInfo(sc, dwarf_cu, die, first_index, element_orders, byte_stride, bit_stride); 689524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_stride == 0 && bit_stride == 0) 689624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_stride = element_type->GetByteSize(); 689752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType array_element_type = element_type->GetClangForwardType(); 689824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t array_element_bit_stride = byte_stride * 8 + bit_stride; 689924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t num_elements = 0; 690024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint64_t>::const_reverse_iterator pos; 690124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint64_t>::const_reverse_iterator end = element_orders.rend(); 690224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = element_orders.rbegin(); pos != end; ++pos) 690324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 690424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_elements = *pos; 6905e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton clang_type = ast.CreateArrayType (array_element_type, 6906f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton num_elements, 6907f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton is_vector); 690824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner array_element_type = clang_type; 6909b912457e1eb6f97d3ee3adc74d1e0f6393e35d3cGreg Clayton array_element_bit_stride = num_elements ? array_element_bit_stride * num_elements : array_element_bit_stride; 691024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 691124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString empty_name; 6912444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton type_sp.reset( new Type (MakeUserID(die->GetOffset()), 6913e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton this, 6914e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton empty_name, 6915e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton array_element_bit_stride / 8, 6916e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton NULL, 69176916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton type_die_offset, 6918e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton Type::eEncodingIsUID, 6919e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton &decl, 6920e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton clang_type, 69216916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton Type::eResolveStateFull)); 69226916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton type_sp->SetEncodingType (element_type); 692324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 692424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 692524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 692624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 692724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6928fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton case DW_TAG_ptr_to_member_type: 6929fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton { 6930fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton dw_offset_t type_die_offset = DW_INVALID_OFFSET; 6931fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton dw_offset_t containing_type_die_offset = DW_INVALID_OFFSET; 6932fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 69335fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); 6934fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 6935fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton if (num_attributes > 0) { 6936fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton uint32_t i; 6937fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton for (i=0; i<num_attributes; ++i) 6938fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton { 6939fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton attr = attributes.AttributeAtIndex(i); 6940fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton DWARFFormValue form_value; 6941fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 6942fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton { 6943fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton switch (attr) 6944fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton { 6945fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton case DW_AT_type: 6946fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton type_die_offset = form_value.Reference(dwarf_cu); break; 6947fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton case DW_AT_containing_type: 6948fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton containing_type_die_offset = form_value.Reference(dwarf_cu); break; 6949fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton } 6950fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton } 6951fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton } 6952fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 6953fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton Type *pointee_type = ResolveTypeUID(type_die_offset); 6954fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton Type *class_type = ResolveTypeUID(containing_type_die_offset); 6955fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 695652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointee_clang_type = pointee_type->GetClangForwardType(); 695752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType class_clang_type = class_type->GetClangLayoutType(); 6958fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 695952f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type = pointee_clang_type.CreateMemberPointerType(class_clang_type); 6960e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton 696152f792329be5db8e38961350589e97e8f2823acdGreg Clayton byte_size = clang_type.GetByteSize(); 6962e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton 6963444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton type_sp.reset( new Type (MakeUserID(die->GetOffset()), 6964e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton this, 6965e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton type_name_const_str, 6966e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton byte_size, 6967e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton NULL, 6968e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton LLDB_INVALID_UID, 6969e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton Type::eEncodingIsUID, 6970e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton NULL, 6971e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton clang_type, 69726916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton Type::eResolveStateForward)); 6973fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton } 6974fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 6975fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton break; 6976fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton } 697724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 6978b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton GetObjectFile()->GetModule()->ReportError ("{0x%8.8x}: unhandled type tag 0x%4.4x (%s), please file a bug and attach the file at the start of this error message", 6979b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton die->GetOffset(), 6980b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton tag, 6981b3ac5bfe5ce6cc584ea958a56416e179ba5e6b66Greg Clayton DW_TAG_value_to_name(tag)); 698224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 698324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 698424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 698524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_sp.get()) 698624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 698724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *sc_parent_die = GetParentSymbolContextDIE(die); 698824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_tag_t sc_parent_tag = sc_parent_die ? sc_parent_die->Tag() : 0; 698924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 699024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContextScope * symbol_context_scope = NULL; 699124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc_parent_tag == DW_TAG_compile_unit) 699224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 699324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_context_scope = sc.comp_unit; 699424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 699524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (sc.function != NULL) 699624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6997444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(MakeUserID(sc_parent_die->GetOffset())); 699824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbol_context_scope == NULL) 699924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_context_scope = sc.function; 700024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 700124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 700224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbol_context_scope != NULL) 700324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 700424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner type_sp->SetSymbolContextScope(symbol_context_scope); 700524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 700624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7007a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton // We are ready to put this type into the uniqued list up at the module level 7008a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton type_list->Insert (type_sp); 7009ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 7010a8d4241dcd129f289710c909491e0e80e7e3d732Greg Clayton m_die_to_type[die] = type_sp.get(); 701124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 701224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 70134fb400f4dc762fb92f9dcf1f6a7656ed12b09a75Greg Clayton else if (type_ptr != DIE_IS_BEING_PARSED) 701424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 701513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton type_sp = type_ptr->shared_from_this(); 701624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 701724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 701824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return type_sp; 701924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 702024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 702124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 7022462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonSymbolFileDWARF::ParseTypes 7023462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton( 7024462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const SymbolContext& sc, 7025462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton DWARFCompileUnit* dwarf_cu, 7026462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const DWARFDebugInfoEntry *die, 7027462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton bool parse_siblings, 7028462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton bool parse_children 7029462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton) 703024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 703124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t types_added = 0; 703224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (die != NULL) 703324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 703424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool type_is_new = false; 7035462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (ParseType(sc, dwarf_cu, die, &type_is_new).get()) 703624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 703724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_is_new) 703824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++types_added; 703924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 704024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 704124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parse_children && die->HasChildren()) 704224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 704324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (die->Tag() == DW_TAG_subprogram) 704424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 704524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext child_sc(sc); 7046444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton child_sc.function = sc.comp_unit->FindFunctionByUID(MakeUserID(die->GetOffset())).get(); 704724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner types_added += ParseTypes(child_sc, dwarf_cu, die->GetFirstChild(), true, true); 704824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 704924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 705024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner types_added += ParseTypes(sc, dwarf_cu, die->GetFirstChild(), true, true); 705124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 705224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 705324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parse_siblings) 705424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner die = die->GetSibling(); 705524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 705624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner die = NULL; 705724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 705824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return types_added; 705924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 706024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 706124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 706224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 706324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::ParseFunctionBlocks (const SymbolContext &sc) 706424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 706524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(sc.comp_unit && sc.function); 706624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t functions_added = 0; 706749ce8969d3154e1560106cfe530444c09410f217Greg Clayton DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit); 706824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dwarf_cu) 706924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 707024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_offset_t function_die_offset = sc.function->GetID(); 707124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *function_die = dwarf_cu->GetDIEPtr(function_die_offset); 707224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (function_die) 707324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 70742e45b0c3f6a6021aa7c064f715144599a2a712a0Greg Clayton ParseFunctionBlocks(sc, &sc.function->GetBlock (false), dwarf_cu, function_die, LLDB_INVALID_ADDRESS, 0); 707524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 707624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 707724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 707824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return functions_added; 707924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 708024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 708124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 708224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 708324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::ParseTypes (const SymbolContext &sc) 708424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 708524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // At least a compile unit must be valid 708624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(sc.comp_unit); 708724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t types_added = 0; 708849ce8969d3154e1560106cfe530444c09410f217Greg Clayton DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnit(sc.comp_unit); 708924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dwarf_cu) 709024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 709124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.function) 709224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 709324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_offset_t function_die_offset = sc.function->GetID(); 709424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *func_die = dwarf_cu->GetDIEPtr(function_die_offset); 709524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (func_die && func_die->HasChildren()) 709624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 709724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner types_added = ParseTypes(sc, dwarf_cu, func_die->GetFirstChild(), true, true); 709824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 709924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 710024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 710124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 710224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *dwarf_cu_die = dwarf_cu->DIE(); 710324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dwarf_cu_die && dwarf_cu_die->HasChildren()) 710424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 710524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner types_added = ParseTypes(sc, dwarf_cu, dwarf_cu_die->GetFirstChild(), true, true); 710624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 710724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 710824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 710924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 711024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return types_added; 711124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 711224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 711324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 711424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::ParseVariablesForContext (const SymbolContext& sc) 711524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 711624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit != NULL) 711724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71189bcf31e9821fd303c793525e977b14025bbe3f50Greg Clayton DWARFDebugInfo* info = DebugInfo(); 71199bcf31e9821fd303c793525e977b14025bbe3f50Greg Clayton if (info == NULL) 71209bcf31e9821fd303c793525e977b14025bbe3f50Greg Clayton return 0; 71219bcf31e9821fd303c793525e977b14025bbe3f50Greg Clayton 712224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.function) 712324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7124464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton DWARFCompileUnit* dwarf_cu = info->GetCompileUnitContainingDIE(sc.function->GetID()).get(); 7125464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 7126464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (dwarf_cu == NULL) 7127464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return 0; 7128464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 712924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *function_die = dwarf_cu->GetDIEPtr(sc.function->GetID()); 7130178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton 713136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton dw_addr_t func_lo_pc = function_die->GetAttributeValueAsUnsigned (this, dwarf_cu, DW_AT_low_pc, LLDB_INVALID_ADDRESS); 713236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton if (func_lo_pc != LLDB_INVALID_ADDRESS) 7133df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton { 7134df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const size_t num_variables = ParseVariables(sc, dwarf_cu, func_lo_pc, function_die->GetFirstChild(), true, true); 71351bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 7136df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton // Let all blocks know they have parse all their variables 7137df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton sc.function->GetBlock (false).SetDidParseVariables (true, true); 7138df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton return num_variables; 7139df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton } 714024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 714124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (sc.comp_unit) 714224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7143464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton DWARFCompileUnit* dwarf_cu = info->GetCompileUnit(sc.comp_unit->GetID()).get(); 7144464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 7145464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (dwarf_cu == NULL) 7146464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return 0; 7147464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 714824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t vars_added = 0; 714924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner VariableListSP variables (sc.comp_unit->GetVariableList(false)); 715024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 715124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (variables.get() == NULL) 715224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 715324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner variables.reset(new VariableList()); 715424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.comp_unit->SetVariableList(variables); 715524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7156144188bc458a35997d2f2e52206ab69747439073Greg Clayton DWARFCompileUnit* match_dwarf_cu = NULL; 7157144188bc458a35997d2f2e52206ab69747439073Greg Clayton const DWARFDebugInfoEntry* die = NULL; 7158144188bc458a35997d2f2e52206ab69747439073Greg Clayton DIEArray die_offsets; 7159bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_using_apple_tables) 716000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 7161bbe39167c881ac025cdc4f383ee8895cfd5b1148Greg Clayton if (m_apple_names_ap.get()) 716237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton { 716337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton DWARFMappedHash::DIEInfoArray hash_data_array; 716437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton if (m_apple_names_ap->AppendAllDIEsInRange (dwarf_cu->GetOffset(), 716537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton dwarf_cu->GetNextCompileUnitOffset(), 716637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton hash_data_array)) 716737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton { 716837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton DWARFMappedHash::ExtractDIEArray (hash_data_array, die_offsets); 716937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton } 717037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton } 717100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 717200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton else 717300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 717400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton // Index if we already haven't to make sure the compile units 717500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton // get indexed and make their global DIE index list 717600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (!m_indexed) 717700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton Index (); 717800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 717900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton m_global_index.FindAllEntriesForCompileUnit (dwarf_cu->GetOffset(), 718000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton dwarf_cu->GetNextCompileUnitOffset(), 718100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton die_offsets); 718200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 718300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 718400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const size_t num_matches = die_offsets.size(); 7185144188bc458a35997d2f2e52206ab69747439073Greg Clayton if (num_matches) 718624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7187144188bc458a35997d2f2e52206ab69747439073Greg Clayton DWARFDebugInfo* debug_info = DebugInfo(); 7188144188bc458a35997d2f2e52206ab69747439073Greg Clayton for (size_t i=0; i<num_matches; ++i) 718924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7190144188bc458a35997d2f2e52206ab69747439073Greg Clayton const dw_offset_t die_offset = die_offsets[i]; 7191144188bc458a35997d2f2e52206ab69747439073Greg Clayton die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &match_dwarf_cu); 7192bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (die) 7193144188bc458a35997d2f2e52206ab69747439073Greg Clayton { 7194bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton VariableSP var_sp (ParseVariableDIE(sc, dwarf_cu, die, LLDB_INVALID_ADDRESS)); 7195bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (var_sp) 7196bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 7197bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton variables->AddVariableIfUnique (var_sp); 7198bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton ++vars_added; 7199bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 7200144188bc458a35997d2f2e52206ab69747439073Greg Clayton } 7201bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton else 7202bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 7203bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton if (m_using_apple_tables) 7204bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton { 7205df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x)\n", die_offset); 7206bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 7207bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton } 7208bc50070587fb4fceecbc6692a09ee05e0a59e157Greg Clayton 720924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 721024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 721124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 721224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return vars_added; 721324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 721424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 721524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 721624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 721724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 721824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 721924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariableSP 722024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::ParseVariableDIE 722124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 722224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const SymbolContext& sc, 72231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton DWARFCompileUnit* dwarf_cu, 7224178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton const DWARFDebugInfoEntry *die, 7225178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton const lldb::addr_t func_low_pc 722624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 722724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 722824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72293bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton VariableSP var_sp (m_die_to_variable_sp[die]); 72303bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (var_sp) 72313bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return var_sp; // Already been parsed! 723224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 723324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const dw_tag_t tag = die->Tag(); 723400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 723500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if ((tag == DW_TAG_variable) || 723600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton (tag == DW_TAG_constant) || 723700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton (tag == DW_TAG_formal_parameter && sc.function)) 723824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 723900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton DWARFDebugInfoEntry::Attributes attributes; 724000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); 724100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (num_attributes > 0) 724224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 724300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const char *name = NULL; 724400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const char *mangled = NULL; 724500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton Declaration decl; 724600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton uint32_t i; 724737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton lldb::user_id_t type_uid = LLDB_INVALID_UID; 724800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton DWARFExpression location; 724900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton bool is_external = false; 725000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton bool is_artificial = false; 725100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton bool location_is_const_value_data = false; 72520ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor bool has_explicit_location = false; 72534a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton //AccessType accessibility = eAccessNone; 725400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 725500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton for (i=0; i<num_attributes; ++i) 725624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 725700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton dw_attr_t attr = attributes.AttributeAtIndex(i); 725800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton DWARFFormValue form_value; 725900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 726024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 726100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton switch (attr) 726224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 726300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 726400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 726500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 726600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_name: name = form_value.AsCString(&get_debug_str_data()); break; 72676f3a711edcfaeca1efbb998cdea5d0a0782ddfa3Greg Clayton case DW_AT_linkage_name: 726800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_MIPS_linkage_name: mangled = form_value.AsCString(&get_debug_str_data()); break; 726937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton case DW_AT_type: type_uid = form_value.Reference(dwarf_cu); break; 7270f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton case DW_AT_external: is_external = form_value.Boolean(); break; 727100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_const_value: 72720ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor // If we have already found a DW_AT_location attribute, ignore this attribute. 72730ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor if (!has_explicit_location) 72740ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor { 72750ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor location_is_const_value_data = true; 72760ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor // The constant value will be either a block, a data value or a string. 72770ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor const DataExtractor& debug_info_data = get_debug_info_data(); 72780ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor if (DWARFFormValue::IsBlockForm(form_value.Form())) 72790ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor { 72800ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor // Retrieve the value as a block expression. 72810ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart(); 72820ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor uint32_t block_length = form_value.Unsigned(); 72830ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor location.CopyOpcodeData(debug_info_data, block_offset, block_length); 72840ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor } 72850ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor else if (DWARFFormValue::IsDataForm(form_value.Form())) 72860ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor { 72870ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor // Retrieve the value as a data expression. 72880ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize()); 72890ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor uint32_t data_offset = attributes.DIEOffsetAtIndex(i); 72900ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor uint32_t data_length = fixed_form_sizes[form_value.Form()]; 72910ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor location.CopyOpcodeData(debug_info_data, data_offset, data_length); 72920ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor } 72930ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor else 72940ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor { 72950ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor // Retrieve the value as a string expression. 72960ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor if (form_value.Form() == DW_FORM_strp) 72970ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor { 72980ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize()); 72990ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor uint32_t data_offset = attributes.DIEOffsetAtIndex(i); 73000ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor uint32_t data_length = fixed_form_sizes[form_value.Form()]; 73010ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor location.CopyOpcodeData(debug_info_data, data_offset, data_length); 73020ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor } 73030ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor else 73040ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor { 73050ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor const char *str = form_value.AsCString(&debug_info_data); 73060ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor uint32_t string_offset = str - (const char *)debug_info_data.GetDataStart(); 73070ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor uint32_t string_length = strlen(str) + 1; 73080ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor location.CopyOpcodeData(debug_info_data, string_offset, string_length); 73090ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor } 73100ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor } 73110ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor } 73120ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor break; 731300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_location: 731424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 73150ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor location_is_const_value_data = false; 73160ac1f0c2df5d5003b53489a52022e3ba1c88dc95Andrew Kaylor has_explicit_location = true; 731700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (form_value.BlockData()) 731800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 731900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const DataExtractor& debug_info_data = get_debug_info_data(); 732024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 732100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart(); 732200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton uint32_t block_length = form_value.Unsigned(); 7323caddaf4c03dfe49a8245820a2f0a362239ce5d06Greg Clayton location.CopyOpcodeData(get_debug_info_data(), block_offset, block_length); 732400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 732500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton else 732624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 732700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const DataExtractor& debug_loc_data = get_debug_loc_data(); 732800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton const dw_offset_t debug_loc_offset = form_value.Unsigned(); 732900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 733000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton size_t loc_list_length = DWARFLocationList::Size(debug_loc_data, debug_loc_offset); 733100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton if (loc_list_length > 0) 733200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 7333caddaf4c03dfe49a8245820a2f0a362239ce5d06Greg Clayton location.CopyOpcodeData(debug_loc_data, debug_loc_offset, loc_list_length); 733400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton assert (func_low_pc != LLDB_INVALID_ADDRESS); 733500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton location.SetLocationListSlide (func_low_pc - dwarf_cu->GetBaseAddress()); 733600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 733724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 733824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 733900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton break; 734024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7341f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton case DW_AT_artificial: is_artificial = form_value.Boolean(); break; 73424a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton case DW_AT_accessibility: break; //accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break; 734300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_declaration: 734400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_description: 734500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_endianity: 734600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_segment: 734700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_start_scope: 734800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_visibility: 734900db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton default: 735000db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_abstract_origin: 735100db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_sibling: 735200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton case DW_AT_specification: 735300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton break; 735400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 735524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 735624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 735724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7358668010966e95642360fd12094b28755e5dda5343Greg Clayton ValueType scope = eValueTypeInvalid; 7359668010966e95642360fd12094b28755e5dda5343Greg Clayton 7360668010966e95642360fd12094b28755e5dda5343Greg Clayton const DWARFDebugInfoEntry *sc_parent_die = GetParentSymbolContextDIE(die); 7361668010966e95642360fd12094b28755e5dda5343Greg Clayton dw_tag_t parent_tag = sc_parent_die ? sc_parent_die->Tag() : 0; 7362668010966e95642360fd12094b28755e5dda5343Greg Clayton SymbolContextScope * symbol_context_scope = NULL; 7363668010966e95642360fd12094b28755e5dda5343Greg Clayton 7364668010966e95642360fd12094b28755e5dda5343Greg Clayton // DWARF doesn't specify if a DW_TAG_variable is a local, global 7365668010966e95642360fd12094b28755e5dda5343Greg Clayton // or static variable, so we have to do a little digging by 7366668010966e95642360fd12094b28755e5dda5343Greg Clayton // looking at the location of a varaible to see if it contains 7367668010966e95642360fd12094b28755e5dda5343Greg Clayton // a DW_OP_addr opcode _somewhere_ in the definition. I say 7368668010966e95642360fd12094b28755e5dda5343Greg Clayton // somewhere because clang likes to combine small global variables 7369668010966e95642360fd12094b28755e5dda5343Greg Clayton // into the same symbol and have locations like: 7370668010966e95642360fd12094b28755e5dda5343Greg Clayton // DW_OP_addr(0x1000), DW_OP_constu(2), DW_OP_plus 7371668010966e95642360fd12094b28755e5dda5343Greg Clayton // So if we don't have a DW_TAG_formal_parameter, we can look at 7372668010966e95642360fd12094b28755e5dda5343Greg Clayton // the location to see if it contains a DW_OP_addr opcode, and 7373668010966e95642360fd12094b28755e5dda5343Greg Clayton // then we can correctly classify our variables. 7374668010966e95642360fd12094b28755e5dda5343Greg Clayton if (tag == DW_TAG_formal_parameter) 7375668010966e95642360fd12094b28755e5dda5343Greg Clayton scope = eValueTypeVariableArgument; 7376668010966e95642360fd12094b28755e5dda5343Greg Clayton else 737700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 7378668010966e95642360fd12094b28755e5dda5343Greg Clayton bool op_error = false; 7379668010966e95642360fd12094b28755e5dda5343Greg Clayton // Check if the location has a DW_OP_addr with any address value... 7380668010966e95642360fd12094b28755e5dda5343Greg Clayton lldb::addr_t location_DW_OP_addr = LLDB_INVALID_ADDRESS; 7381668010966e95642360fd12094b28755e5dda5343Greg Clayton if (!location_is_const_value_data) 7382a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton { 7383668010966e95642360fd12094b28755e5dda5343Greg Clayton location_DW_OP_addr = location.GetLocation_DW_OP_addr (0, op_error); 7384668010966e95642360fd12094b28755e5dda5343Greg Clayton if (op_error) 73852f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton { 7386668010966e95642360fd12094b28755e5dda5343Greg Clayton StreamString strm; 7387668010966e95642360fd12094b28755e5dda5343Greg Clayton location.DumpLocationForAddress (&strm, eDescriptionLevelFull, 0, 0, NULL); 7388668010966e95642360fd12094b28755e5dda5343Greg Clayton GetObjectFile()->GetModule()->ReportError ("0x%8.8x: %s has an invalid location: %s", die->GetOffset(), DW_TAG_value_to_name(die->Tag()), strm.GetString().c_str()); 73892f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton } 7390668010966e95642360fd12094b28755e5dda5343Greg Clayton } 739137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton 7392668010966e95642360fd12094b28755e5dda5343Greg Clayton if (location_DW_OP_addr != LLDB_INVALID_ADDRESS) 7393668010966e95642360fd12094b28755e5dda5343Greg Clayton { 7394668010966e95642360fd12094b28755e5dda5343Greg Clayton if (is_external) 7395668010966e95642360fd12094b28755e5dda5343Greg Clayton scope = eValueTypeVariableGlobal; 7396668010966e95642360fd12094b28755e5dda5343Greg Clayton else 7397668010966e95642360fd12094b28755e5dda5343Greg Clayton scope = eValueTypeVariableStatic; 7398668010966e95642360fd12094b28755e5dda5343Greg Clayton 7399668010966e95642360fd12094b28755e5dda5343Greg Clayton 7400668010966e95642360fd12094b28755e5dda5343Greg Clayton SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile (); 7401668010966e95642360fd12094b28755e5dda5343Greg Clayton 7402668010966e95642360fd12094b28755e5dda5343Greg Clayton if (debug_map_symfile) 7403a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton { 7404668010966e95642360fd12094b28755e5dda5343Greg Clayton // When leaving the DWARF in the .o files on darwin, 7405668010966e95642360fd12094b28755e5dda5343Greg Clayton // when we have a global variable that wasn't initialized, 7406668010966e95642360fd12094b28755e5dda5343Greg Clayton // the .o file might not have allocated a virtual 7407668010966e95642360fd12094b28755e5dda5343Greg Clayton // address for the global variable. In this case it will 7408668010966e95642360fd12094b28755e5dda5343Greg Clayton // have created a symbol for the global variable 7409668010966e95642360fd12094b28755e5dda5343Greg Clayton // that is undefined/data and external and the value will 7410668010966e95642360fd12094b28755e5dda5343Greg Clayton // be the byte size of the variable. When we do the 7411668010966e95642360fd12094b28755e5dda5343Greg Clayton // address map in SymbolFileDWARFDebugMap we rely on 7412668010966e95642360fd12094b28755e5dda5343Greg Clayton // having an address, we need to do some magic here 7413668010966e95642360fd12094b28755e5dda5343Greg Clayton // so we can get the correct address for our global 7414668010966e95642360fd12094b28755e5dda5343Greg Clayton // variable. The address for all of these entries 7415668010966e95642360fd12094b28755e5dda5343Greg Clayton // will be zero, and there will be an undefined symbol 7416668010966e95642360fd12094b28755e5dda5343Greg Clayton // in this object file, and the executable will have 7417668010966e95642360fd12094b28755e5dda5343Greg Clayton // a matching symbol with a good address. So here we 7418668010966e95642360fd12094b28755e5dda5343Greg Clayton // dig up the correct address and replace it in the 7419668010966e95642360fd12094b28755e5dda5343Greg Clayton // location for the variable, and set the variable's 7420668010966e95642360fd12094b28755e5dda5343Greg Clayton // symbol context scope to be that of the main executable 7421668010966e95642360fd12094b28755e5dda5343Greg Clayton // so the file address will resolve correctly. 7422668010966e95642360fd12094b28755e5dda5343Greg Clayton bool linked_oso_file_addr = false; 7423668010966e95642360fd12094b28755e5dda5343Greg Clayton if (is_external && location_DW_OP_addr == 0) 7424464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 7425668010966e95642360fd12094b28755e5dda5343Greg Clayton // we have a possible uninitialized extern global 7426668010966e95642360fd12094b28755e5dda5343Greg Clayton ConstString const_name(mangled ? mangled : name); 7427668010966e95642360fd12094b28755e5dda5343Greg Clayton ObjectFile *debug_map_objfile = debug_map_symfile->GetObjectFile(); 7428668010966e95642360fd12094b28755e5dda5343Greg Clayton if (debug_map_objfile) 7429a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton { 74307940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton Symtab *debug_map_symtab = debug_map_objfile->GetSymtab(); 7431668010966e95642360fd12094b28755e5dda5343Greg Clayton if (debug_map_symtab) 7432a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton { 7433668010966e95642360fd12094b28755e5dda5343Greg Clayton Symbol *exe_symbol = debug_map_symtab->FindFirstSymbolWithNameAndType (const_name, 7434668010966e95642360fd12094b28755e5dda5343Greg Clayton eSymbolTypeData, 7435668010966e95642360fd12094b28755e5dda5343Greg Clayton Symtab::eDebugYes, 7436668010966e95642360fd12094b28755e5dda5343Greg Clayton Symtab::eVisibilityExtern); 7437668010966e95642360fd12094b28755e5dda5343Greg Clayton if (exe_symbol) 7438a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton { 7439668010966e95642360fd12094b28755e5dda5343Greg Clayton if (exe_symbol->ValueIsAddress()) 7440a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton { 7441668010966e95642360fd12094b28755e5dda5343Greg Clayton const addr_t exe_file_addr = exe_symbol->GetAddress().GetFileAddress(); 7442668010966e95642360fd12094b28755e5dda5343Greg Clayton if (exe_file_addr != LLDB_INVALID_ADDRESS) 7443a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton { 7444668010966e95642360fd12094b28755e5dda5343Greg Clayton if (location.Update_DW_OP_addr (exe_file_addr)) 7445a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton { 7446668010966e95642360fd12094b28755e5dda5343Greg Clayton linked_oso_file_addr = true; 7447668010966e95642360fd12094b28755e5dda5343Greg Clayton symbol_context_scope = exe_symbol; 7448a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton } 7449a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton } 7450a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton } 7451a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton } 7452a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton } 7453a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton } 7454668010966e95642360fd12094b28755e5dda5343Greg Clayton } 7455464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 7456668010966e95642360fd12094b28755e5dda5343Greg Clayton if (!linked_oso_file_addr) 7457668010966e95642360fd12094b28755e5dda5343Greg Clayton { 7458668010966e95642360fd12094b28755e5dda5343Greg Clayton // The DW_OP_addr is not zero, but it contains a .o file address which 7459668010966e95642360fd12094b28755e5dda5343Greg Clayton // needs to be linked up correctly. 7460668010966e95642360fd12094b28755e5dda5343Greg Clayton const lldb::addr_t exe_file_addr = debug_map_symfile->LinkOSOFileAddress(this, location_DW_OP_addr); 7461668010966e95642360fd12094b28755e5dda5343Greg Clayton if (exe_file_addr != LLDB_INVALID_ADDRESS) 7462464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 7463668010966e95642360fd12094b28755e5dda5343Greg Clayton // Update the file address for this variable 7464668010966e95642360fd12094b28755e5dda5343Greg Clayton location.Update_DW_OP_addr (exe_file_addr); 7465668010966e95642360fd12094b28755e5dda5343Greg Clayton } 7466668010966e95642360fd12094b28755e5dda5343Greg Clayton else 7467668010966e95642360fd12094b28755e5dda5343Greg Clayton { 7468668010966e95642360fd12094b28755e5dda5343Greg Clayton // Variable didn't make it into the final executable 7469668010966e95642360fd12094b28755e5dda5343Greg Clayton return var_sp; 7470464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 747137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton } 7472a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton } 7473a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton } 7474668010966e95642360fd12094b28755e5dda5343Greg Clayton else 7475668010966e95642360fd12094b28755e5dda5343Greg Clayton { 7476668010966e95642360fd12094b28755e5dda5343Greg Clayton scope = eValueTypeVariableLocal; 7477668010966e95642360fd12094b28755e5dda5343Greg Clayton } 7478668010966e95642360fd12094b28755e5dda5343Greg Clayton } 747924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7480668010966e95642360fd12094b28755e5dda5343Greg Clayton if (symbol_context_scope == NULL) 7481668010966e95642360fd12094b28755e5dda5343Greg Clayton { 7482668010966e95642360fd12094b28755e5dda5343Greg Clayton switch (parent_tag) 748300db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton { 7484668010966e95642360fd12094b28755e5dda5343Greg Clayton case DW_TAG_subprogram: 7485668010966e95642360fd12094b28755e5dda5343Greg Clayton case DW_TAG_inlined_subroutine: 7486668010966e95642360fd12094b28755e5dda5343Greg Clayton case DW_TAG_lexical_block: 7487668010966e95642360fd12094b28755e5dda5343Greg Clayton if (sc.function) 7488b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton { 7489668010966e95642360fd12094b28755e5dda5343Greg Clayton symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(MakeUserID(sc_parent_die->GetOffset())); 7490668010966e95642360fd12094b28755e5dda5343Greg Clayton if (symbol_context_scope == NULL) 7491668010966e95642360fd12094b28755e5dda5343Greg Clayton symbol_context_scope = sc.function; 7492b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton } 7493668010966e95642360fd12094b28755e5dda5343Greg Clayton break; 7494668010966e95642360fd12094b28755e5dda5343Greg Clayton 7495668010966e95642360fd12094b28755e5dda5343Greg Clayton default: 7496668010966e95642360fd12094b28755e5dda5343Greg Clayton symbol_context_scope = sc.comp_unit; 7497668010966e95642360fd12094b28755e5dda5343Greg Clayton break; 749800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 7499668010966e95642360fd12094b28755e5dda5343Greg Clayton } 7500b523031335a9c1c6c23c0789b5c6522a6a2e2ca1Greg Clayton 7501668010966e95642360fd12094b28755e5dda5343Greg Clayton if (symbol_context_scope) 7502668010966e95642360fd12094b28755e5dda5343Greg Clayton { 7503668010966e95642360fd12094b28755e5dda5343Greg Clayton var_sp.reset (new Variable (MakeUserID(die->GetOffset()), 7504668010966e95642360fd12094b28755e5dda5343Greg Clayton name, 7505668010966e95642360fd12094b28755e5dda5343Greg Clayton mangled, 7506668010966e95642360fd12094b28755e5dda5343Greg Clayton SymbolFileTypeSP (new SymbolFileType(*this, type_uid)), 7507668010966e95642360fd12094b28755e5dda5343Greg Clayton scope, 7508668010966e95642360fd12094b28755e5dda5343Greg Clayton symbol_context_scope, 7509668010966e95642360fd12094b28755e5dda5343Greg Clayton &decl, 7510668010966e95642360fd12094b28755e5dda5343Greg Clayton location, 7511668010966e95642360fd12094b28755e5dda5343Greg Clayton is_external, 7512668010966e95642360fd12094b28755e5dda5343Greg Clayton is_artificial)); 7513668010966e95642360fd12094b28755e5dda5343Greg Clayton 7514668010966e95642360fd12094b28755e5dda5343Greg Clayton var_sp->SetLocationIsConstantValueData (location_is_const_value_data); 7515668010966e95642360fd12094b28755e5dda5343Greg Clayton } 7516668010966e95642360fd12094b28755e5dda5343Greg Clayton else 7517668010966e95642360fd12094b28755e5dda5343Greg Clayton { 7518668010966e95642360fd12094b28755e5dda5343Greg Clayton // Not ready to parse this variable yet. It might be a global 7519668010966e95642360fd12094b28755e5dda5343Greg Clayton // or static variable that is in a function scope and the function 7520668010966e95642360fd12094b28755e5dda5343Greg Clayton // in the symbol context wasn't filled in yet 7521668010966e95642360fd12094b28755e5dda5343Greg Clayton return var_sp; 752200db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton } 752324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 752400db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton // Cache var_sp even if NULL (the variable was just a specification or 752500db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton // was missing vital information to be able to be displayed in the debugger 752600db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton // (missing location due to optimization, etc)) so we don't re-parse 752700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton // this DIE over and over later... 752800db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton m_die_to_variable_sp[die] = var_sp; 752924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 753024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return var_sp; 753124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 753224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75331bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 75341bd2b2feb7694e06b9a971063c283f9c490479d2Greg Claytonconst DWARFDebugInfoEntry * 75351bd2b2feb7694e06b9a971063c283f9c490479d2Greg ClaytonSymbolFileDWARF::FindBlockContainingSpecification (dw_offset_t func_die_offset, 75361bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton dw_offset_t spec_block_die_offset, 75371bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton DWARFCompileUnit **result_die_cu_handle) 75381bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton{ 75391bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton // Give the concrete function die specified by "func_die_offset", find the 75401bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton // concrete block whose DW_AT_specification or DW_AT_abstract_origin points 75411bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton // to "spec_block_die_offset" 75421bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton DWARFDebugInfo* info = DebugInfo(); 75431bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 75441bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton const DWARFDebugInfoEntry *die = info->GetDIEPtrWithCompileUnitHint(func_die_offset, result_die_cu_handle); 75451bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (die) 75461bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 75471bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton assert (*result_die_cu_handle); 75481bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton return FindBlockContainingSpecification (*result_die_cu_handle, die, spec_block_die_offset, result_die_cu_handle); 75491bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 75501bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton return NULL; 75511bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton} 75521bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 75531bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 75541bd2b2feb7694e06b9a971063c283f9c490479d2Greg Claytonconst DWARFDebugInfoEntry * 75551bd2b2feb7694e06b9a971063c283f9c490479d2Greg ClaytonSymbolFileDWARF::FindBlockContainingSpecification(DWARFCompileUnit* dwarf_cu, 75561bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton const DWARFDebugInfoEntry *die, 75571bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton dw_offset_t spec_block_die_offset, 75581bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton DWARFCompileUnit **result_die_cu_handle) 75591bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton{ 75601bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (die) 75611bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 75621bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton switch (die->Tag()) 75631bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 75641bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton case DW_TAG_subprogram: 75651bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton case DW_TAG_inlined_subroutine: 75661bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton case DW_TAG_lexical_block: 75671bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 75681bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (die->GetAttributeValueAsReference (this, dwarf_cu, DW_AT_specification, DW_INVALID_OFFSET) == spec_block_die_offset) 75691bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 75701bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton *result_die_cu_handle = dwarf_cu; 75711bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton return die; 75721bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 75731bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 75741bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (die->GetAttributeValueAsReference (this, dwarf_cu, DW_AT_abstract_origin, DW_INVALID_OFFSET) == spec_block_die_offset) 75751bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 75761bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton *result_die_cu_handle = dwarf_cu; 75771bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton return die; 75781bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 75791bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 75801bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton break; 75811bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 75821bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 75831bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton // Give the concrete function die specified by "func_die_offset", find the 75841bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton // concrete block whose DW_AT_specification or DW_AT_abstract_origin points 75851bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton // to "spec_block_die_offset" 75861bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton for (const DWARFDebugInfoEntry *child_die = die->GetFirstChild(); child_die != NULL; child_die = child_die->GetSibling()) 75871bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 75881bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton const DWARFDebugInfoEntry *result_die = FindBlockContainingSpecification (dwarf_cu, 75891bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton child_die, 75901bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton spec_block_die_offset, 75911bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton result_die_cu_handle); 75921bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (result_die) 75931bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton return result_die; 75941bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 75951bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 75961bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 75971bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton *result_die_cu_handle = NULL; 75981bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton return NULL; 75991bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton} 76001bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 760124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 760224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::ParseVariables 760324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 760424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const SymbolContext& sc, 76051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton DWARFCompileUnit* dwarf_cu, 7606178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton const lldb::addr_t func_low_pc, 760724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *orig_die, 760824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool parse_siblings, 760924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool parse_children, 761024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner VariableList* cc_variable_list 761124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 761224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 761324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (orig_die == NULL) 761424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 761524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76161bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton VariableListSP variable_list_sp; 76171bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 76181bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton size_t vars_added = 0; 761924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry *die = orig_die; 76201bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton while (die != NULL) 762124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76221bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton dw_tag_t tag = die->Tag(); 76231bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 76241bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton // Check to see if we have already parsed this variable or constant? 76251bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (m_die_to_variable_sp[die]) 762624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76271bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (cc_variable_list) 76281bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton cc_variable_list->AddVariableIfUnique (m_die_to_variable_sp[die]); 762924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 763024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 763124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76321bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton // We haven't already parsed it, lets do that now. 76331bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if ((tag == DW_TAG_variable) || 76341bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton (tag == DW_TAG_constant) || 76351bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton (tag == DW_TAG_formal_parameter && sc.function)) 763624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76371bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (variable_list_sp.get() == NULL) 763863afdb07641f04aa7b60d895120b056124d3469bGreg Clayton { 76391bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton const DWARFDebugInfoEntry *sc_parent_die = GetParentSymbolContextDIE(orig_die); 76401bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton dw_tag_t parent_tag = sc_parent_die ? sc_parent_die->Tag() : 0; 76411bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton switch (parent_tag) 76421bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 76431bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton case DW_TAG_compile_unit: 76441bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (sc.comp_unit != NULL) 76451bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 76461bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton variable_list_sp = sc.comp_unit->GetVariableList(false); 76471bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (variable_list_sp.get() == NULL) 76481bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 76491bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton variable_list_sp.reset(new VariableList()); 76501bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton sc.comp_unit->SetVariableList(variable_list_sp); 76511bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 76521bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 76531bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton else 76541bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 76555f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea GetObjectFile()->GetModule()->ReportError ("parent 0x%8.8" PRIx64 " %s with no valid compile unit in symbol context for 0x%8.8" PRIx64 " %s.\n", 7656df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton MakeUserID(sc_parent_die->GetOffset()), 7657df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton DW_TAG_value_to_name (parent_tag), 7658df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton MakeUserID(orig_die->GetOffset()), 7659df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton DW_TAG_value_to_name (orig_die->Tag())); 76601bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 76611bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton break; 76621bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 76631bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton case DW_TAG_subprogram: 76641bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton case DW_TAG_inlined_subroutine: 76651bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton case DW_TAG_lexical_block: 76661bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (sc.function != NULL) 76671bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 76681bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton // Check to see if we already have parsed the variables for the given scope 76691bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 7670444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton Block *block = sc.function->GetBlock(true).FindBlockByID(MakeUserID(sc_parent_die->GetOffset())); 76711bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (block == NULL) 76721bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 76731bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton // This must be a specification or abstract origin with 76741bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton // a concrete block couterpart in the current function. We need 76751bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton // to find the concrete block so we can correctly add the 76761bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton // variable to it 76771bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton DWARFCompileUnit *concrete_block_die_cu = dwarf_cu; 76781bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton const DWARFDebugInfoEntry *concrete_block_die = FindBlockContainingSpecification (sc.function->GetID(), 76791bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton sc_parent_die->GetOffset(), 76801bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton &concrete_block_die_cu); 76811bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (concrete_block_die) 7682444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton block = sc.function->GetBlock(true).FindBlockByID(MakeUserID(concrete_block_die->GetOffset())); 76831bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 76841bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 76851bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (block != NULL) 76861bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 76871bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton const bool can_create = false; 76881bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton variable_list_sp = block->GetBlockVariableList (can_create); 76891bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (variable_list_sp.get() == NULL) 76901bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 76911bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton variable_list_sp.reset(new VariableList()); 76921bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton block->SetVariableList(variable_list_sp); 76931bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 76941bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 76951bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 76961bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton break; 76971bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 76981bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton default: 76995f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea GetObjectFile()->GetModule()->ReportError ("didn't find appropriate parent DIE for variable list for 0x%8.8" PRIx64 " %s.\n", 7700df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton MakeUserID(orig_die->GetOffset()), 7701df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton DW_TAG_value_to_name (orig_die->Tag())); 77021bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton break; 77031bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 770463afdb07641f04aa7b60d895120b056124d3469bGreg Clayton } 77051bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 77061bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (variable_list_sp) 770724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 770863afdb07641f04aa7b60d895120b056124d3469bGreg Clayton VariableSP var_sp (ParseVariableDIE(sc, dwarf_cu, die, func_low_pc)); 770963afdb07641f04aa7b60d895120b056124d3469bGreg Clayton if (var_sp) 771063afdb07641f04aa7b60d895120b056124d3469bGreg Clayton { 77111bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton variable_list_sp->AddVariableIfUnique (var_sp); 771263afdb07641f04aa7b60d895120b056124d3469bGreg Clayton if (cc_variable_list) 771363afdb07641f04aa7b60d895120b056124d3469bGreg Clayton cc_variable_list->AddVariableIfUnique (var_sp); 771463afdb07641f04aa7b60d895120b056124d3469bGreg Clayton ++vars_added; 771563afdb07641f04aa7b60d895120b056124d3469bGreg Clayton } 771624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 771724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77181bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton } 771924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77201bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton bool skip_children = (sc.function == NULL && tag == DW_TAG_subprogram); 772124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77221bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (!skip_children && parse_children && die->HasChildren()) 77231bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton { 77241bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton vars_added += ParseVariables(sc, dwarf_cu, func_low_pc, die->GetFirstChild(), true, true, cc_variable_list); 772563afdb07641f04aa7b60d895120b056124d3469bGreg Clayton } 77261bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton 77271bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton if (parse_siblings) 77281bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton die = die->GetSibling(); 77291bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton else 77301bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton die = NULL; 773124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77321bd2b2feb7694e06b9a971063c283f9c490479d2Greg Clayton return vars_added; 773324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 773424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 773524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 773624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// PluginInterface protocol 773724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 77380e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonConstString 773924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::GetPluginName() 774024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 774124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetPluginNameStatic(); 774224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 774324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 774424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 774524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF::GetPluginVersion() 774624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 774724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 774824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 774924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 775024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 7751b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARF::CompleteTagDecl (void *baton, clang::TagDecl *decl) 7752b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 7753b01000fd063629facd45044f137446fb748ee179Greg Clayton SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton; 775452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); 7755b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type) 7756b01000fd063629facd45044f137446fb748ee179Greg Clayton symbol_file_dwarf->ResolveClangOpaqueTypeDefinition (clang_type); 7757b01000fd063629facd45044f137446fb748ee179Greg Clayton} 7758b01000fd063629facd45044f137446fb748ee179Greg Clayton 7759b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 7760b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARF::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl) 7761b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 7762b01000fd063629facd45044f137446fb748ee179Greg Clayton SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton; 776352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); 7764b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type) 7765b01000fd063629facd45044f137446fb748ee179Greg Clayton symbol_file_dwarf->ResolveClangOpaqueTypeDefinition (clang_type); 7766b01000fd063629facd45044f137446fb748ee179Greg Clayton} 7767b01000fd063629facd45044f137446fb748ee179Greg Clayton 7768e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Claytonvoid 77699b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananSymbolFileDWARF::DumpIndexes () 77709b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{ 77719b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan StreamFile s(stdout, false); 77729b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 777397a19b21dacd9063bb5475812df7781777262198Greg Clayton s.Printf ("DWARF index for (%s) '%s':", 77749b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan GetObjectFile()->GetModule()->GetArchitecture().GetArchitectureName(), 777597a19b21dacd9063bb5475812df7781777262198Greg Clayton GetObjectFile()->GetFileSpec().GetPath().c_str()); 77769b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan s.Printf("\nFunction basenames:\n"); m_function_basename_index.Dump (&s); 77779b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan s.Printf("\nFunction fullnames:\n"); m_function_fullname_index.Dump (&s); 77789b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan s.Printf("\nFunction methods:\n"); m_function_method_index.Dump (&s); 77799b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan s.Printf("\nFunction selectors:\n"); m_function_selector_index.Dump (&s); 77809b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan s.Printf("\nObjective C class selectors:\n"); m_objc_class_selectors_index.Dump (&s); 77819b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan s.Printf("\nGlobals and statics:\n"); m_global_index.Dump (&s); 77829b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan s.Printf("\nTypes:\n"); m_type_index.Dump (&s); 77839b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan s.Printf("\nNamepaces:\n"); m_namespace_index.Dump (&s); 77849b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan} 77859b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 77869b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid 77879b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananSymbolFileDWARF::SearchDeclContext (const clang::DeclContext *decl_context, 77889b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const char *name, 77899b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan llvm::SmallVectorImpl <clang::NamedDecl *> *results) 7790e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton{ 77919b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan DeclContextToDIEMap::iterator iter = m_decl_ctx_to_die.find(decl_context); 7792e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 7793e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (iter == m_decl_ctx_to_die.end()) 7794e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return; 7795e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 779603fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton for (DIEPointerSet::iterator pos = iter->second.begin(), end = iter->second.end(); pos != end; ++pos) 7797e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 779803fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton const DWARFDebugInfoEntry *context_die = *pos; 779903fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton 780003fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton if (!results) 780103fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton return; 780203fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton 780303fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton DWARFDebugInfo* info = DebugInfo(); 780403fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton 780503fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton DIEArray die_offsets; 780603fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton 780703fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton DWARFCompileUnit* dwarf_cu = NULL; 780803fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton const DWARFDebugInfoEntry* die = NULL; 7809b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton 7810b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton if (m_using_apple_tables) 7811b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton { 7812b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton if (m_apple_types_ap.get()) 7813b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton m_apple_types_ap->FindByName (name, die_offsets); 7814b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton } 7815b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton else 7816b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton { 7817b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton if (!m_indexed) 7818b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton Index (); 7819b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton 7820b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton m_type_index.Find (ConstString(name), die_offsets); 7821b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton } 7822b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton 7823b5c023af6df0f4f9eddd14284ca986f578c6bee2Greg Clayton const size_t num_matches = die_offsets.size(); 782403fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton 782503fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton if (num_matches) 7826e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 782703fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton for (size_t i = 0; i < num_matches; ++i) 7828e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 782903fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton const dw_offset_t die_offset = die_offsets[i]; 783003fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); 783103fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton 783203fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton if (die->GetParent() != context_die) 783303fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton continue; 783403fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton 783503fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton Type *matching_type = ResolveType (dwarf_cu, die); 783603fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton 783752f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::QualType qual_type = matching_type->GetClangForwardType().GetQualType(); 783803fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton 783903fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton if (const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr())) 784003fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton { 784103fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton clang::TagDecl *tag_decl = tag_type->getDecl(); 784203fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton results->push_back(tag_decl); 784303fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton } 784403fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton else if (const clang::TypedefType *typedef_type = llvm::dyn_cast<clang::TypedefType>(qual_type.getTypePtr())) 784503fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton { 784603fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl(); 784703fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton results->push_back(typedef_decl); 784803fd0d013cbd82ddcb3053a5add8f1f9891eeec5Greg Clayton } 7849e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 7850e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 7851e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 7852e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton} 7853e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 7854e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Claytonvoid 7855e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg ClaytonSymbolFileDWARF::FindExternalVisibleDeclsByName (void *baton, 78564c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton const clang::DeclContext *decl_context, 78574c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton clang::DeclarationName decl_name, 7858e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton llvm::SmallVectorImpl <clang::NamedDecl *> *results) 7859e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton{ 78604c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton 78614c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton switch (decl_context->getDeclKind()) 78624c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton { 78634c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton case clang::Decl::Namespace: 78644c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton case clang::Decl::TranslationUnit: 78654c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton { 78664c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton; 78674c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton symbol_file_dwarf->SearchDeclContext (decl_context, decl_name.getAsString().c_str(), results); 78684c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton } 78694c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton break; 78704c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton default: 78714c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton break; 78724c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton } 7873e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton} 78743fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton 78753fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Claytonbool 78763fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg ClaytonSymbolFileDWARF::LayoutRecordType (void *baton, 78773fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton const clang::RecordDecl *record_decl, 78783fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton uint64_t &size, 78793fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton uint64_t &alignment, 78803fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton llvm::DenseMap <const clang::FieldDecl *, uint64_t> &field_offsets, 78813fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets, 78823fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets) 78833fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton{ 78843fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton; 78853fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton return symbol_file_dwarf->LayoutRecordType (record_decl, size, alignment, field_offsets, base_offsets, vbase_offsets); 78863fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton} 78873fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton 78883fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton 78893fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Claytonbool 78903fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg ClaytonSymbolFileDWARF::LayoutRecordType (const clang::RecordDecl *record_decl, 78913fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton uint64_t &bit_size, 78923fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton uint64_t &alignment, 78933fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton llvm::DenseMap <const clang::FieldDecl *, uint64_t> &field_offsets, 78943fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets, 78953fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets) 78963fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton{ 7897952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO)); 78983fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton RecordDeclToLayoutMap::iterator pos = m_record_decl_to_layout_map.find (record_decl); 78993fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton bool success = false; 79003fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton base_offsets.clear(); 79013fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton vbase_offsets.clear(); 79023fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton if (pos != m_record_decl_to_layout_map.end()) 79033fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton { 79043fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton bit_size = pos->second.bit_size; 79053fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton alignment = pos->second.alignment; 79063fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton field_offsets.swap(pos->second.field_offsets); 790788db4597c7567be050b7a729f7306832f28428bbGreg Clayton base_offsets.swap (pos->second.base_offsets); 790888db4597c7567be050b7a729f7306832f28428bbGreg Clayton vbase_offsets.swap (pos->second.vbase_offsets); 79093fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton m_record_decl_to_layout_map.erase(pos); 79103fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton success = true; 79113fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton } 79123fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton else 79133fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton { 79143fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton bit_size = 0; 79153fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton alignment = 0; 79163fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton field_offsets.clear(); 79173fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton } 79183fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton 79193fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton if (log) 7920952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton GetObjectFile()->GetModule()->LogMessage (log, 79215f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea "SymbolFileDWARF::LayoutRecordType (record_decl = %p, bit_size = %" PRIu64 ", alignment = %" PRIu64 ", field_offsets[%u],base_offsets[%u], vbase_offsets[%u]) success = %i", 79223fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton record_decl, 79233fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton bit_size, 79243fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton alignment, 79253fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton (uint32_t)field_offsets.size(), 79263fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton (uint32_t)base_offsets.size(), 79273fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton (uint32_t)vbase_offsets.size(), 79283fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton success); 79293fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton return success; 79303fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton} 79313fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton 79323fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton 793349ce8969d3154e1560106cfe530444c09410f217Greg ClaytonSymbolFileDWARFDebugMap * 793449ce8969d3154e1560106cfe530444c09410f217Greg ClaytonSymbolFileDWARF::GetDebugMapSymfile () 793549ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 793649ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (m_debug_map_symfile == NULL && !m_debug_map_module_wp.expired()) 793749ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 793849ce8969d3154e1560106cfe530444c09410f217Greg Clayton lldb::ModuleSP module_sp (m_debug_map_module_wp.lock()); 793949ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (module_sp) 794049ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 794149ce8969d3154e1560106cfe530444c09410f217Greg Clayton SymbolVendor *sym_vendor = module_sp->GetSymbolVendor(); 794249ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (sym_vendor) 794349ce8969d3154e1560106cfe530444c09410f217Greg Clayton m_debug_map_symfile = (SymbolFileDWARFDebugMap *)sym_vendor->GetSymbolFile(); 794449ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 794549ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 794649ce8969d3154e1560106cfe530444c09410f217Greg Clayton return m_debug_map_symfile; 794749ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 794849ce8969d3154e1560106cfe530444c09410f217Greg Clayton 79493fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton 7950