From: Douglas Gregor Date: Fri, 13 Feb 2009 01:28:03 +0000 (+0000) Subject: Add mangling for variadic functions and conversion functions X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=219cc61b505960195d538052f0e629b387ad60ca;p=clang Add mangling for variadic functions and conversion functions git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64425 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index a97ac58dd7..9ad98d787a 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -161,7 +161,9 @@ void CXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND) { break; case DeclarationName::CXXConversionFunctionName: - assert(false && "Not sure how to mangle conversion functions yet"); + // ::= cv # (cast) + Out << "cv"; + mangleType(Context.getCanonicalType(Name.getCXXNameType())); break; case DeclarationName::CXXOperatorName: @@ -171,6 +173,7 @@ void CXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND) { case DeclarationName::CXXUsingDirective: assert(false && "Can't mangle a using directive name!"); + break; } } @@ -398,7 +401,6 @@ void CXXNameMangler::mangleType(const BuiltinType *T) { // ::= d # double // ::= e # long double, __float80 // UNSUPPORTED: ::= g # __float128 - // NOT HERE: ::= z # ellipsis // UNSUPPORTED: ::= Dd # IEEE 754r decimal floating point (64 bits) // UNSUPPORTED: ::= De # IEEE 754r decimal floating point (128 bits) // UNSUPPORTED: ::= Df # IEEE 754r decimal floating point (32 bits) @@ -455,6 +457,10 @@ void CXXNameMangler::mangleBareFunctionType(const FunctionType *T, ArgEnd = Proto->arg_type_end(); Arg != ArgEnd; ++Arg) mangleType(*Arg); + + // ::= z # ellipsis + if (Proto->isVariadic()) + Out << 'z'; } void CXXNameMangler::mangleType(const TagType *T) { diff --git a/test/CodeGen/overloadable.c b/test/CodeGen/overloadable.c index 6b1cb351e6..4e24c91a79 100644 --- a/test/CodeGen/overloadable.c +++ b/test/CodeGen/overloadable.c @@ -9,6 +9,8 @@ v4hi __attribute__((overloadable)) f(v4hi x) { return x; } struct X { }; void __attribute__((overloadable)) f(struct X (*ptr)[10]) { } +void __attribute__((overloadable)) f(int x, int y, ...) { } + int main() { int iv = 17; float fv = 3.0f;