Refactor local class name mangling and make it

ABI conforming.

llvm-svn: 97702
This commit is contained in:
Fariborz Jahanian 2010-03-04 01:02:03 +00:00
parent 81d4d12504
commit 9eba9dfb0c
4 changed files with 52 additions and 15 deletions

View File

@ -1204,7 +1204,7 @@ static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old,
void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD) {
const FunctionDecl *D = cast<FunctionDecl>(GD.getDecl());
const llvm::FunctionType *Ty = getTypes().GetFunctionType(GD);
getMangleContext().mangleInitDiscriminator();
// Get or create the prototype for the function.
llvm::Constant *Entry = GetAddrOfFunction(GD, Ty);

View File

@ -65,8 +65,6 @@ static const CXXMethodDecl *getStructor(const CXXMethodDecl *MD) {
}
static const unsigned UnknownArity = ~0U;
static unsigned Discriminator = 0;
static llvm::DenseMap<const NamedDecl*, unsigned> Uniquifier;
/// CXXNameMangler - Manage the mangling of a single name.
class CXXNameMangler {
@ -672,17 +670,14 @@ void CXXNameMangler::mangleLocalName(const NamedDecl *ND) {
Out << 'E';
mangleNestedName(ND, DC, true /*NoFunction*/);
// FIXME. This still does not conform to ABI and does not cover all cases.
unsigned &discriminator = Uniquifier[ND];
if (!discriminator)
discriminator = ++Discriminator;
if (discriminator == 1)
return;
unsigned disc = discriminator-2;
if (disc < 10)
Out << '_' << disc;
else
Out << "__" << disc << '_';
// FIXME. This still does not cover all cases.
unsigned disc;
if (Context.getNextDiscriminator(ND, disc)) {
if (disc < 10)
Out << '_' << disc;
else
Out << "__" << disc << '_';
}
return;
}

View File

@ -44,7 +44,9 @@ class MangleContext {
ASTContext &Context;
llvm::DenseMap<const TagDecl *, uint64_t> AnonStructIds;
unsigned Discriminator;
llvm::DenseMap<const NamedDecl*, unsigned> Uniquifier;
public:
explicit MangleContext(ASTContext &Context)
: Context(Context) { }
@ -85,7 +87,20 @@ public:
llvm::SmallVectorImpl<char> &);
void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type,
llvm::SmallVectorImpl<char> &);
void mangleInitDiscriminator() {
Discriminator = 0;
}
bool getNextDiscriminator(const NamedDecl *ND, unsigned &disc) {
unsigned &discriminator = Uniquifier[ND];
if (!discriminator)
discriminator = ++Discriminator;
if (discriminator == 1)
return false;
disc = discriminator-2;
return true;
}
/// @}
};

View File

@ -2,6 +2,8 @@
// CHECK: @_ZZ4FUNCvEN4SSSSC1ERKf
// CHECK: @_ZZ4FUNCvEN4SSSSC2E_0RKf
// CHECK: @_ZZ4GORFfEN4SSSSC1ERKf
// CHECK: @_ZZ4GORFfEN4SSSSC2E_0RKf
void FUNC ()
{
@ -28,3 +30,28 @@ void FUNC ()
SSSS VAR2(IVAR2);
}
}
void GORF (float IVAR1)
{
{
struct SSSS
{
float bv;
SSSS( const float& from): bv(from) { }
};
SSSS VAR1(IVAR1);
}
{
float IVAR2 ;
struct SSSS
{
SSSS( const float& from) {}
};
SSSS VAR2(IVAR2);
}
}