Compute mangling numbers for externally visible local variables and tags. Change the mangler to consistently use discriminators where necessary. Tweak the scheme we use to number decls which are not externally visible to avoid unnecessary discriminators in common cases now that we request them more consistently. Fixes <rdar://problem/14204721>. llvm-svn: 185986
49 lines
1.6 KiB
C++
49 lines
1.6 KiB
C++
//===--- MangleNumberingContext.cpp - Context for mangling numbers --------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines the LambdaMangleContext class, which keeps track of
|
|
// the Itanium C++ ABI mangling numbers for lambda expressions.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "clang/AST/MangleNumberingContext.h"
|
|
#include "clang/AST/ASTContext.h"
|
|
#include "clang/AST/DeclCXX.h"
|
|
|
|
using namespace clang;
|
|
|
|
unsigned
|
|
MangleNumberingContext::getManglingNumber(const CXXMethodDecl *CallOperator) {
|
|
const FunctionProtoType *Proto
|
|
= CallOperator->getType()->getAs<FunctionProtoType>();
|
|
ASTContext &Context = CallOperator->getASTContext();
|
|
|
|
QualType Key = Context.getFunctionType(Context.VoidTy, Proto->getArgTypes(),
|
|
FunctionProtoType::ExtProtoInfo());
|
|
Key = Context.getCanonicalType(Key);
|
|
return ++ManglingNumbers[Key->castAs<FunctionProtoType>()];
|
|
}
|
|
|
|
unsigned
|
|
MangleNumberingContext::getManglingNumber(const BlockDecl *BD) {
|
|
// FIXME: Compute a BlockPointerType? Not obvious how.
|
|
const Type *Ty = 0;
|
|
return ++ManglingNumbers[Ty];
|
|
}
|
|
|
|
unsigned
|
|
MangleNumberingContext::getManglingNumber(const VarDecl *VD) {
|
|
return ++VarManglingNumbers[VD->getIdentifier()];
|
|
}
|
|
|
|
unsigned
|
|
MangleNumberingContext::getManglingNumber(const TagDecl *TD) {
|
|
return ++TagManglingNumbers[TD->getIdentifier()];
|
|
}
|