diff options
author | Anders Carlsson <andersca@mac.com> | 2009-09-21 01:21:10 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-09-21 01:21:10 +0000 |
commit | d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073 (patch) | |
tree | 3778a7bb29a38c35d1379d5f5fe65264d6150cf1 /lib/CodeGen/Mangle.cpp | |
parent | 62d1fc0945ebde28ebfa150a039cb05f055122af (diff) |
Start mangling expressions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82423 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/Mangle.cpp')
-rw-r--r-- | lib/CodeGen/Mangle.cpp | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index 057d57e951..48445e6cae 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -96,7 +96,7 @@ namespace { void mangleType(const TagType*); void mangleBareFunctionType(const FunctionType *T, bool MangleReturnType); - void mangleExpression(Expr *E); + void mangleExpression(const Expr *E); void mangleCXXCtorType(CXXCtorType T); void mangleCXXDtorType(CXXDtorType T); @@ -917,8 +917,41 @@ void CXXNameMangler::mangleType(const ExtQualType *T) { mangleType(QualType(T->getBaseType(), 0)); } -void CXXNameMangler::mangleExpression(Expr *E) { - assert(false && "Cannot mangle expressions yet"); +void CXXNameMangler::mangleExpression(const Expr *E) { + // <expression> ::= <unary operator-name> <expression> + // ::= <binary operator-name> <expression> <expression> + // ::= <trinary operator-name> <expression> <expression> <expression> + // ::= cl <expression>* E # call + // ::= cv <type> expression # conversion with one argument + // ::= cv <type> _ <expression>* E # conversion with a different number of arguments + // ::= st <type> # sizeof (a type) + // ::= at <type> # alignof (a type) + // ::= <template-param> + // ::= <function-param> + // ::= sr <type> <unqualified-name> # dependent name + // ::= sr <type> <unqualified-name> <template-args> # dependent template-id + // ::= sZ <template-param> # size of a parameter pack + // ::= <expr-primary> + switch (E->getStmtClass()) { + default: assert(false && "Unhandled expression kind!"); + case Expr::DeclRefExprClass: { + const Decl *D = cast<DeclRefExpr>(E)->getDecl(); + + switch (D->getKind()) { + default: assert(false && "Unhandled decl kind!"); + case Decl::NonTypeTemplateParm: { + const NonTypeTemplateParmDecl *PD = cast<NonTypeTemplateParmDecl>(D); + + if (PD->getIndex() == 0) + Out << "T_"; + else + Out << 'T' << (PD->getIndex() - 1) << '_'; + break; + } + + } + } + } } // FIXME: <type> ::= G <type> # imaginary (C 2000) @@ -997,6 +1030,11 @@ void CXXNameMangler::mangleTemplateArgument(const TemplateArgument &A) { case TemplateArgument::Type: mangleType(A.getAsType()); break; + case TemplateArgument::Expression: + Out << 'X'; + mangleExpression(A.getAsExpr()); + Out << 'E'; + break; case TemplateArgument::Integral: // <expr-primary> ::= L <type> <value number> E # integer literal |