1 //===- UniqueInternalLinkageNames.cpp - Unique Internal Linkage Sym Names -===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements unique naming of internal linkage symbols with option
10 // -funique-internal-linkage-symbols.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Transforms/Utils/UniqueInternalLinkageNames.h"
15 #include "llvm/ADT/SmallString.h"
16 #include "llvm/IR/Module.h"
17 #include "llvm/InitializePasses.h"
18 #include "llvm/Support/MD5.h"
19 #include "llvm/Transforms/Utils/ModuleUtils.h"
23 static bool uniqueifyInternalLinkageNames(Module &M) {
25 Md5.update(M.getSourceFileName());
26 llvm::MD5::MD5Result R;
29 llvm::MD5::stringifyResult(R, Str);
30 std::string ModuleNameHash = (Twine(".") + Twine(Str)).str();
33 // Append the module hash to all internal linkage functions.
35 if (F.hasInternalLinkage()) {
36 F.setName(F.getName() + ModuleNameHash);
41 // Append the module hash to all internal linkage globals.
42 for (auto &GV : M.globals()) {
43 if (GV.hasInternalLinkage()) {
44 GV.setName(GV.getName() + ModuleNameHash);
53 // Legacy pass that provides a name to every anon globals.
54 class UniqueInternalLinkageNamesLegacyPass : public ModulePass {
57 /// Pass identification, replacement for typeid
60 /// Specify pass name for debug output
61 StringRef getPassName() const override {
62 return "Unique Internal Linkage Names";
65 explicit UniqueInternalLinkageNamesLegacyPass() : ModulePass(ID) {
66 initializeUniqueInternalLinkageNamesLegacyPassPass(
67 *PassRegistry::getPassRegistry());
70 bool runOnModule(Module &M) override {
71 return uniqueifyInternalLinkageNames(M);
75 char UniqueInternalLinkageNamesLegacyPass::ID = 0;
76 } // anonymous namespace
79 UniqueInternalLinkageNamesPass::run(Module &M, ModuleAnalysisManager &AM) {
80 if (!uniqueifyInternalLinkageNames(M))
81 return PreservedAnalyses::all();
83 return PreservedAnalyses::none();
86 INITIALIZE_PASS_BEGIN(UniqueInternalLinkageNamesLegacyPass,
87 "unique-internal-linkage-names",
88 "Uniqueify internal linkage names", false, false)
89 INITIALIZE_PASS_END(UniqueInternalLinkageNamesLegacyPass,
90 "unique-internal-linkage-names",
91 "Uniqueify Internal linkage names", false, false)
94 ModulePass *createUniqueInternalLinkageNamesPass() {
95 return new UniqueInternalLinkageNamesLegacyPass();