diff options
author | Kostya Serebryany <kcc@google.com> | 2018-10-12 23:21:48 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2018-10-12 23:21:48 +0000 |
commit | bc504559ec6723b61535fb8df48a736420db3891 (patch) | |
tree | bec4968362f2f65520fe63c6703cbd9c7dceb0e3 /llvm/lib/Transforms | |
parent | 748d080e6288ec3b2edd1a1bfdcf21491e816fd3 (diff) | |
download | bcm5719-llvm-bc504559ec6723b61535fb8df48a736420db3891.tar.gz bcm5719-llvm-bc504559ec6723b61535fb8df48a736420db3891.zip |
move GetOrCreateFunctionComdat to Instrumentation.cpp/Instrumentation.h
Summary:
GetOrCreateFunctionComdat is currently used in SanitizerCoverage,
where it's defined. I'm planing to use it in HWASAN as well,
so moving it into a common location.
NFC
Reviewers: morehouse
Reviewed By: morehouse
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D53218
llvm-svn: 344433
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/Instrumentation.cpp | 15 | ||||
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp | 22 |
2 files changed, 19 insertions, 18 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/Instrumentation.cpp b/llvm/lib/Transforms/Instrumentation/Instrumentation.cpp index 1c739c09e39..55b449ffca1 100644 --- a/llvm/lib/Transforms/Instrumentation/Instrumentation.cpp +++ b/llvm/lib/Transforms/Instrumentation/Instrumentation.cpp @@ -70,6 +70,21 @@ GlobalVariable *llvm::createPrivateGlobalForString(Module &M, StringRef Str, return GV; } +Comdat *llvm::GetOrCreateFunctionComdat(Function &F, + const std::string &ModuleId) { + if (auto Comdat = F.getComdat()) return Comdat; + assert(F.hasName()); + Module *M = F.getParent(); + std::string Name = F.getName(); + if (F.hasLocalLinkage()) { + if (ModuleId.empty()) + return nullptr; + Name += ModuleId; + } + F.setComdat(M->getOrInsertComdat(Name)); + return F.getComdat(); +} + /// initializeInstrumentation - Initialize all passes in the TransformUtils /// library. void llvm::initializeInstrumentation(PassRegistry &Registry) { diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp index 0bed4139518..b3450728f04 100644 --- a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -220,8 +220,6 @@ private: MDNode::get(*C, None)); } - Comdat *GetOrCreateFunctionComdat(Function &F); - std::string getSectionName(const std::string &Section) const; std::string getSectionStart(const std::string &Section) const; std::string getSectionEnd(const std::string &Section) const; @@ -590,28 +588,16 @@ bool SanitizerCoverageModule::runOnFunction(Function &F) { return true; } -Comdat *SanitizerCoverageModule::GetOrCreateFunctionComdat(Function &F) { - if (auto Comdat = F.getComdat()) return Comdat; - if (!TargetTriple.isOSBinFormatELF()) return nullptr; - assert(F.hasName()); - std::string Name = F.getName(); - if (F.hasLocalLinkage()) { - if (CurModuleUniqueId.empty()) return nullptr; - Name += CurModuleUniqueId; - } - auto Comdat = CurModule->getOrInsertComdat(Name); - F.setComdat(Comdat); - return Comdat; -} - GlobalVariable *SanitizerCoverageModule::CreateFunctionLocalArrayInSection( size_t NumElements, Function &F, Type *Ty, const char *Section) { ArrayType *ArrayTy = ArrayType::get(Ty, NumElements); auto Array = new GlobalVariable( *CurModule, ArrayTy, false, GlobalVariable::PrivateLinkage, Constant::getNullValue(ArrayTy), "__sancov_gen_"); - if (auto Comdat = GetOrCreateFunctionComdat(F)) - Array->setComdat(Comdat); + + if (TargetTriple.isOSBinFormatELF()) + if (auto Comdat = GetOrCreateFunctionComdat(F, CurModuleUniqueId)) + Array->setComdat(Comdat); Array->setSection(getSectionName(Section)); Array->setAlignment(Ty->isPointerTy() ? DL->getPointerSize() : Ty->getPrimitiveSizeInBits() / 8); |