diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-02-13 01:28:03 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-02-13 01:28:03 +0000 |
commit | 219cc61b505960195d538052f0e629b387ad60ca (patch) | |
tree | bc6683c0259415a4cc82178202ccc5f26ba44bc7 | |
parent | 03a2807021acd594add9d4ab5079cc740806b983 (diff) |
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
-rw-r--r-- | lib/CodeGen/Mangle.cpp | 10 | ||||
-rw-r--r-- | test/CodeGen/overloadable.c | 2 |
2 files changed, 10 insertions, 2 deletions
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"); + // <operator-name> ::= cv <type> # (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); + + // <builtin-type> ::= 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; |