From d553f8c57fc77a46f6a1a1c90d7fd8f2d0e96073 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Mon, 21 Sep 2009 01:21:10 +0000 Subject: [PATCH] Start mangling expressions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82423 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/Mangle.cpp | 44 +++++++++++++++++++++++++++++++++++--- test/CodeGenCXX/mangle.cpp | 14 +++++++++++- 2 files changed, 54 insertions(+), 4 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) { + // ::= + // ::= + // ::= + // ::= cl * E # call + // ::= cv expression # conversion with one argument + // ::= cv _ * E # conversion with a different number of arguments + // ::= st # sizeof (a type) + // ::= at # alignof (a type) + // ::= + // ::= + // ::= sr # dependent name + // ::= sr # dependent template-id + // ::= sZ # size of a parameter pack + // ::= + switch (E->getStmtClass()) { + default: assert(false && "Unhandled expression kind!"); + case Expr::DeclRefExprClass: { + const Decl *D = cast(E)->getDecl(); + + switch (D->getKind()) { + default: assert(false && "Unhandled decl kind!"); + case Decl::NonTypeTemplateParm: { + const NonTypeTemplateParmDecl *PD = cast(D); + + if (PD->getIndex() == 0) + Out << "T_"; + else + Out << 'T' << (PD->getIndex() - 1) << '_'; + break; + } + + } + } + } } // FIXME: ::= G # 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: // ::= L E # integer literal diff --git a/test/CodeGenCXX/mangle.cpp b/test/CodeGenCXX/mangle.cpp index dd926b7251..d952f31439 100644 --- a/test/CodeGenCXX/mangle.cpp +++ b/test/CodeGenCXX/mangle.cpp @@ -99,7 +99,7 @@ namespace NS { template void ft1(T) { } } -void g() { +void g1() { // CHECK: @_Z3ft1IidEvT0_T_ ft1(1, 0); @@ -113,6 +113,18 @@ void g() { NS::ft1(1); } +// Expressions +template struct S5 { }; + +template void ft4(S5) { } +void g2() { + // CHECK: @_Z3ft4ILi10EEv2S5IXT_EE + ft4(S5<10>()); + + // CHECK: @_Z3ft4ILi20EEv2S5IXT_EE + ft4(S5<20>()); +} + extern "C++" { // CHECK: @_Z1hv void h() { } -- 2.50.1