aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-02-13 01:28:03 +0000
committerDouglas Gregor <dgregor@apple.com>2009-02-13 01:28:03 +0000
commit219cc61b505960195d538052f0e629b387ad60ca (patch)
treebc6683c0259415a4cc82178202ccc5f26ba44bc7
parent03a2807021acd594add9d4ab5079cc740806b983 (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.cpp10
-rw-r--r--test/CodeGen/overloadable.c2
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;