blob: 129ef6cd5a2b43f90a667223c4108cfe2676b32b [file] [log] [blame]
//===-- AppleObjCSymbolVendor.cpp -------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "AppleObjCSymbolVendor.h"
#include "lldb/Core/Log.h"
#include "lldb/Target/Process.h"
#include "lldb/Target/Target.h"
#include "clang/AST/ASTContext.h"
using namespace lldb_private;
AppleObjCSymbolVendor::AppleObjCSymbolVendor(Process *process) :
SymbolVendor(lldb::ModuleSP()),
m_process(process->shared_from_this()),
m_ast_ctx(process->GetTarget().GetArchitecture().GetTriple().getTriple().c_str())
{
}
uint32_t
AppleObjCSymbolVendor::FindTypes (const SymbolContext& sc,
const ConstString &name,
const ClangNamespaceDecl *namespace_decl,
bool append,
uint32_t max_matches,
TypeList& types)
{
lldb::LogSP log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_SYMBOLS)); // FIXME - a more appropriate log channel?
if (log)
log->Printf("ObjC SymbolVendor asked for '%s'",
name.AsCString());
if (!append)
types.Clear();
uint32_t ret = 0;
ModuleList &images = m_process->GetTarget().GetImages();
for (size_t image_index = 0, end_index = images.GetSize();
image_index < end_index;
++image_index)
{
Module *image = images.GetModulePointerAtIndex(image_index);
if (!image)
continue;
SymbolVendor *symbol_vendor = image->GetSymbolVendor();
if (!symbol_vendor)
continue;
SymbolFile *symbol_file = image->GetSymbolVendor()->GetSymbolFile();
if (!symbol_file || !(symbol_file->GetAbilities() & SymbolFile::RuntimeTypes))
continue;
const bool inferior_append = true;
ret += symbol_file->FindTypes (sc, name, namespace_decl, inferior_append, max_matches - ret, types);
if (ret >= max_matches)
break;
}
return ret;
}