[lld] 457273f - [ELF] splitStrings: replace entSize==1 special case with manual loop unswitch. NFC
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 30 17:15:49 PST 2022
Author: Fangrui Song
Date: 2022-01-30T17:15:45-08:00
New Revision: 457273fda527f386e025449e357977688f0ae6d6
URL: https://github.com/llvm/llvm-project/commit/457273fda527f386e025449e357977688f0ae6d6
DIFF: https://github.com/llvm/llvm-project/commit/457273fda527f386e025449e357977688f0ae6d6.diff
LOG: [ELF] splitStrings: replace entSize==1 special case with manual loop unswitch. NFC
My x86-64 lld executable is actually smaller.
Added:
Modified:
lld/ELF/InputSection.cpp
lld/ELF/InputSection.h
Removed:
################################################################################
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp
index f8ace8d266c5..131b22feb46e 100644
--- a/lld/ELF/InputSection.cpp
+++ b/lld/ELF/InputSection.cpp
@@ -1358,16 +1358,12 @@ void EhInputSection::split(ArrayRef<RelTy> rels) {
}
static size_t findNull(StringRef s, size_t entSize) {
- // Optimize the common case.
- if (entSize == 1)
- return s.find(0);
-
for (unsigned i = 0, n = s.size(); i != n; i += entSize) {
const char *b = s.begin() + i;
if (std::all_of(b, b + entSize, [](char c) { return c == 0; }))
return i;
}
- return StringRef::npos;
+ llvm_unreachable("");
}
SyntheticSection *MergeInputSection::getParent() const {
@@ -1376,20 +1372,24 @@ SyntheticSection *MergeInputSection::getParent() const {
// Split SHF_STRINGS section. Such section is a sequence of
// null-terminated strings.
-void MergeInputSection::splitStrings(ArrayRef<uint8_t> data, size_t entSize) {
- size_t off = 0;
+void MergeInputSection::splitStrings(StringRef s, size_t entSize) {
const bool live = !(flags & SHF_ALLOC) || !config->gcSections;
- StringRef s = toStringRef(data);
-
- while (!s.empty()) {
- size_t end = findNull(s, entSize);
- if (end == StringRef::npos)
- fatal(toString(this) + ": string is not null terminated");
- size_t size = end + entSize;
-
- pieces.emplace_back(off, xxHash64(s.substr(0, size)), live);
- s = s.substr(size);
- off += size;
+ const char *p = s.data(), *end = s.data() + s.size();
+ if (!std::all_of(end - entSize, end, [](char c) { return c == 0; }))
+ fatal(toString(this) + ": string is not null terminated");
+ if (entSize == 1) {
+ // Optimize the common case.
+ do {
+ size_t size = strlen(p) + 1;
+ pieces.emplace_back(p - s.begin(), xxHash64(StringRef(p, size)), live);
+ p += size;
+ } while (p != end);
+ } else {
+ do {
+ size_t size = findNull(StringRef(p, end - p), entSize) + entSize;
+ pieces.emplace_back(p - s.begin(), xxHash64(StringRef(p, size)), live);
+ p += size;
+ } while (p != end);
}
}
@@ -1428,7 +1428,7 @@ void MergeInputSection::splitIntoPieces() {
assert(pieces.empty());
if (flags & SHF_STRINGS)
- splitStrings(data(), entsize);
+ splitStrings(toStringRef(data()), entsize);
else
splitNonStrings(data(), entsize);
}
diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h
index 3105d27a07fb..f060a6337cf7 100644
--- a/lld/ELF/InputSection.h
+++ b/lld/ELF/InputSection.h
@@ -293,7 +293,7 @@ class MergeInputSection : public InputSectionBase {
SyntheticSection *getParent() const;
private:
- void splitStrings(ArrayRef<uint8_t> a, size_t size);
+ void splitStrings(StringRef s, size_t size);
void splitNonStrings(ArrayRef<uint8_t> a, size_t size);
};
More information about the llvm-commits
mailing list