[PATCH] [ELF] Use llvm ADT's instead of std.
Shankar Easwaran
shankare at codeaurora.org
Wed Feb 25 12:48:21 PST 2015
I was not aware of that style. Thanks for pointing that out. I will
change this and see if I run into any ..
On 2/25/2015 2:38 PM, Duncan P. N. Exon Smith wrote:
>> On 2015 Feb 25, at 12:27, Rui Ueyama <ruiu at google.com> wrote:
>>
>> I usually don't apply someone else's patch to test Chromium build, but this should not affect the Windows port anyway, because this only changes the ELF port.
>>
>> But this change may be riskier than you might think because of the subtle difference of semantics between std::map and llvm::DenseMap regarding references returned by operator[] and iterators. For std::map, it is guaranteed that inserting a new element does not invalidate existing references to a std::map. It doesn't invalidate iterators unless you remove an element and an iterator is pointing to the element.
>>
>> These properties are not guaranteed by DenseMap. So, if you add a new item to a map while you are iterating over elements of the map, it may crash. It actually crashes only when the hash table is resized to add a new element for LHS, so it could produce a nasty flaky bug. For example the bug in the LayoutPass was there for more than 1 year until I fixed that.
>>
>> Even
>>
>> m[x] = m[y]
>>
>> is not guaranteed to be safe for a DenseMap m, because a reference returned by m[y] can be invalidated by m[x]. This particular one is the bug in LayoutPass.cpp that Reid mentioned above (fix is r213969).
>>
>> I checked the code quickly, and it looks safe to me, but please review your patch again with the above thing in your mind.
>>
>>
>> http://reviews.llvm.org/D7885
>>
>> EMAIL PREFERENCES
>> http://reviews.llvm.org/settings/panel/emailpreferences/
>>
> I agree with Rui. Even the changes from unordered_map<> have
> different guarantees about reference-validity.
>
> IMO, the data structures should be changed one-at-a-time, so that a
> future git bisect will be more useful. Each one really should be
> considered carefully.
>
> The style of the DenseMapInfo structs is strange, too. E.g.,
>
>> Index: lib/ReaderWriter/ELF/DefaultLayout.h
>> ===================================================================
>> --- lib/ReaderWriter/ELF/DefaultLayout.h
>> +++ lib/ReaderWriter/ELF/DefaultLayout.h
>> @@ -29,8 +29,6 @@
>> #include "llvm/ADT/StringSwitch.h"
>> #include "llvm/Support/Errc.h"
>> #include "llvm/Support/Format.h"
>> -#include <map>
>> -#include <unordered_map>
>>
>> namespace lld {
>> namespace elf {
>> @@ -89,8 +87,10 @@
>>
>> // The Key used for creating Sections
>> // The sections are created using
>> - // SectionName, contentPermissions
>> + // SectionName, contentPermissions,path
>> struct SectionKey {
>> + SectionKey() : _name(""), _perm(DefinedAtom::perm___), _path("") {}
>> +
>> SectionKey(StringRef name, DefinedAtom::ContentPermissions perm,
>> StringRef path)
>> : _name(name), _perm(perm), _path(path) {}
>> @@ -101,62 +101,81 @@
>> StringRef _path;
>> };
>>
>> - struct SectionKeyHash {
>> - int64_t operator()(const SectionKey &k) const {
>> + struct SectionKeyInfo {
>> + static SectionKey getEmptyKey() { return SectionKey(); }
>> + static SectionKey getTombstoneKey() { return SectionKey(); }
>> + static unsigned getHashValue(const SectionKey &k) {
>> return llvm::hash_combine(k._name, k._perm, k._path);
>> }
>> - };
>> -
>> - struct SectionKeyEq {
>> - bool operator()(const SectionKey &lhs, const SectionKey &rhs) const {
>> + static bool isEqual(const SectionKey &lhs, const SectionKey &rhs) {
>> return ((lhs._name == rhs._name) && (lhs._perm == rhs._perm) &&
>> (lhs._path == rhs._path));
>> }
>> };
>>
> followed eventually by:
>
> + typedef llvm::DenseMap<SectionKey, AtomSection<ELFT> *, SectionKeyInfo>
> + SectionMapT;
>
>
> Why isn't `SectionKeyInfo` just:
>
> namespace llvm { template <> DenseMapInfo<SectionKey> { /* ... */ }; }
>
> and `SectionMapT`:
>
> typedef llvm::DenseMap<SectionKey, AtomSection<ELFT> *> SectionMapT;
>
> ?
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation
More information about the llvm-commits
mailing list