forked from OSchip/llvm-project
Refactor local class name mangling and make it
ABI conforming. llvm-svn: 97702
This commit is contained in:
parent
81d4d12504
commit
9eba9dfb0c
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
/// @}
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue