Switch the standard DeclarationName comparator to be a tri-valued comparator.
Use that while fixing a nasty misuse of qsort in vtable codegen which, somehow,
has not actually caused a crash.

llvm-svn: 96062
diff --git a/clang/lib/CodeGen/CGVtable.cpp b/clang/lib/CodeGen/CGVtable.cpp
index a5ba11f..8c172a2 100644
--- a/clang/lib/CodeGen/CGVtable.cpp
+++ b/clang/lib/CodeGen/CGVtable.cpp
@@ -1109,9 +1109,10 @@
   }
 
   static int DclCmp(const void *p1, const void *p2) {
-    const CXXMethodDecl *MD1 = (const CXXMethodDecl *)p1;
-    const CXXMethodDecl *MD2 = (const CXXMethodDecl *)p2;
-    return (MD1->getIdentifier() - MD2->getIdentifier());
+    const CXXMethodDecl *MD1 = *(const CXXMethodDecl *const *)p1;
+    const CXXMethodDecl *MD2 = *(const CXXMethodDecl *const *)p2;
+
+    return (DeclarationName::compare(MD1->getDeclName(), MD2->getDeclName()));
   }
   
   void MergeForwarding() {
@@ -1127,7 +1128,7 @@
     for (A_t::iterator I = A.begin(),
            E = A.end(); I != E; ++I) {
       A_t::iterator J = I;
-      while (++J != E  && DclCmp(*I, *J) == 0)
+      while (++J != E  && DclCmp(I, J) == 0)
         if (DclIsSame(*I, *J)) {
           if (0) printf("connecting %s\n", (*I)->getNameAsCString());
           ForwardUnique[*J] = *I;