Made many ConstString functions inlined in the header file.
Changed all of our synthesized "___clang" functions, types and variables
that get used in expressions over to have a prefix of "$_lldb". Now when we
do name lookups we can easily switch off of the first '$' character to know
if we should look through only our internal (when first char is '$') stuff,
or when we should look through program variables, functions and types.
Converted all of the clang expression code over to using "const ConstString&"
values for names instead of "const char *" since there were many places that
were converting the "const char *" names into ConstString names and them
throwing them away. We now avoid making a lot of ConstString conversions and
benefit from the quick comparisons in a few extra spots.
Converted a lot of code from LLVM coding conventions into LLDB coding
conventions.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@116634 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Expression/ClangASTSource.cpp b/source/Expression/ClangASTSource.cpp
index ef2cd9f..f30cb40 100644
--- a/source/Expression/ClangASTSource.cpp
+++ b/source/Expression/ClangASTSource.cpp
@@ -21,8 +21,8 @@
void ClangASTSource::StartTranslationUnit(ASTConsumer *Consumer) {
// Tell Sema to ask us when looking into the translation unit's decl.
- Context.getTranslationUnitDecl()->setHasExternalVisibleStorage();
- Context.getTranslationUnitDecl()->setHasExternalLexicalStorage();
+ m_ast_context.getTranslationUnitDecl()->setHasExternalVisibleStorage();
+ m_ast_context.getTranslationUnitDecl()->setHasExternalLexicalStorage();
}
// These are only required for AST source that want to lazily load
@@ -41,13 +41,15 @@
DeclContext::lookup_result ClangASTSource::FindExternalVisibleDeclsByName
(
const DeclContext *decl_ctx,
- DeclarationName decl_name
+ DeclarationName clang_decl_name
)
{
- switch (decl_name.getNameKind()) {
+ switch (clang_decl_name.getNameKind()) {
// Normal identifiers.
case DeclarationName::Identifier:
- break;
+ if (clang_decl_name.getAsIdentifierInfo()->getBuiltinID() != 0)
+ return SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
+ break;
// Operator names. Not important for now.
case DeclarationName::CXXOperatorName:
@@ -57,7 +59,7 @@
// Using directives found in this context.
// Tell Sema we didn't find any or we'll end up getting asked a *lot*.
case DeclarationName::CXXUsingDirective:
- return SetNoExternalVisibleDeclsForName(decl_ctx, decl_name);
+ return SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
// These aren't looked up like this.
case DeclarationName::ObjCZeroArgSelector:
@@ -72,33 +74,28 @@
return DeclContext::lookup_result();
}
-
- std::string name (decl_name.getAsString());
- if (0 == name.compare ("__va_list_tag") ||
- 0 == name.compare ("__int128_t") ||
- 0 == name.compare ("__uint128_t") ||
- 0 == name.compare ("SEL") ||
- 0 == name.compare ("id") ||
- 0 == name.compare ("Class") ||
- 0 == name.compare ("nil") ||
- 0 == name.compare ("gp_offset") ||
- 0 == name.compare ("fp_offset") ||
- 0 == name.compare ("overflow_arg_area") ||
- 0 == name.compare ("reg_save_area") ||
- 0 == name.find ("__builtin") )
- {
- Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
- if (log)
- log->Printf("Ignoring built-in in find external declarations for name: '%s'", name.c_str());
+ std::string decl_name (clang_decl_name.getAsString());
- return SetNoExternalVisibleDeclsForName(decl_ctx, decl_name);
+ if (!m_decl_map.GetLookupsEnabled())
+ {
+ // Wait until we see a '$' at the start of a name before we start doing
+ // any lookups so we can avoid lookup up all of the builtin types.
+ if (!decl_name.empty() && decl_name[0] == '$')
+ {
+ m_decl_map.SetLookupsEnabled (true);
+ }
+ else
+ {
+ return SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
+ }
}
+
+ llvm::SmallVector<NamedDecl*, 4> name_decls;
- llvm::SmallVector<NamedDecl*, 4> Decls;
-
- NameSearchContext NSC(*this, Decls, decl_name, decl_ctx);
- DeclMap.GetDecls(NSC, name.c_str());
- return SetExternalVisibleDeclsForName(decl_ctx, decl_name, Decls);
+ NameSearchContext name_search_context(*this, name_decls, clang_decl_name, decl_ctx);
+ ConstString const_decl_name(decl_name.c_str());
+ m_decl_map.GetDecls(name_search_context, const_decl_name);
+ return SetExternalVisibleDeclsForName (decl_ctx, clang_decl_name, name_decls);
}
void ClangASTSource::MaterializeVisibleDecls(const DeclContext *DC)
@@ -114,103 +111,101 @@
}
clang::ASTContext *NameSearchContext::GetASTContext() {
- return &ASTSource.Context;
+ return &m_ast_source.m_ast_context;
}
clang::NamedDecl *NameSearchContext::AddVarDecl(void *type) {
- IdentifierInfo *ii = Name.getAsIdentifierInfo();
+ IdentifierInfo *ii = m_decl_name.getAsIdentifierInfo();
- clang::NamedDecl *Decl = VarDecl::Create(ASTSource.Context,
- const_cast<DeclContext*>(DC),
+ clang::NamedDecl *Decl = VarDecl::Create(m_ast_source.m_ast_context,
+ const_cast<DeclContext*>(m_decl_context),
SourceLocation(),
ii,
QualType::getFromOpaquePtr(type),
0,
SC_Static,
SC_Static);
- Decls.push_back(Decl);
+ m_decls.push_back(Decl);
return Decl;
}
-clang::NamedDecl *NameSearchContext::AddFunDecl(void *type) {
- clang::FunctionDecl *Decl = FunctionDecl::Create(ASTSource.Context,
- const_cast<DeclContext*>(DC),
- SourceLocation(),
- Name.getAsIdentifierInfo(),
- QualType::getFromOpaquePtr(type),
- NULL,
- SC_Static,
- SC_Static,
- false,
- true);
+clang::NamedDecl *NameSearchContext::AddFunDecl (void *type) {
+ clang::FunctionDecl *func_decl = FunctionDecl::Create (m_ast_source.m_ast_context,
+ const_cast<DeclContext*>(m_decl_context),
+ SourceLocation(),
+ m_decl_name.getAsIdentifierInfo(),
+ QualType::getFromOpaquePtr(type),
+ NULL,
+ SC_Static,
+ SC_Static,
+ false,
+ true);
// We have to do more than just synthesize the FunctionDecl. We have to
// synthesize ParmVarDecls for all of the FunctionDecl's arguments. To do
// this, we raid the function's FunctionProtoType for types.
- QualType QT = QualType::getFromOpaquePtr(type);
- clang::Type *T = QT.getTypePtr();
- const FunctionProtoType *FPT = T->getAs<FunctionProtoType>();
+ QualType qual_type (QualType::getFromOpaquePtr(type));
+ const FunctionProtoType *func_proto_type = qual_type->getAs<FunctionProtoType>();
- if (FPT)
+ if (func_proto_type)
{
- unsigned NumArgs = FPT->getNumArgs();
+ unsigned NumArgs = func_proto_type->getNumArgs();
unsigned ArgIndex;
- ParmVarDecl **ParmVarDecls = new ParmVarDecl*[NumArgs];
+ ParmVarDecl **param_var_decls = new ParmVarDecl*[NumArgs];
for (ArgIndex = 0; ArgIndex < NumArgs; ++ArgIndex)
{
- QualType ArgQT = FPT->getArgType(ArgIndex);
+ QualType arg_qual_type (func_proto_type->getArgType(ArgIndex));
- ParmVarDecls[ArgIndex] = ParmVarDecl::Create(ASTSource.Context,
- const_cast<DeclContext*>(DC),
- SourceLocation(),
- NULL,
- ArgQT,
- NULL,
- SC_Static,
- SC_Static,
- NULL);
+ param_var_decls[ArgIndex] = ParmVarDecl::Create (m_ast_source.m_ast_context,
+ const_cast<DeclContext*>(m_decl_context),
+ SourceLocation(),
+ NULL,
+ arg_qual_type,
+ NULL,
+ SC_Static,
+ SC_Static,
+ NULL);
}
- Decl->setParams(ParmVarDecls, NumArgs);
+ func_decl->setParams(param_var_decls, NumArgs);
- delete [] ParmVarDecls;
+ delete [] param_var_decls;
}
- Decls.push_back(Decl);
+ m_decls.push_back(func_decl);
- return Decl;
+ return func_decl;
}
clang::NamedDecl *NameSearchContext::AddGenericFunDecl()
{
- QualType generic_function_type(ASTSource.Context.getFunctionType(ASTSource.Context.getSizeType(), // result
- NULL, // argument types
- 0, // number of arguments
- true, // variadic?
- 0, // type qualifiers
- false, // has exception specification?
- false, // has any exception specification?
- 0, // number of exceptions
- NULL, // exceptions
- FunctionType::ExtInfo())); // defaults for noreturn, regparm, calling convention
-
+ QualType generic_function_type(m_ast_source.m_ast_context.getFunctionType (m_ast_source.m_ast_context.getSizeType(), // result
+ NULL, // argument types
+ 0, // number of arguments
+ true, // variadic?
+ 0, // type qualifiers
+ false, // has exception specification?
+ false, // has any exception specification?
+ 0, // number of exceptions
+ NULL, // exceptions
+ FunctionType::ExtInfo())); // defaults for noreturn, regparm, calling convention
+
return AddFunDecl(generic_function_type.getAsOpaquePtr());
}
clang::NamedDecl *NameSearchContext::AddTypeDecl(void *type)
{
- QualType QT = QualType::getFromOpaquePtr(type);
- clang::Type *T = QT.getTypePtr();
+ QualType qual_type = QualType::getFromOpaquePtr(type);
- if (TagType *tag_type = dyn_cast<clang::TagType>(T))
+ if (TagType *tag_type = dyn_cast<clang::TagType>(qual_type))
{
TagDecl *tag_decl = tag_type->getDecl();
- Decls.push_back(tag_decl);
+ m_decls.push_back(tag_decl);
return tag_decl;
}