[Lldb-commits] [lldb] r105834 - in /lldb/trunk: include/lldb/Symbol/Symtab.h source/Symbol/Symtab.cpp

Owen Anderson resistor at mac.com
Fri Jun 11 14:40:17 PDT 2010


OK, so I did some measurement on this issue, using optimized (-Os) builds of LLDB, without debug symbols, targeting x86-64.

When using qsort_r, Symtab.o is 43KB.
When using std::sort, Symtab.o is 46KB.
A 7% increase in file size on a single file.

The qsort_r version of LLDB.framework is 32,840,512 bytes.
The std::sort version of LLDB.framework is 32,840,937 bytes.
A 0.001% increase in file size of the overall library.  :-)

Interestingly, it appears that those extra symbols get coalesced with ones already present (presumably in the LLVM libraries), so it doesn't actually add much at all to the resulting library.

--Owen

On Jun 11, 2010, at 2:03 PM, Jason Molenda wrote:

> Please back this change out Owen, until you've addressed the point Greg made here -
> 	http://lists.cs.uiuc.edu/pipermail/lldb-dev/2010-June/000039.html
> 
> J
> 
> On Jun 11, 2010, at 1:52 PM, Owen Anderson wrote:
> 
>> Author: resistor
>> Date: Fri Jun 11 15:52:57 2010
>> New Revision: 105834
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=105834&view=rev
>> Log:
>> Replace qsort_r with std::sort.  This gets rid of a lot of portability
>> ickiness, and is cleaner to boot.
>> 
>> I'm fairly confident that I converted the comparator over properly,
>> and what testing I could figure out how to run seemed to pass, but it
>> would be great if someone in the know could check behind me.
>> 
>> Modified:
>>   lldb/trunk/include/lldb/Symbol/Symtab.h
>>   lldb/trunk/source/Symbol/Symtab.cpp
>> 
>> Modified: lldb/trunk/include/lldb/Symbol/Symtab.h
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Symtab.h?rev=105834&r1=105833&r2=105834&view=diff
>> ==============================================================================
>> --- lldb/trunk/include/lldb/Symbol/Symtab.h (original)
>> +++ lldb/trunk/include/lldb/Symbol/Symtab.h Fri Jun 11 15:52:57 2010
>> @@ -59,8 +59,6 @@
>>    typedef collection::iterator        iterator;
>>    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 ();
>> 
>> 
>> Modified: lldb/trunk/source/Symbol/Symtab.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Symtab.cpp?rev=105834&r1=105833&r2=105834&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Symbol/Symtab.cpp (original)
>> +++ lldb/trunk/source/Symbol/Symtab.cpp Fri Jun 11 15:52:57 2010
>> @@ -214,46 +214,36 @@
>>    const Symbol *symbols;
>> };
>> 
>> -int
>> -Symtab::CompareSymbolValueByIndex (void *thunk, const void *a, const void *b)
>> -{
>> -    const Symbol *symbols = (const Symbol *)thunk;
>> -    uint32_t index_a = *((uint32_t *) a);
>> -    uint32_t index_b = *((uint32_t *) b);
>> -
>> -    addr_t value_a;
>> -    addr_t value_b;
>> -    if (symbols[index_a].GetValue().GetSection() == symbols[index_b].GetValue().GetSection())
>> -    {
>> -        value_a = symbols[index_a].GetValue ().GetOffset();
>> -        value_b = symbols[index_b].GetValue ().GetOffset();
>> -    }
>> -    else
>> -    {
>> -        value_a = symbols[index_a].GetValue ().GetFileAddress();
>> -        value_b = symbols[index_b].GetValue ().GetFileAddress();
>> -    }
>> -
>> -    if (value_a == value_b)
>> -    {
>> -        // The if the values are equal, use the original symbol user ID
>> -        lldb::user_id_t uid_a = symbols[index_a].GetID();
>> -        lldb::user_id_t uid_b = symbols[index_b].GetID();
>> -        if (uid_a < uid_b)
>> -            return -1;
>> -        if (uid_a > uid_b)
>> -            return 1;
>> -        return 0;
>> -    }
>> -    else if (value_a < value_b)
>> -        return -1;
>> -
>> -    return 1;
>> -}
>> +namespace {
>> +    struct SymbolIndexComparator {
>> +        const std::vector<Symbol>& symbols;
>> +        SymbolIndexComparator(const std::vector<Symbol>& s) : symbols(s) { }
>> +        bool operator()(uint32_t index_a, uint32_t index_b) {
>> +            addr_t value_a;
>> +            addr_t value_b;
>> +            if (symbols[index_a].GetValue().GetSection() == symbols[index_b].GetValue().GetSection()) {
>> +                value_a = symbols[index_a].GetValue ().GetOffset();
>> +                value_b = symbols[index_b].GetValue ().GetOffset();
>> +            } else {
>> +                value_a = symbols[index_a].GetValue ().GetFileAddress();
>> +                value_b = symbols[index_b].GetValue ().GetFileAddress();
>> +            }
>> 
>> -int Symtab::CompareSymbolValueByIndexLinux(const void* a, const void* b, void* thunk) 
>> -{
>> -    return CompareSymbolValueByIndex(thunk, a, b);
>> +            if (value_a == value_b) {
>> +                // The if the values are equal, use the original symbol user ID
>> +                lldb::user_id_t uid_a = symbols[index_a].GetID();
>> +                lldb::user_id_t uid_b = symbols[index_b].GetID();
>> +                if (uid_a < uid_b)
>> +                    return true;
>> +                if (uid_a > uid_b)
>> +                    return false;
>> +                return false;
>> +            } else if (value_a < value_b)
>> +                return true;
>> +        
>> +            return false;
>> +        }
>> +    };
>> }
>> 
>> void
>> @@ -263,13 +253,8 @@
>>    if (indexes.size() <= 1)
>>        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
>> +    // Sort the indexes in place using std::sort
>> +    std::sort(indexes.begin(), indexes.end(), SymbolIndexComparator(m_symbols));
>> 
>>    // Remove any duplicates if requested
>>    if (remove_duplicates)
>> 
>> 
>> _______________________________________________
>> lldb-commits mailing list
>> lldb-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
> 




More information about the lldb-commits mailing list