diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-04-23 01:29:05 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-04-23 01:29:05 +0000 |
commit | 22b0ada8cf3b1c0c73714bb2079cb3ade62b43cb (patch) | |
tree | 65bf953d9758570e9a553c43a139df076efacaaa | |
parent | 29bd76fd040dea09fe65ee9eabd0fd7d5149e916 (diff) | |
download | bcm5719-llvm-22b0ada8cf3b1c0c73714bb2079cb3ade62b43cb.tar.gz bcm5719-llvm-22b0ada8cf3b1c0c73714bb2079cb3ade62b43cb.zip |
Use std::sort instead of qsort.
- Notably, there was a memory error here, SkipIvars does not have to
be the same size as IvarsInfo.
- Fariborz, please check.
llvm-svn: 69850
-rw-r--r-- | clang/lib/CodeGen/CGObjCMac.cpp | 22 |
1 files changed, 7 insertions, 15 deletions
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index cf15d2e62c5..03f15ee7ed5 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -707,6 +707,11 @@ public: unsigned int ivar_bytepos; unsigned int ivar_size; GC_IVAR() : ivar_bytepos(0), ivar_size(0) {} + + // Allow sorting based on byte pos. + bool operator<(const GC_IVAR &b) const { + return ivar_bytepos < b.ivar_bytepos; + } }; class SKIP_SCAN { @@ -3108,19 +3113,6 @@ void CGObjCCommonMac::BuildAggrIvarLayout(const ObjCInterfaceDecl *OI, } } -static int -IvarBytePosCompare(const void *a, const void *b) -{ - unsigned int sa = ((CGObjCCommonMac::GC_IVAR *)a)->ivar_bytepos; - unsigned int sb = ((CGObjCCommonMac::GC_IVAR *)b)->ivar_bytepos; - - if (sa < sb) - return -1; - if (sa > sb) - return 1; - return 0; -} - /// BuildIvarLayout - Builds ivar layout bitmap for the class /// implementation for the __strong or __weak case. /// The layout map displays which words in ivar list must be skipped @@ -3168,9 +3160,9 @@ llvm::Constant *CGObjCCommonMac::BuildIvarLayout( // Sort on byte position in case we encounterred a union nested in // the ivar list. if (hasUnion && !IvarsInfo.empty()) - qsort(&IvarsInfo[0], Index+1, sizeof(GC_IVAR), IvarBytePosCompare); + std::sort(IvarsInfo.begin(), IvarsInfo.end()); if (hasUnion && !SkipIvars.empty()) - qsort(&SkipIvars[0], Index+1, sizeof(GC_IVAR), IvarBytePosCompare); + std::sort(SkipIvars.begin(), SkipIvars.end()); // Build the string of skip/scan nibbles SkipScan = -1; |