[PATCH] D27152: Merge strings using sharded hash tables.
Rui Ueyama via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 9 15:44:05 PST 2016
ruiu added a comment.
Resurrected the original code to use the (non-concurrent) string table table to use it when -no-thread is given, so that this patch doesn't hurt when threads are explicitly disabled.
================
Comment at: ELF/OutputSections.cpp:530
-template <class ELFT> void MergeOutputSection<ELFT>::finalizeNoTailMerge() {
- // Add all string pieces to the string table builder to create section
- // contents. Because we are not tail-optimizing, offsets of strings are
- // fixed when they are added to the builder (string table builder contains
- // a hash table from strings to offsets).
- for (MergeInputSection<ELFT> *Sec : Sections)
- for (size_t I = 0, E = Sec->Pieces.size(); I != E; ++I)
- if (Sec->Pieces[I].Live)
- Sec->Pieces[I].OutputOff = Builder.add(Sec->getData(I));
-
- Builder.finalizeInOrder();
- this->Size = Builder.getSize();
+static size_t align2(size_t Val, size_t Alignment) {
+ return (Val + Alignment - 1) & ~(Alignment - 1);
----------------
silvas wrote:
> Do we already have a helper for this in libsupport?
Done.
================
Comment at: ELF/OutputSections.cpp:562
+ const int NumShards = 8;
+ DenseMap<CachedHashStringRef, size_t> OffsetMap[NumShards];
+ size_t ShardSize[NumShards];
----------------
silvas wrote:
> Please pad this so that there isn't false sharing. DenseMap is smaller than a cacheline IIRC and so currently different threads will have false sharing.
Done. It actually reduced the latency of this function by almost 10%. Wow.
https://reviews.llvm.org/D27152
More information about the llvm-commits
mailing list