diff options
Diffstat (limited to 'lib/AST/ItaniumMangle.cpp')
| -rw-r--r-- | lib/AST/ItaniumMangle.cpp | 133 | 
1 files changed, 51 insertions, 82 deletions
| diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index 7c7a5e5de387..851944a42b6e 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -343,17 +343,10 @@ private:    void mangleCXXDtorType(CXXDtorType T);    void mangleTemplateArgs(const ASTTemplateArgumentListInfo &TemplateArgs); -  void mangleTemplateArgs(TemplateName Template, -                          const TemplateArgument *TemplateArgs, -                          unsigned NumTemplateArgs);   -  void mangleTemplateArgs(const TemplateParameterList &PL, -                          const TemplateArgument *TemplateArgs, +  void mangleTemplateArgs(const TemplateArgument *TemplateArgs,                            unsigned NumTemplateArgs); -  void mangleTemplateArgs(const TemplateParameterList &PL, -                          const TemplateArgumentList &AL); -  void mangleTemplateArg(const NamedDecl *P, TemplateArgument A); -  void mangleUnresolvedTemplateArgs(const TemplateArgument *args, -                                    unsigned numArgs); +  void mangleTemplateArgs(const TemplateArgumentList &AL); +  void mangleTemplateArg(TemplateArgument A);    void mangleTemplateParameter(unsigned Index); @@ -570,8 +563,7 @@ void CXXNameMangler::mangleName(const NamedDecl *ND) {      const TemplateArgumentList *TemplateArgs = 0;      if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) {        mangleUnscopedTemplateName(TD); -      TemplateParameterList *TemplateParameters = TD->getTemplateParameters(); -      mangleTemplateArgs(*TemplateParameters, *TemplateArgs); +      mangleTemplateArgs(*TemplateArgs);        return;      } @@ -593,8 +585,7 @@ void CXXNameMangler::mangleName(const TemplateDecl *TD,    if (DC->isTranslationUnit() || isStdNamespace(DC)) {      mangleUnscopedTemplateName(TD); -    TemplateParameterList *TemplateParameters = TD->getTemplateParameters(); -    mangleTemplateArgs(*TemplateParameters, TemplateArgs, NumTemplateArgs); +    mangleTemplateArgs(TemplateArgs, NumTemplateArgs);    } else {      mangleNestedName(TD, TemplateArgs, NumTemplateArgs);    } @@ -693,9 +684,10 @@ void CXXNameMangler::mangleFloat(const llvm::APFloat &f) {  void CXXNameMangler::mangleNumber(const llvm::APSInt &Value) {    if (Value.isSigned() && Value.isNegative()) {      Out << 'n'; -    Value.abs().print(Out, true); -  } else -    Value.print(Out, Value.isSigned()); +    Value.abs().print(Out, /*signed*/ false); +  } else { +    Value.print(Out, /*signed*/ false); +  }  }  void CXXNameMangler::mangleNumber(int64_t Number) { @@ -737,8 +729,7 @@ void CXXNameMangler::manglePrefix(QualType type) {        // FIXME: GCC does not appear to mangle the template arguments when        // the template in question is a dependent template name. Should we        // emulate that badness? -      mangleTemplateArgs(TST->getTemplateName(), TST->getArgs(), -                         TST->getNumArgs()); +      mangleTemplateArgs(TST->getArgs(), TST->getNumArgs());        addSubstitution(QualType(TST, 0));      }    } else if (const DependentTemplateSpecializationType *DTST @@ -751,7 +742,7 @@ void CXXNameMangler::manglePrefix(QualType type) {      // FIXME: GCC does not appear to mangle the template arguments when      // the template in question is a dependent template name. Should we      // emulate that badness? -    mangleTemplateArgs(Template, DTST->getArgs(), DTST->getNumArgs()); +    mangleTemplateArgs(DTST->getArgs(), DTST->getNumArgs());    } else {      // We use the QualType mangle type variant here because it handles      // substitutions. @@ -942,7 +933,7 @@ void CXXNameMangler::mangleUnresolvedPrefix(NestedNameSpecifier *qualifier,        }        } -      mangleUnresolvedTemplateArgs(tst->getArgs(), tst->getNumArgs()); +      mangleTemplateArgs(tst->getArgs(), tst->getNumArgs());        break;      } @@ -959,7 +950,7 @@ void CXXNameMangler::mangleUnresolvedPrefix(NestedNameSpecifier *qualifier,        const DependentTemplateSpecializationType *tst          = cast<DependentTemplateSpecializationType>(type);        mangleSourceName(tst->getIdentifier()); -      mangleUnresolvedTemplateArgs(tst->getArgs(), tst->getNumArgs()); +      mangleTemplateArgs(tst->getArgs(), tst->getNumArgs());        break;      }      } @@ -1228,8 +1219,7 @@ void CXXNameMangler::mangleNestedName(const NamedDecl *ND,    const TemplateArgumentList *TemplateArgs = 0;    if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) {      mangleTemplatePrefix(TD); -    TemplateParameterList *TemplateParameters = TD->getTemplateParameters(); -    mangleTemplateArgs(*TemplateParameters, *TemplateArgs); +    mangleTemplateArgs(*TemplateArgs);    }    else {      manglePrefix(DC, NoFunction); @@ -1246,8 +1236,7 @@ void CXXNameMangler::mangleNestedName(const TemplateDecl *TD,    Out << 'N';    mangleTemplatePrefix(TD); -  TemplateParameterList *TemplateParameters = TD->getTemplateParameters(); -  mangleTemplateArgs(*TemplateParameters, TemplateArgs, NumTemplateArgs); +  mangleTemplateArgs(TemplateArgs, NumTemplateArgs);    Out << 'E';  } @@ -1341,11 +1330,8 @@ void CXXNameMangler::mangleLambda(const CXXRecordDecl *Lambda) {    }    Out << "Ul"; -  DeclarationName Name -    = getASTContext().DeclarationNames.getCXXOperatorName(OO_Call); -  const FunctionProtoType *Proto -    = cast<CXXMethodDecl>(*Lambda->lookup(Name).first)->getType()-> -        getAs<FunctionProtoType>(); +  const FunctionProtoType *Proto = Lambda->getLambdaTypeInfo()->getType()-> +                                   getAs<FunctionProtoType>();    mangleBareFunctionType(Proto, /*MangleReturnType=*/false);            Out << "E"; @@ -1423,8 +1409,7 @@ void CXXNameMangler::manglePrefix(const DeclContext *DC, bool NoFunction) {    const TemplateArgumentList *TemplateArgs = 0;    if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) {      mangleTemplatePrefix(TD); -    TemplateParameterList *TemplateParameters = TD->getTemplateParameters(); -    mangleTemplateArgs(*TemplateParameters, *TemplateArgs); +    mangleTemplateArgs(*TemplateArgs);    }    else if(NoFunction && (isa<FunctionDecl>(ND) || isa<ObjCMethodDecl>(ND)))      return; @@ -2110,6 +2095,7 @@ void CXXNameMangler::mangleNeonVectorType(const VectorType *T) {  //                         ::= Dv [<dimension expression>] _ <element type>  // <extended element type> ::= <element type>  //                         ::= p # AltiVec vector pixel +//                         ::= b # Altivec vector bool  void CXXNameMangler::mangleType(const VectorType *T) {    if ((T->getVectorKind() == VectorType::NeonVector ||         T->getVectorKind() == VectorType::NeonPolyVector)) { @@ -2174,7 +2160,7 @@ void CXXNameMangler::mangleType(const TemplateSpecializationType *T) {      // FIXME: GCC does not appear to mangle the template arguments when      // the template in question is a dependent template name. Should we      // emulate that badness? -    mangleTemplateArgs(T->getTemplateName(), T->getArgs(), T->getNumArgs()); +    mangleTemplateArgs(T->getArgs(), T->getNumArgs());      addSubstitution(QualType(T, 0));    }  } @@ -2200,7 +2186,7 @@ void CXXNameMangler::mangleType(const DependentTemplateSpecializationType *T) {    // FIXME: GCC does not appear to mangle the template arguments when    // the template in question is a dependent template name. Should we    // emulate that badness? -  mangleTemplateArgs(Prefix, T->getArgs(), T->getNumArgs());     +  mangleTemplateArgs(T->getArgs(), T->getNumArgs());        Out << 'E';  } @@ -2414,7 +2400,6 @@ recurse:    case Expr::ExpressionTraitExprClass:    case Expr::VAArgExprClass:    case Expr::CXXUuidofExprClass: -  case Expr::CXXNoexceptExprClass:    case Expr::CUDAKernelCallExprClass:    case Expr::AsTypeExprClass:    case Expr::PseudoObjectExprClass: @@ -2606,6 +2591,11 @@ recurse:      Out <<"_E";      break; +  case Expr::CXXNoexceptExprClass: +    Out << "nx"; +    mangleExpression(cast<CXXNoexceptExpr>(E)->getOperand()); +    break; +    case Expr::UnaryExprOrTypeTraitExprClass: {      const UnaryExprOrTypeTraitExpr *SAE = cast<UnaryExprOrTypeTraitExpr>(E); @@ -2808,7 +2798,15 @@ recurse:      // };      Out << "_SUBSTPACK_";      break; -       + +  case Expr::FunctionParmPackExprClass: { +    // FIXME: not clear how to mangle this! +    const FunctionParmPackExpr *FPPE = cast<FunctionParmPackExpr>(E); +    Out << "v110_SUBSTPACK"; +    mangleFunctionParam(FPPE->getParameterPack()); +    break; +  } +    case Expr::DependentScopeDeclRefExprClass: {      const DependentScopeDeclRefExpr *DRE = cast<DependentScopeDeclRefExpr>(E);      mangleUnresolvedName(DRE->getQualifier(), 0, DRE->getDeclName(), Arity); @@ -3043,50 +3041,28 @@ void CXXNameMangler::mangleTemplateArgs(    // <template-args> ::= I <template-arg>+ E    Out << 'I';    for (unsigned i = 0, e = TemplateArgs.NumTemplateArgs; i != e; ++i) -    mangleTemplateArg(0, TemplateArgs.getTemplateArgs()[i].getArgument()); -  Out << 'E'; -} - -void CXXNameMangler::mangleTemplateArgs(TemplateName Template, -                                        const TemplateArgument *TemplateArgs, -                                        unsigned NumTemplateArgs) { -  if (TemplateDecl *TD = Template.getAsTemplateDecl()) -    return mangleTemplateArgs(*TD->getTemplateParameters(), TemplateArgs, -                              NumTemplateArgs); -   -  mangleUnresolvedTemplateArgs(TemplateArgs, NumTemplateArgs); -} - -void CXXNameMangler::mangleUnresolvedTemplateArgs(const TemplateArgument *args, -                                                  unsigned numArgs) { -  // <template-args> ::= I <template-arg>+ E -  Out << 'I'; -  for (unsigned i = 0; i != numArgs; ++i) -    mangleTemplateArg(0, args[i]); +    mangleTemplateArg(TemplateArgs.getTemplateArgs()[i].getArgument());    Out << 'E';  } -void CXXNameMangler::mangleTemplateArgs(const TemplateParameterList &PL, -                                        const TemplateArgumentList &AL) { +void CXXNameMangler::mangleTemplateArgs(const TemplateArgumentList &AL) {    // <template-args> ::= I <template-arg>+ E    Out << 'I';    for (unsigned i = 0, e = AL.size(); i != e; ++i) -    mangleTemplateArg(PL.getParam(i), AL[i]); +    mangleTemplateArg(AL[i]);    Out << 'E';  } -void CXXNameMangler::mangleTemplateArgs(const TemplateParameterList &PL, -                                        const TemplateArgument *TemplateArgs, +void CXXNameMangler::mangleTemplateArgs(const TemplateArgument *TemplateArgs,                                          unsigned NumTemplateArgs) {    // <template-args> ::= I <template-arg>+ E    Out << 'I';    for (unsigned i = 0; i != NumTemplateArgs; ++i) -    mangleTemplateArg(PL.getParam(i), TemplateArgs[i]); +    mangleTemplateArg(TemplateArgs[i]);    Out << 'E';  } -void CXXNameMangler::mangleTemplateArg(const NamedDecl *P, -                                       TemplateArgument A) { +void CXXNameMangler::mangleTemplateArg(TemplateArgument A) {    // <template-arg> ::= <type>              # type or template    //                ::= X <expression> E    # expression    //                ::= <expr-primary>      # simple expressions @@ -3135,25 +3111,12 @@ void CXXNameMangler::mangleTemplateArg(const NamedDecl *P,      mangleIntegerLiteral(A.getIntegralType(), A.getAsIntegral());      break;    case TemplateArgument::Declaration: { -    assert(P && "Missing template parameter for declaration argument");      //  <expr-primary> ::= L <mangled-name> E # external name -    //  <expr-primary> ::= L <type> 0 E      // Clang produces AST's where pointer-to-member-function expressions      // and pointer-to-function expressions are represented as a declaration not      // an expression. We compensate for it here to produce the correct mangling. -    const NonTypeTemplateParmDecl *Parameter = cast<NonTypeTemplateParmDecl>(P); - -    // Handle NULL pointer arguments. -    if (!A.getAsDecl()) { -      Out << "L"; -      mangleType(Parameter->getType()); -      Out << "0E"; -      break; -    } -     - -    NamedDecl *D = cast<NamedDecl>(A.getAsDecl()); -    bool compensateMangling = !Parameter->getType()->isReferenceType(); +    ValueDecl *D = A.getAsDecl(); +    bool compensateMangling = !A.isDeclForReferenceParam();      if (compensateMangling) {        Out << 'X';        mangleOperatorName(OO_Amp, 1); @@ -3176,14 +3139,20 @@ void CXXNameMangler::mangleTemplateArg(const NamedDecl *P,      break;    } -       +  case TemplateArgument::NullPtr: { +    //  <expr-primary> ::= L <type> 0 E +    Out << 'L'; +    mangleType(A.getNullPtrType()); +    Out << "0E"; +    break; +  }    case TemplateArgument::Pack: {      // Note: proposal by Mike Herrick on 12/20/10      Out << 'J';      for (TemplateArgument::pack_iterator PA = A.pack_begin(),                                         PAEnd = A.pack_end();           PA != PAEnd; ++PA) -      mangleTemplateArg(P, *PA); +      mangleTemplateArg(*PA);      Out << 'E';    }    } | 
