LLVM 17.0.0git
NameAnonGlobals.cpp
Go to the documentation of this file.
1//===- NameAnonGlobals.cpp - ThinLTO Support: Name Unnamed Globals --------===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements naming anonymous globals to make sure they can be
10// referred to by ThinLTO.
11//
12//===----------------------------------------------------------------------===//
13
16#include "llvm/IR/Module.h"
18#include "llvm/Pass.h"
19#include "llvm/Support/MD5.h"
21
22using namespace llvm;
23
24namespace {
25// Compute a "unique" hash for the module based on the name of the public
26// globals.
27class ModuleHasher {
28 Module &TheModule;
29 std::string TheHash;
30
31public:
32 ModuleHasher(Module &M) : TheModule(M) {}
33
34 /// Return the lazily computed hash.
35 std::string &get() {
36 if (!TheHash.empty())
37 // Cache hit :)
38 return TheHash;
39
40 MD5 Hasher;
41 for (auto &F : TheModule) {
42 if (F.isDeclaration() || F.hasLocalLinkage() || !F.hasName())
43 continue;
44 auto Name = F.getName();
45 Hasher.update(Name);
46 }
47 for (auto &GV : TheModule.globals()) {
48 if (GV.isDeclaration() || GV.hasLocalLinkage() || !GV.hasName())
49 continue;
50 auto Name = GV.getName();
51 Hasher.update(Name);
52 }
53
54 // Now return the result.
55 MD5::MD5Result Hash;
56 Hasher.final(Hash);
58 MD5::stringifyResult(Hash, Result);
59 TheHash = std::string(Result.str());
60 return TheHash;
61 }
62};
63} // end anonymous namespace
64
65// Rename all the anon globals in the module
67 bool Changed = false;
68 ModuleHasher ModuleHash(M);
69 int count = 0;
70 auto RenameIfNeed = [&](GlobalValue &GV) {
71 if (GV.hasName())
72 return;
73 GV.setName(Twine("anon.") + ModuleHash.get() + "." + Twine(count++));
74 Changed = true;
75 };
76 for (auto &GO : M.global_objects())
77 RenameIfNeed(GO);
78 for (auto &GA : M.aliases())
79 RenameIfNeed(GA);
80
81 return Changed;
82}
83
86 if (!nameUnamedGlobals(M))
88
90}
std::string Name
#define F(x, y, z)
Definition: MD5.cpp:55
Module.h This file contains the declarations for the Module class.
This file defines the SmallString class.
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:620
Definition: MD5.h:41
void update(ArrayRef< uint8_t > Data)
Updates the hash for the byte stream provided.
Definition: MD5.cpp:189
static void stringifyResult(MD5Result &Result, SmallVectorImpl< char > &Str)
Translates the bytes in Res to a hex string that is deposited into Str.
Definition: MD5.cpp:287
void final(MD5Result &Result)
Finishes off the hash and puts the result in result.
Definition: MD5.cpp:234
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
A set of analyses that are preserved following a run of a transformation pass.
Definition: PassManager.h:152
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
Definition: PassManager.h:155
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: PassManager.h:158
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition: SmallString.h:26
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
bool nameUnamedGlobals(Module &M)
Rename all the anon globals in the module using a hash computed from the list of public globals in th...
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
Definition: STLExtras.h:1896
std::array< uint32_t, 5 > ModuleHash
160 bits SHA1