From e4187ce13cf80f75151c7fa33f1324bee865c58d Mon Sep 17 00:00:00 2001 From: likholatovevgeny Date: Wed, 15 May 2024 16:31:51 +0300 Subject: [PATCH 1/4] Fixed resolviong of duplicates. Signed-off-by: likholatovevgeny --- lld/ELF/InputFiles.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 23d9512dfb1d..973978cb8022 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -2038,6 +2038,11 @@ template void SharedFileExtended::parseDynamics() { // is stored to sh_info. If a local symbol appears after some non-local // symbol, that's a violation of the spec. StringRef name = CHECK(sym.getName(this->stringTable), this); + // Add postfix for defined duplicates. + if (config->adlt && sym.isDefined() && + ctx->eSymsHist.count(CachedHashStringRef(name)) != 0) + name = this->getUniqueName(name); + if (sym.getBinding() == STB_LOCAL) { warn("found local symbol '" + name + "' in global part of symbol table in file " + toString(this)); -- Gitee From ea70a796e7af69417f3c49532654d173b95eba7a Mon Sep 17 00:00:00 2001 From: likholatovevgeny Date: Wed, 15 May 2024 17:57:22 +0300 Subject: [PATCH 2/4] Added exists funtion for searching duplicates. Signed-off-by: likholatovevgeny --- lld/ELF/Config.h | 9 ++++++--- lld/ELF/Driver.cpp | 4 ++-- lld/ELF/InputFiles.cpp | 12 +++++------- lld/ELF/InputFiles.h | 5 +++-- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index cd768db8a7ff..769eb6d38fd4 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -403,9 +403,6 @@ struct Ctx { // A tuple of (reference, extractedFile, sym). Used by --why-extract=. SmallVector, 0> whyExtractRecords; - // Store duplicate symbols (only defined). - typedef llvm::DenseMap eSymsCntMap; - llvm::DenseSet eSymsHist; // A mapping from a symbol to an InputFile referencing it backward. Used by // --warn-backrefs. llvm::DenseMap> gotPltInfo; // sym, soFile->orderIdx array; + // Store duplicate symbols (only defined). + llvm::DenseSet eSymsHist; + + bool exists(StringRef name) { + return eSymsHist.count(llvm::CachedHashStringRef(name)) != 0; + } } adlt; // OHOS_LOCAL end }; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index af62fa7cca0b..2e4a1059a870 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -2570,12 +2570,12 @@ void LinkerDriver::link(opt::InputArgList &args) { // Fill eSymsHist for defined syms. This will help to find duplicates. if (config->adlt) { - Ctx::eSymsCntMap eSymsHist; + eSymsCntMap eSymsHist; for (auto *file : files) buildSymsHist(file, eSymsHist); for (auto eSym : eSymsHist) if (eSym.second > 1) - ctx->eSymsHist.insert(eSym.first); + ctx->adlt.eSymsHist.insert(eSym.first); eSymsHist.clear(); } diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 973978cb8022..cbbd8c760a85 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -159,14 +159,14 @@ static bool isCompatible(InputFile *file) { } template -static void doBuildSymsHist(InputFile *file, Ctx::eSymsCntMap &eSymsHist) { +static void doBuildSymsHist(InputFile *file, eSymsCntMap &eSymsHist) { if (!isCompatible(file)) return; if (auto *f = dyn_cast>(file)) f->buildSymsHist(eSymsHist); } -void elf::buildSymsHist(InputFile *file, Ctx::eSymsCntMap &eSymsHist) { +void elf::buildSymsHist(InputFile *file, eSymsCntMap &eSymsHist) { invokeELFT(doBuildSymsHist, file, eSymsHist); } @@ -1049,7 +1049,7 @@ InputSectionBase *ObjFile::createInputSection(uint32_t idx, } template -void ObjFile::buildSymsHist(Ctx::eSymsCntMap &eSymsHist) { +void ObjFile::buildSymsHist(eSymsCntMap &eSymsHist) { ArrayRef eSyms = this->getELFSyms(); for (size_t i = firstGlobal, end = eSyms.size(); i != end; ++i) { if (!eSyms[i].isDefined()) @@ -1072,8 +1072,7 @@ void ObjFile::initializeSymbols(const object::ELFFile &obj) { for (size_t i = firstGlobal, end = eSyms.size(); i != end; ++i) if (!symbols[i]) { StringRef name = CHECK(eSyms[i].getName(stringTable), this); - if (config->adlt && eSyms[i].isDefined() && - ctx->eSymsHist.count(CachedHashStringRef(name)) != 0) { + if (config->adlt && eSyms[i].isDefined() && ctx->adlt.exists(name)) { ctx->adlt.withCfi = ctx->adlt.withCfi || name == "__cfi_check"; name = this->getUniqueName(name); } @@ -2039,8 +2038,7 @@ template void SharedFileExtended::parseDynamics() { // symbol, that's a violation of the spec. StringRef name = CHECK(sym.getName(this->stringTable), this); // Add postfix for defined duplicates. - if (config->adlt && sym.isDefined() && - ctx->eSymsHist.count(CachedHashStringRef(name)) != 0) + if (config->adlt && sym.isDefined() && ctx->adlt.exists(name)) name = this->getUniqueName(name); if (sym.getBinding() == STB_LOCAL) { diff --git a/lld/ELF/InputFiles.h b/lld/ELF/InputFiles.h index 65152c337279..3b8324ca75e2 100644 --- a/lld/ELF/InputFiles.h +++ b/lld/ELF/InputFiles.h @@ -47,7 +47,8 @@ extern std::unique_ptr tar; llvm::Optional readFile(StringRef path); // Add symbols in File to the symbol table. -void buildSymsHist(InputFile *file, Ctx::eSymsCntMap &eSymsHist); +typedef llvm::DenseMap eSymsCntMap; +void buildSymsHist(InputFile *file, eSymsCntMap &eSymsHist); void parseFile(InputFile *file); // The root class of input files. @@ -293,7 +294,7 @@ public: // Get cached DWARF information. DWARFCache *getDwarf(); - void buildSymsHist(Ctx::eSymsCntMap &eSymsHist); + void buildSymsHist(eSymsCntMap &eSymsHist); void initializeLocalSymbols(); void postParse(); -- Gitee From 7586f99a02e7ca47f8a8d16f7573b97e21bcb3c0 Mon Sep 17 00:00:00 2001 From: likholatovevgeny Date: Thu, 16 May 2024 14:45:17 +0300 Subject: [PATCH 3/4] changed name of exists method in ctx. Signed-off-by: likholatovevgeny --- lld/ELF/Config.h | 2 +- lld/ELF/InputFiles.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index 769eb6d38fd4..dcab83d6e5fc 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -420,7 +420,7 @@ struct Ctx { // Store duplicate symbols (only defined). llvm::DenseSet eSymsHist; - bool exists(StringRef name) { + bool symExists(StringRef name) { return eSymsHist.count(llvm::CachedHashStringRef(name)) != 0; } } adlt; diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index cbbd8c760a85..fd34f830eefb 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -1072,7 +1072,7 @@ void ObjFile::initializeSymbols(const object::ELFFile &obj) { for (size_t i = firstGlobal, end = eSyms.size(); i != end; ++i) if (!symbols[i]) { StringRef name = CHECK(eSyms[i].getName(stringTable), this); - if (config->adlt && eSyms[i].isDefined() && ctx->adlt.exists(name)) { + if (config->adlt && eSyms[i].isDefined() && ctx->adlt.symExists(name)) { ctx->adlt.withCfi = ctx->adlt.withCfi || name == "__cfi_check"; name = this->getUniqueName(name); } @@ -2038,7 +2038,7 @@ template void SharedFileExtended::parseDynamics() { // symbol, that's a violation of the spec. StringRef name = CHECK(sym.getName(this->stringTable), this); // Add postfix for defined duplicates. - if (config->adlt && sym.isDefined() && ctx->adlt.exists(name)) + if (config->adlt && sym.isDefined() && ctx->adlt.symExists(name)) name = this->getUniqueName(name); if (sym.getBinding() == STB_LOCAL) { -- Gitee From 5a97ecf91a9b307ee010d33b751c7ec09cac0bf7 Mon Sep 17 00:00:00 2001 From: likholatovevgeny Date: Fri, 17 May 2024 10:33:42 +0300 Subject: [PATCH 4/4] Removed symExists method from ctx. Signed-off-by: likholatovevgeny --- lld/ELF/Config.h | 6 +----- lld/ELF/Driver.cpp | 6 +++--- lld/ELF/InputFiles.cpp | 12 +++++++----- lld/ELF/InputFiles.h | 6 +++--- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index dcab83d6e5fc..2c85d4c066f3 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -418,11 +418,7 @@ struct Ctx { llvm::DenseMap> gotPltInfo; // sym, soFile->orderIdx array; // Store duplicate symbols (only defined). - llvm::DenseSet eSymsHist; - - bool symExists(StringRef name) { - return eSymsHist.count(llvm::CachedHashStringRef(name)) != 0; - } + llvm::DenseSet duplicatedSymNames; } adlt; // OHOS_LOCAL end }; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 2e4a1059a870..a4ee33280065 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -2568,14 +2568,14 @@ void LinkerDriver::link(opt::InputArgList &args) { for (StringRef name : config->undefined) addUnusedUndefined(name)->referenced = true; - // Fill eSymsHist for defined syms. This will help to find duplicates. + // Fill duplicatedSymNames for defined syms. This will help to find duplicates. if (config->adlt) { - eSymsCntMap eSymsHist; + ESymsCntMap eSymsHist; for (auto *file : files) buildSymsHist(file, eSymsHist); for (auto eSym : eSymsHist) if (eSym.second > 1) - ctx->adlt.eSymsHist.insert(eSym.first); + ctx->adlt.duplicatedSymNames.insert(eSym.first); eSymsHist.clear(); } diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index fd34f830eefb..0b6ac03faff1 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -159,14 +159,14 @@ static bool isCompatible(InputFile *file) { } template -static void doBuildSymsHist(InputFile *file, eSymsCntMap &eSymsHist) { +static void doBuildSymsHist(InputFile *file, ESymsCntMap &eSymsHist) { if (!isCompatible(file)) return; if (auto *f = dyn_cast>(file)) f->buildSymsHist(eSymsHist); } -void elf::buildSymsHist(InputFile *file, eSymsCntMap &eSymsHist) { +void elf::buildSymsHist(InputFile *file, ESymsCntMap &eSymsHist) { invokeELFT(doBuildSymsHist, file, eSymsHist); } @@ -1049,7 +1049,7 @@ InputSectionBase *ObjFile::createInputSection(uint32_t idx, } template -void ObjFile::buildSymsHist(eSymsCntMap &eSymsHist) { +void ObjFile::buildSymsHist(ESymsCntMap &eSymsHist) { ArrayRef eSyms = this->getELFSyms(); for (size_t i = firstGlobal, end = eSyms.size(); i != end; ++i) { if (!eSyms[i].isDefined()) @@ -1072,7 +1072,8 @@ void ObjFile::initializeSymbols(const object::ELFFile &obj) { for (size_t i = firstGlobal, end = eSyms.size(); i != end; ++i) if (!symbols[i]) { StringRef name = CHECK(eSyms[i].getName(stringTable), this); - if (config->adlt && eSyms[i].isDefined() && ctx->adlt.symExists(name)) { + if (config->adlt && eSyms[i].isDefined() && + ctx->adlt.duplicatedSymNames.count(CachedHashStringRef(name)) != 0) { ctx->adlt.withCfi = ctx->adlt.withCfi || name == "__cfi_check"; name = this->getUniqueName(name); } @@ -2038,7 +2039,8 @@ template void SharedFileExtended::parseDynamics() { // symbol, that's a violation of the spec. StringRef name = CHECK(sym.getName(this->stringTable), this); // Add postfix for defined duplicates. - if (config->adlt && sym.isDefined() && ctx->adlt.symExists(name)) + if (config->adlt && sym.isDefined() && + ctx->adlt.duplicatedSymNames.count(CachedHashStringRef(name)) != 0) name = this->getUniqueName(name); if (sym.getBinding() == STB_LOCAL) { diff --git a/lld/ELF/InputFiles.h b/lld/ELF/InputFiles.h index 3b8324ca75e2..b8d47779488d 100644 --- a/lld/ELF/InputFiles.h +++ b/lld/ELF/InputFiles.h @@ -47,8 +47,8 @@ extern std::unique_ptr tar; llvm::Optional readFile(StringRef path); // Add symbols in File to the symbol table. -typedef llvm::DenseMap eSymsCntMap; -void buildSymsHist(InputFile *file, eSymsCntMap &eSymsHist); +typedef llvm::DenseMap ESymsCntMap; +void buildSymsHist(InputFile *file, ESymsCntMap &eSymsHist); void parseFile(InputFile *file); // The root class of input files. @@ -294,7 +294,7 @@ public: // Get cached DWARF information. DWARFCache *getDwarf(); - void buildSymsHist(eSymsCntMap &eSymsHist); + void buildSymsHist(ESymsCntMap &eSymsHist); void initializeLocalSymbols(); void postParse(); -- Gitee