[PATCH] This phabricator revision is the merge of 4 patches that aim to provide resolving of AT_abstract_origin and AT_specification attributes.
Frédéric Riss
friss at apple.com
Mon Sep 8 02:39:31 PDT 2014
>
> ================
> Comment at: lib/DebugInfo/DWARFContext.cpp:401
> @@ +400,3 @@
> + const std::unique_ptr<UnitType> &RHS) const {
> + return LHS->getNextUnitOffset() <= RHS->getNextUnitOffset();
> + }
> ----------------
> I have a sneaking suspicion that <= ordering would violate the requirements of lower_bound...
>
> I /suspect/ the right answer is:
>
> Off < RHS->getOffset()
>
> LHS->getNextUnitOffset() <= Off
>
> LHS->getNextUnitOffset() <= RHS->getOffset()
>
> That should be a proper "less than" for a half open range [offset, next unit offset), I think... maybe?
I think you’re generally right. But all the documentation I can find about lower_bound tells me that only the comp(Unit, Offset) will be used by lower_bound. The other 2 functions make it adhere to the Compare concept, but I find it strange to implement unused functions just for that. Would it be legal to just pass a function accepting a Unit and an Offset?
BTW, is there an authoritative freely available source regarding these sort of STL usage details?
>
> On 05 Sep 2014, at 22:46, Alexey Samsonov <vonosmas at gmail.com> wrote:
>
> IIRC, originally getCompileUnitForOffset() was supposed to work only for the exact Offsets (which are returned by DWARFUnit::getOffset()). Now that you're changing it to work for arbitrary offsets, I think it makes more sense to rewrite it as follows:
Then the comment of the function in the header was wrong.
> if (CUs.empty()) return nullptr;
> auto It = std::upper_bound(CUs.begin(), CUs.end(), Offset, OffsetComparator());
> if (It == CUs.begin()) return nullptr;
> --It;
> return (It->getOffset <= Offset && Offset < It->getNextUnitOffset()) ? It->get() : nullptr;
>
> and leave the comparator as is. I would rather not play with non-strict comparisons.
I could even keep using lower_bound without modifying the comparator, and when it returns CUs.end(), check --CUs.end() for the given offset. It would be a bit more efficient than the above I believe.
So should I use David’s variation, remove the seemingly unused comparison functions, don’t touch the comparator object and rewrite the function? What do you prefer?
Fred
More information about the llvm-commits
mailing list