There is a proposal for this mangling on the cxx-abi-dev list, which we should follow rather than making up our own:
http://sourcerytools.com/pipermail/cxx-abi-dev/2012-January/000042.html GCC 4.7 appears to already implement this proposal. On Sat, Feb 25, 2012 at 12:51 PM, Sebastian Redl < [email protected]> wrote: > Author: cornedbee > Date: Sat Feb 25 14:51:07 2012 > New Revision: 151455 > > URL: http://llvm.org/viewvc/llvm-project?rev=151455&view=rev > Log: > Better mangling for new-expressions. Also, although we can't mangle > arbitrary initializer lists yet (we will need this), turn the crash into a > controlled error. > > Modified: > cfe/trunk/lib/AST/ItaniumMangle.cpp > cfe/trunk/test/CodeGenCXX/mangle-exprs.cpp > > Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=151455&r1=151454&r2=151455&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/ItaniumMangle.cpp (original) > +++ cfe/trunk/lib/AST/ItaniumMangle.cpp Sat Feb 25 14:51:07 2012 > @@ -2356,12 +2356,12 @@ > case Expr::CXXThisExprClass: > case Expr::DesignatedInitExprClass: > case Expr::ImplicitValueInitExprClass: > - case Expr::InitListExprClass: > case Expr::ParenListExprClass: > case Expr::LambdaExprClass: > llvm_unreachable("unexpected statement kind"); > > // FIXME: invent manglings for all these. > + case Expr::InitListExprClass: > case Expr::BlockExprClass: > case Expr::CXXPseudoDestructorExprClass: > case Expr::ChooseExprClass: > @@ -2454,7 +2454,6 @@ > } > > case Expr::CXXNewExprClass: { > - // Proposal from David Vandervoorde, 2010.06.30 > const CXXNewExpr *New = cast<CXXNewExpr>(E); > if (New->isGlobalNew()) Out << "gs"; > Out << (New->isArray() ? "na" : "nw"); > @@ -2464,8 +2463,14 @@ > Out << '_'; > mangleType(New->getAllocatedType()); > if (New->hasInitializer()) { > - // FIXME: Does this mean "parenthesized initializer"? > - Out << "pi"; > + // <initializer> is 'pi <expression>* E' in the current ABI for > + // parenthesized initializers, but braced initializers are > unspecified. > + // We use 'bl <expression>* E' for "braced list". "bi" is too easy > to > + // confuse. > + if (New->getInitializationStyle() == CXXNewExpr::ListInit) > + Out << "bl"; > + else > + Out << "pi"; > const Expr *Init = New->getInitializer(); > if (const CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(Init)) { > // Directly inline the initializers. > @@ -2476,6 +2481,12 @@ > } else if (const ParenListExpr *PLE = dyn_cast<ParenListExpr>(Init)) > { > for (unsigned i = 0, e = PLE->getNumExprs(); i != e; ++i) > mangleExpression(PLE->getExpr(i)); > + } else if (New->getInitializationStyle() == CXXNewExpr::ListInit && > + isa<InitListExpr>(Init)) { > + // Only take ParenListExprs apart for list-initialization. > + const InitListExpr *InitList = cast<InitListExpr>(Init); > + for (unsigned i = 0, e = InitList->getNumInits(); i != e; ++i) > + mangleExpression(InitList->getInit(i)); > } else > mangleExpression(Init); > } > > Modified: cfe/trunk/test/CodeGenCXX/mangle-exprs.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-exprs.cpp?rev=151455&r1=151454&r2=151455&view=diff > > ============================================================================== > --- cfe/trunk/test/CodeGenCXX/mangle-exprs.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/mangle-exprs.cpp Sat Feb 25 14:51:07 2012 > @@ -1,5 +1,37 @@ > // RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - > -triple=x86_64-apple-darwin9 | FileCheck %s > > +namespace std { > + typedef decltype(sizeof(int)) size_t; > + > + // libc++'s implementation > + template <class _E> > + class initializer_list > + { > + const _E* __begin_; > + size_t __size_; > + > + initializer_list(const _E* __b, size_t __s) > + : __begin_(__b), > + __size_(__s) > + {} > + > + public: > + typedef _E value_type; > + typedef const _E& reference; > + typedef const _E& const_reference; > + typedef size_t size_type; > + > + typedef const _E* iterator; > + typedef const _E* const_iterator; > + > + initializer_list() : __begin_(nullptr), __size_(0) {} > + > + size_t size() const {return __size_;} > + const _E* begin() const {return __begin_;} > + const _E* end() const {return __begin_ + __size_;} > + }; > +} > + > template < bool condition, typename T = void > > struct enable_if { typedef T type; }; > > @@ -132,3 +164,31 @@ > a(x, &X::member, ip); > } > } > + > +namespace test4 { > + struct X { > + X(int); > + X(std::initializer_list<int>); > + }; > + > + template <typename T> > + void tf1(decltype(new T(1)) p) > + {} > + > + template <typename T> > + void tf2(decltype(new T({1})) p) > + {} > + > + template <typename T> > + void tf3(decltype(new T{1}) p) > + {} > + > + // CHECK: void @_ZN5test43tf1INS_1XEEEvDTnw_T_piLi1EEE > + template void tf1<X>(X*); > + > + // FIXME: Need mangling for braced initializers > + //template void tf2<X>(X*); > + > + // CHECK: void @_ZN5test43tf3INS_1XEEEvDTnw_T_blLi1EEE > + template void tf3<X>(X*); > +} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
