Remove duplicate entries while printing decls for external symbols.

Some libcall names are same, so they were getting printed twice.

llvm-svn: 77215
This commit is contained in:
Sanjiv Gupta 2009-07-27 18:04:34 +00:00
parent c0137150ee
commit 96b3d4a2f9
1 changed files with 23 additions and 2 deletions

View 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";