From a92e332b09bc3b67ddac94ab5e40e74932c84d29 Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Thu, 10 Jun 2010 23:36:31 +0000 Subject: [PATCH] Make qsort_r usage "portable". Why does a function which seems so simple have to be so complicated? llvm-svn: 105797 --- lldb/include/lldb/Symbol/Symtab.h | 1 + lldb/source/Symbol/Symtab.cpp | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/lldb/include/lldb/Symbol/Symtab.h b/lldb/include/lldb/Symbol/Symtab.h index cb98db92713c..4cdaeb870173 100644 --- a/lldb/include/lldb/Symbol/Symtab.h +++ b/lldb/include/lldb/Symbol/Symtab.h @@ -60,6 +60,7 @@ protected: typedef collection::const_iterator const_iterator; static int CompareSymbolValueByIndex (void *thunk, const void *a, const void *b); + static int CompareSymbolValueByIndexLinux (const void *a, const void *b, void *thunk); void InitNameIndexes (); void InitAddressIndexes (); diff --git a/lldb/source/Symbol/Symtab.cpp b/lldb/source/Symbol/Symtab.cpp index f1ed356d44b2..9a19973b12e1 100644 --- a/lldb/source/Symbol/Symtab.cpp +++ b/lldb/source/Symbol/Symtab.cpp @@ -251,6 +251,10 @@ Symtab::CompareSymbolValueByIndex (void *thunk, const void *a, const void *b) return 1; } +int Symtab::CompareSymbolValueByIndexLinux(const void* a, const void* b, void* thunk) { + CompareSymbolValueByIndex(thunk, a, b); +} + void Symtab::SortSymbolIndexesByValue (std::vector& indexes, bool remove_duplicates) const { @@ -259,7 +263,12 @@ Symtab::SortSymbolIndexesByValue (std::vector& indexes, bool remove_du return; // Sort the indexes in place using qsort + // FIXME: (WRONGDEFINE) Need a better define for this! +#ifdef __APPLE__ ::qsort_r (&indexes[0], indexes.size(), sizeof(uint32_t), (void *)&m_symbols[0], Symtab::CompareSymbolValueByIndex); +#else + ::qsort_r (&indexes[0], indexes.size(), sizeof(uint32_t), CompareSymbolValueByIndexLinux, (void *)&m_symbols[0]); +#endif // Remove any duplicates if requested if (remove_duplicates)