diff options
author | emaste <emaste@FreeBSD.org> | 2015-02-09 01:44:09 +0000 |
---|---|---|
committer | emaste <emaste@FreeBSD.org> | 2015-02-09 01:44:09 +0000 |
commit | d61b076ede88b56f3372a55e7d1eac6a9d717120 (patch) | |
tree | a8f4b3abea3e6937e60728991c736e6e3d322fc1 /source/Target/ObjCLanguageRuntime.cpp | |
parent | 0c2019f4ca6b2dc6d710f6bb16a0e3ed10271531 (diff) | |
download | FreeBSD-src-d61b076ede88b56f3372a55e7d1eac6a9d717120.zip FreeBSD-src-d61b076ede88b56f3372a55e7d1eac6a9d717120.tar.gz |
Import LLDB as of upstream SVN 228549 (git 39760838)
Diffstat (limited to 'source/Target/ObjCLanguageRuntime.cpp')
-rw-r--r-- | source/Target/ObjCLanguageRuntime.cpp | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/source/Target/ObjCLanguageRuntime.cpp b/source/Target/ObjCLanguageRuntime.cpp index b182407..3d7a902 100644 --- a/source/Target/ObjCLanguageRuntime.cpp +++ b/source/Target/ObjCLanguageRuntime.cpp @@ -34,9 +34,14 @@ ObjCLanguageRuntime::~ObjCLanguageRuntime() ObjCLanguageRuntime::ObjCLanguageRuntime (Process *process) : LanguageRuntime (process), + m_impl_cache(), m_has_new_literals_and_indexing (eLazyBoolCalculate), m_isa_to_descriptor(), - m_isa_to_descriptor_stop_id (UINT32_MAX) + m_hash_to_isa_map(), + m_type_size_cache(), + m_isa_to_descriptor_stop_id (UINT32_MAX), + m_complete_class_cache(), + m_negative_complete_class_cache() { } @@ -626,3 +631,42 @@ ObjCLanguageRuntime::GetEncodingToType () { return nullptr; } + +bool +ObjCLanguageRuntime::GetTypeBitSize (const ClangASTType& clang_type, + uint64_t &size) +{ + void *opaque_ptr = clang_type.GetQualType().getAsOpaquePtr(); + size = m_type_size_cache.Lookup(opaque_ptr); + // an ObjC object will at least have an ISA, so 0 is definitely not OK + if (size > 0) + return true; + + ClassDescriptorSP class_descriptor_sp = GetClassDescriptorFromClassName(clang_type.GetTypeName()); + if (!class_descriptor_sp) + return false; + + int32_t max_offset = INT32_MIN; + uint64_t sizeof_max = 0; + bool found = false; + + for (size_t idx = 0; + idx < class_descriptor_sp->GetNumIVars(); + idx++) + { + const auto& ivar = class_descriptor_sp->GetIVarAtIndex(idx); + int32_t cur_offset = ivar.m_offset; + if (cur_offset > max_offset) + { + max_offset = cur_offset; + sizeof_max = ivar.m_size; + found = true; + } + } + + size = 8 * (max_offset + sizeof_max); + if (found) + m_type_size_cache.Insert(opaque_ptr, size); + + return found; +} |