Remove duplicate entries while printing decls for external symbols.
authorSanjiv Gupta <sanjiv.gupta@microchip.com>
Mon, 27 Jul 2009 18:04:34 +0000 (18:04 +0000)
committerSanjiv Gupta <sanjiv.gupta@microchip.com>
Mon, 27 Jul 2009 18:04:34 +0000 (18:04 +0000)
Some libcall names are same, so they were getting printed twice.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77215 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PIC16/PIC16AsmPrinter.cpp

index 443ced0c1847b8f43057273d55b55f16e2b9cb9a..ec86585c1dba278eacd76af8c38d9b98cbb789b6 100644 (file)
@@ -156,6 +156,26 @@ void PIC16AsmPrinter::printCCOperand(const MachineInstr *MI, int opNum) {
   O << PIC16CondCodeToString((PIC16CC::CondCodes)CC);
 }
 
+// This function is used to sort the decls list.
+// should return true if s1 should come before s2.
+static bool is_before(const char *s1, const char *s2) {
+  std::string str1 = s1;
+  std::string str2 = s2;
+  int i = str1.compare(str2);
+  // Return true if s1 is smaller or equal.
+  if (i <= 0) return true;
+  // false if s1 should come after s2.
+  return false;
+}
+
+// This is used by list::unique below. 
+// unique will filter out duplicates if it knows them.
+static bool is_duplicate(const char *s1, const char *s2) {
+  std::string str1 = s1;
+  std::string str2 = s2;
+  return str1 == str2;
+}
+
 /// printLibcallDecls - print the extern declarations for compiler 
 /// intrinsics.
 ///
@@ -165,8 +185,9 @@ void PIC16AsmPrinter::printLibcallDecls(void) {
 
   O << TAI->getCommentString() << "External decls for libcalls - BEGIN." <<"\n";
   // Remove duplicate entries.
-  LibcallDecls.sort();
-  LibcallDecls.unique();
+  LibcallDecls.sort(is_before);
+  LibcallDecls.unique(is_duplicate);
+
   for (std::list<const char*>::const_iterator I = LibcallDecls.begin(); 
        I != LibcallDecls.end(); I++) {
     O << TAI->getExternDirective() << *I << "\n";