Skip to content

Commit

Permalink
[ast] CreateParameterDeclaration should use an appropriate DeclContext.
Browse files Browse the repository at this point in the history
Previously CreateParameterDeclaration was always using the translation
unit DeclContext.  We would later go and add parameters to the
FunctionDecl, but internally clang makes a copy when you do this, and
we'd end up with ParmVarDecl's at the global scope as well as in the
function scope.

This fixes the issue.  It's hard to say whether this will introduce
a behavioral change in name lookup, but I know there have been several
hacks introduced in previous years to deal with collisions between
various types of variables, so there's a chance that this patch could
obviate one of those hacks.

Differential Revision: https://reviews.llvm.org/D55571

llvm-svn: 348941
  • Loading branch information
Zachary Turner committed Dec 12, 2018

Unverified

This user has not yet uploaded their public signing key.
1 parent 7da5a08 commit 6753d2d
Showing 5 changed files with 12 additions and 9 deletions.
3 changes: 2 additions & 1 deletion lldb/include/lldb/Symbol/ClangASTContext.h
Original file line number Diff line number Diff line change
@@ -401,7 +401,8 @@ class ClangASTContext : public TypeSystem {
type_quals, cc);
}

clang::ParmVarDecl *CreateParameterDeclaration(const char *name,
clang::ParmVarDecl *CreateParameterDeclaration(clang::DeclContext *decl_ctx,
const char *name,
const CompilerType &param_type,
int storage);

5 changes: 3 additions & 2 deletions lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
Original file line number Diff line number Diff line change
@@ -3407,8 +3407,9 @@ size_t DWARFASTParserClang::ParseChildParameters(
function_param_types.push_back(type->GetForwardCompilerType());

clang::ParmVarDecl *param_var_decl =
m_ast.CreateParameterDeclaration(
name, type->GetForwardCompilerType(), storage);
m_ast.CreateParameterDeclaration(containing_decl_ctx, name,
type->GetForwardCompilerType(),
storage);
assert(param_var_decl);
function_param_decls.push_back(param_var_decl);

Original file line number Diff line number Diff line change
@@ -635,8 +635,8 @@ lldb::FunctionSP SymbolFileNativePDB::CreateFunction(PdbCompilandSymId func_id,
PdbCompilandSymId param_uid(func_id.modi, record_offset);
TypeSP type_sp = GetOrCreateType(param_type);
clang::ParmVarDecl *param = m_clang->CreateParameterDeclaration(
param_name.str().c_str(), type_sp->GetForwardCompilerType(),
clang::SC_None);
function_decl, param_name.str().c_str(),
type_sp->GetForwardCompilerType(), clang::SC_None);
lldbassert(m_uid_to_decl.count(toOpaqueUid(param_uid)) == 0);

m_uid_to_decl[toOpaqueUid(param_uid)] = param;
3 changes: 2 additions & 1 deletion lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp
Original file line number Diff line number Diff line change
@@ -932,7 +932,8 @@ PDBASTParser::GetDeclForSymbol(const llvm::pdb::PDBSymbol &symbol) {
continue;

clang::ParmVarDecl *param = m_ast.CreateParameterDeclaration(
nullptr, arg_type->GetForwardCompilerType(), clang::SC_None);
decl, nullptr, arg_type->GetForwardCompilerType(),
clang::SC_None);
if (param)
params.push_back(param);
}
6 changes: 3 additions & 3 deletions lldb/source/Symbol/ClangASTContext.cpp
Original file line number Diff line number Diff line change
@@ -2214,11 +2214,11 @@ CompilerType ClangASTContext::CreateFunctionType(
}

ParmVarDecl *ClangASTContext::CreateParameterDeclaration(
const char *name, const CompilerType &param_type, int storage) {
clang::DeclContext *decl_ctx, const char *name,
const CompilerType &param_type, int storage) {
ASTContext *ast = getASTContext();
assert(ast != nullptr);
return ParmVarDecl::Create(*ast, ast->getTranslationUnitDecl(),
SourceLocation(), SourceLocation(),
return ParmVarDecl::Create(*ast, decl_ctx, SourceLocation(), SourceLocation(),
name && name[0] ? &ast->Idents.get(name) : nullptr,
ClangUtil::GetQualType(param_type), nullptr,
(clang::StorageClass)storage, nullptr);

0 comments on commit 6753d2d

Please sign in to comment.