Add support for mangling C++ constructors. Review appreciated (I'm looking at you, Doug)

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69150 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anders Carlsson 2009-04-15 05:36:58 +00:00
Родитель 839324d564
Коммит 3ac86b59b0
2 изменённых файлов: 57 добавлений и 10 удалений

Просмотреть файл

@ -29,12 +29,16 @@ namespace {
ASTContext &Context;
llvm::raw_ostream &Out;
const CXXConstructorDecl *Ctor;
CXXCtorType CtorType;
public:
CXXNameMangler(ASTContext &C, llvm::raw_ostream &os)
: Context(C), Out(os) { }
: Context(C), Out(os), Ctor(0), CtorType(Ctor_Complete) { }
bool mangle(const NamedDecl *D);
void mangleGuardVariable(const VarDecl *D);
void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type);
private:
bool mangleFunctionDecl(const FunctionDecl *FD);
@ -58,6 +62,7 @@ namespace {
void mangleType(const TemplateTypeParmType *T);
void mangleType(const ObjCInterfaceType *T);
void mangleExpression(Expr *E);
void mangleCXXCtorType(CXXCtorType T);
};
}
@ -125,6 +130,15 @@ bool CXXNameMangler::mangle(const NamedDecl *D) {
return false;
}
void CXXNameMangler::mangleCXXCtor(const CXXConstructorDecl *D,
CXXCtorType Type) {
assert(!Ctor && "Ctor already set!");
Ctor = D;
CtorType = Type;
mangle(D);
}
void CXXNameMangler::mangleGuardVariable(const VarDecl *D)
{
// <special-name> ::= GV <object name> # Guard variable for one-time
@ -184,13 +198,14 @@ void CXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND) {
break;
case DeclarationName::CXXConstructorName:
// <ctor-dtor-name> ::= C1 # complete object constructor
// ::= C2 # base object constructor
// ::= C3 # complete object allocating constructor
//
// FIXME: We don't even have all of these constructors
// in the AST yet.
Out << "C1";
if (ND == Ctor)
// If the named decl is the C++ constructor we're mangling, use the
// type we were given.
mangleCXXCtorType(CtorType);
else
// Otherwise, use the complete constructor name. This is relevant if a
// class with a constructor is declared within a constructor.
mangleCXXCtorType(Ctor_Complete);
break;
case DeclarationName::CXXDestructorName:
@ -578,6 +593,24 @@ void CXXNameMangler::mangleExpression(Expr *E) {
assert(false && "Cannot mangle expressions yet");
}
void CXXNameMangler::mangleCXXCtorType(CXXCtorType T) {
// <ctor-dtor-name> ::= C1 # complete object constructor
// ::= C2 # base object constructor
// ::= C3 # complete object allocating constructor
//
switch (T) {
case Ctor_Complete:
Out << "C1";
break;
case Ctor_Base:
Out << "C2";
break;
case Ctor_CompleteAllocating:
Out << "C3";
break;
}
}
namespace clang {
/// \brief Mangles the name of the declaration D and emits that name
/// to the given output stream.
@ -597,7 +630,8 @@ namespace clang {
return true;
}
/// mangleGuardVariable - Mangles the m
/// mangleGuardVariable - Returns the mangled name for a guard variable
/// for the passed in VarDecl.
void mangleGuardVariable(const VarDecl *D, ASTContext &Context,
llvm::raw_ostream &os) {
CXXNameMangler Mangler(Context, os);
@ -605,5 +639,13 @@ namespace clang {
os.flush();
}
void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type,
ASTContext &Context, llvm::raw_ostream &os) {
CXXNameMangler Mangler(Context, os);
Mangler.mangleCXXCtor(D, Type);
os.flush();
}
}

Просмотреть файл

@ -18,12 +18,15 @@
#ifndef LLVM_CLANG_CODEGEN_MANGLE_H
#define LLVM_CLANG_CODEGEN_MANGLE_H
#include "CGCXX.h"
namespace llvm {
class raw_ostream;
}
namespace clang {
class ASTContext;
class CXXConstructorDecl;
class NamedDecl;
class VarDecl;
@ -31,6 +34,8 @@ namespace clang {
llvm::raw_ostream &os);
void mangleGuardVariable(const VarDecl *D, ASTContext &Context,
llvm::raw_ostream &os);
void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type,
ASTContext &Context, llvm::raw_ostream &os);
}
#endif