LLVM  8.0.1
ThinLTOBitcodeWriter.cpp
Go to the documentation of this file.
1 //===- ThinLTOBitcodeWriter.cpp - Bitcode writing pass for ThinLTO --------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
16 #include "llvm/IR/Constants.h"
17 #include "llvm/IR/DebugInfo.h"
18 #include "llvm/IR/Intrinsics.h"
19 #include "llvm/IR/Module.h"
20 #include "llvm/IR/PassManager.h"
22 #include "llvm/Pass.h"
25 #include "llvm/Transforms/IPO.h"
30 using namespace llvm;
31 
32 namespace {
33 
34 // Promote each local-linkage entity defined by ExportM and used by ImportM by
35 // changing visibility and appending the given ModuleId.
36 void promoteInternals(Module &ExportM, Module &ImportM, StringRef ModuleId,
37  SetVector<GlobalValue *> &PromoteExtra) {
39  for (auto &ExportGV : ExportM.global_values()) {
40  if (!ExportGV.hasLocalLinkage())
41  continue;
42 
43  auto Name = ExportGV.getName();
44  GlobalValue *ImportGV = nullptr;
45  if (!PromoteExtra.count(&ExportGV)) {
46  ImportGV = ImportM.getNamedValue(Name);
47  if (!ImportGV)
48  continue;
49  ImportGV->removeDeadConstantUsers();
50  if (ImportGV->use_empty()) {
51  ImportGV->eraseFromParent();
52  continue;
53  }
54  }
55 
56  std::string NewName = (Name + ModuleId).str();
57 
58  if (const auto *C = ExportGV.getComdat())
59  if (C->getName() == Name)
60  RenamedComdats.try_emplace(C, ExportM.getOrInsertComdat(NewName));
61 
62  ExportGV.setName(NewName);
63  ExportGV.setLinkage(GlobalValue::ExternalLinkage);
64  ExportGV.setVisibility(GlobalValue::HiddenVisibility);
65 
66  if (ImportGV) {
67  ImportGV->setName(NewName);
69  }
70  }
71 
72  if (!RenamedComdats.empty())
73  for (auto &GO : ExportM.global_objects())
74  if (auto *C = GO.getComdat()) {
75  auto Replacement = RenamedComdats.find(C);
76  if (Replacement != RenamedComdats.end())
77  GO.setComdat(Replacement->second);
78  }
79 }
80 
81 // Promote all internal (i.e. distinct) type ids used by the module by replacing
82 // them with external type ids formed using the module id.
83 //
84 // Note that this needs to be done before we clone the module because each clone
85 // will receive its own set of distinct metadata nodes.
86 void promoteTypeIds(Module &M, StringRef ModuleId) {
88  auto ExternalizeTypeId = [&](CallInst *CI, unsigned ArgNo) {
89  Metadata *MD =
90  cast<MetadataAsValue>(CI->getArgOperand(ArgNo))->getMetadata();
91 
92  if (isa<MDNode>(MD) && cast<MDNode>(MD)->isDistinct()) {
93  Metadata *&GlobalMD = LocalToGlobal[MD];
94  if (!GlobalMD) {
95  std::string NewName = (Twine(LocalToGlobal.size()) + ModuleId).str();
96  GlobalMD = MDString::get(M.getContext(), NewName);
97  }
98 
99  CI->setArgOperand(ArgNo,
100  MetadataAsValue::get(M.getContext(), GlobalMD));
101  }
102  };
103 
104  if (Function *TypeTestFunc =
106  for (const Use &U : TypeTestFunc->uses()) {
107  auto CI = cast<CallInst>(U.getUser());
108  ExternalizeTypeId(CI, 1);
109  }
110  }
111 
112  if (Function *TypeCheckedLoadFunc =
114  for (const Use &U : TypeCheckedLoadFunc->uses()) {
115  auto CI = cast<CallInst>(U.getUser());
116  ExternalizeTypeId(CI, 2);
117  }
118  }
119 
120  for (GlobalObject &GO : M.global_objects()) {
122  GO.getMetadata(LLVMContext::MD_type, MDs);
123 
124  GO.eraseMetadata(LLVMContext::MD_type);
125  for (auto MD : MDs) {
126  auto I = LocalToGlobal.find(MD->getOperand(1));
127  if (I == LocalToGlobal.end()) {
128  GO.addMetadata(LLVMContext::MD_type, *MD);
129  continue;
130  }
131  GO.addMetadata(
133  *MDNode::get(M.getContext(), {MD->getOperand(0), I->second}));
134  }
135  }
136 }
137 
138 // Drop unused globals, and drop type information from function declarations.
139 // FIXME: If we made functions typeless then there would be no need to do this.
140 void simplifyExternals(Module &M) {
141  FunctionType *EmptyFT =
143 
144  for (auto I = M.begin(), E = M.end(); I != E;) {
145  Function &F = *I++;
146  if (F.isDeclaration() && F.use_empty()) {
147  F.eraseFromParent();
148  continue;
149  }
150 
151  if (!F.isDeclaration() || F.getFunctionType() == EmptyFT ||
152  // Changing the type of an intrinsic may invalidate the IR.
153  F.getName().startswith("llvm."))
154  continue;
155 
156  Function *NewF =
158  F.getAddressSpace(), "", &M);
159  NewF->setVisibility(F.getVisibility());
160  NewF->takeName(&F);
162  F.eraseFromParent();
163  }
164 
165  for (auto I = M.global_begin(), E = M.global_end(); I != E;) {
166  GlobalVariable &GV = *I++;
167  if (GV.isDeclaration() && GV.use_empty()) {
168  GV.eraseFromParent();
169  continue;
170  }
171  }
172 }
173 
174 static void
175 filterModule(Module *M,
176  function_ref<bool(const GlobalValue *)> ShouldKeepDefinition) {
177  std::vector<GlobalValue *> V;
178  for (GlobalValue &GV : M->global_values())
179  if (!ShouldKeepDefinition(&GV))
180  V.push_back(&GV);
181 
182  for (GlobalValue *GV : V)
183  if (!convertToDeclaration(*GV))
184  GV->eraseFromParent();
185 }
186 
187 void forEachVirtualFunction(Constant *C, function_ref<void(Function *)> Fn) {
188  if (auto *F = dyn_cast<Function>(C))
189  return Fn(F);
190  if (isa<GlobalValue>(C))
191  return;
192  for (Value *Op : C->operands())
193  forEachVirtualFunction(cast<Constant>(Op), Fn);
194 }
195 
196 // If it's possible to split M into regular and thin LTO parts, do so and write
197 // a multi-module bitcode file with the two parts to OS. Otherwise, write only a
198 // regular LTO bitcode file to OS.
199 void splitAndWriteThinLTOBitcode(
200  raw_ostream &OS, raw_ostream *ThinLinkOS,
201  function_ref<AAResults &(Function &)> AARGetter, Module &M) {
202  std::string ModuleId = getUniqueModuleId(&M);
203  if (ModuleId.empty()) {
204  // We couldn't generate a module ID for this module, write it out as a
205  // regular LTO module with an index for summary-based dead stripping.
206  ProfileSummaryInfo PSI(M);
207  M.addModuleFlag(Module::Error, "ThinLTO", uint32_t(0));
209  WriteBitcodeToFile(M, OS, /*ShouldPreserveUseListOrder=*/false, &Index);
210 
211  if (ThinLinkOS)
212  // We don't have a ThinLTO part, but still write the module to the
213  // ThinLinkOS if requested so that the expected output file is produced.
214  WriteBitcodeToFile(M, *ThinLinkOS, /*ShouldPreserveUseListOrder=*/false,
215  &Index);
216 
217  return;
218  }
219 
220  promoteTypeIds(M, ModuleId);
221 
222  // Returns whether a global has attached type metadata. Such globals may
223  // participate in CFI or whole-program devirtualization, so they need to
224  // appear in the merged module instead of the thin LTO module.
225  auto HasTypeMetadata = [](const GlobalObject *GO) {
226  return GO->hasMetadata(LLVMContext::MD_type);
227  };
228 
229  // Collect the set of virtual functions that are eligible for virtual constant
230  // propagation. Each eligible function must not access memory, must return
231  // an integer of width <=64 bits, must take at least one argument, must not
232  // use its first argument (assumed to be "this") and all arguments other than
233  // the first one must be of <=64 bit integer type.
234  //
235  // Note that we test whether this copy of the function is readnone, rather
236  // than testing function attributes, which must hold for any copy of the
237  // function, even a less optimized version substituted at link time. This is
238  // sound because the virtual constant propagation optimizations effectively
239  // inline all implementations of the virtual function into each call site,
240  // rather than using function attributes to perform local optimization.
241  DenseSet<const Function *> EligibleVirtualFns;
242  // If any member of a comdat lives in MergedM, put all members of that
243  // comdat in MergedM to keep the comdat together.
244  DenseSet<const Comdat *> MergedMComdats;
245  for (GlobalVariable &GV : M.globals())
246  if (HasTypeMetadata(&GV)) {
247  if (const auto *C = GV.getComdat())
248  MergedMComdats.insert(C);
249  forEachVirtualFunction(GV.getInitializer(), [&](Function *F) {
250  auto *RT = dyn_cast<IntegerType>(F->getReturnType());
251  if (!RT || RT->getBitWidth() > 64 || F->arg_empty() ||
252  !F->arg_begin()->use_empty())
253  return;
254  for (auto &Arg : make_range(std::next(F->arg_begin()), F->arg_end())) {
255  auto *ArgT = dyn_cast<IntegerType>(Arg.getType());
256  if (!ArgT || ArgT->getBitWidth() > 64)
257  return;
258  }
259  if (!F->isDeclaration() &&
260  computeFunctionBodyMemoryAccess(*F, AARGetter(*F)) == MAK_ReadNone)
261  EligibleVirtualFns.insert(F);
262  });
263  }
264 
265  ValueToValueMapTy VMap;
266  std::unique_ptr<Module> MergedM(
267  CloneModule(M, VMap, [&](const GlobalValue *GV) -> bool {
268  if (const auto *C = GV->getComdat())
269  if (MergedMComdats.count(C))
270  return true;
271  if (auto *F = dyn_cast<Function>(GV))
272  return EligibleVirtualFns.count(F);
273  if (auto *GVar = dyn_cast_or_null<GlobalVariable>(GV->getBaseObject()))
274  return HasTypeMetadata(GVar);
275  return false;
276  }));
277  StripDebugInfo(*MergedM);
278  MergedM->setModuleInlineAsm("");
279 
280  for (Function &F : *MergedM)
281  if (!F.isDeclaration()) {
282  // Reset the linkage of all functions eligible for virtual constant
283  // propagation. The canonical definitions live in the thin LTO module so
284  // that they can be imported.
286  F.setComdat(nullptr);
287  }
288 
289  SetVector<GlobalValue *> CfiFunctions;
290  for (auto &F : M)
291  if ((!F.hasLocalLinkage() || F.hasAddressTaken()) && HasTypeMetadata(&F))
292  CfiFunctions.insert(&F);
293 
294  // Remove all globals with type metadata, globals with comdats that live in
295  // MergedM, and aliases pointing to such globals from the thin LTO module.
296  filterModule(&M, [&](const GlobalValue *GV) {
297  if (auto *GVar = dyn_cast_or_null<GlobalVariable>(GV->getBaseObject()))
298  if (HasTypeMetadata(GVar))
299  return false;
300  if (const auto *C = GV->getComdat())
301  if (MergedMComdats.count(C))
302  return false;
303  return true;
304  });
305 
306  promoteInternals(*MergedM, M, ModuleId, CfiFunctions);
307  promoteInternals(M, *MergedM, ModuleId, CfiFunctions);
308 
309  auto &Ctx = MergedM->getContext();
310  SmallVector<MDNode *, 8> CfiFunctionMDs;
311  for (auto V : CfiFunctions) {
312  Function &F = *cast<Function>(V);
315 
317  Elts.push_back(MDString::get(Ctx, F.getName()));
318  CfiFunctionLinkage Linkage;
319  if (!F.isDeclarationForLinker())
320  Linkage = CFL_Definition;
321  else if (F.isWeakForLinker())
322  Linkage = CFL_WeakDeclaration;
323  else
324  Linkage = CFL_Declaration;
326  llvm::ConstantInt::get(Type::getInt8Ty(Ctx), Linkage)));
327  for (auto Type : Types)
328  Elts.push_back(Type);
329  CfiFunctionMDs.push_back(MDTuple::get(Ctx, Elts));
330  }
331 
332  if(!CfiFunctionMDs.empty()) {
333  NamedMDNode *NMD = MergedM->getOrInsertNamedMetadata("cfi.functions");
334  for (auto MD : CfiFunctionMDs)
335  NMD->addOperand(MD);
336  }
337 
338  SmallVector<MDNode *, 8> FunctionAliases;
339  for (auto &A : M.aliases()) {
340  if (!isa<Function>(A.getAliasee()))
341  continue;
342 
343  auto *F = cast<Function>(A.getAliasee());
344 
345  Metadata *Elts[] = {
346  MDString::get(Ctx, A.getName()),
347  MDString::get(Ctx, F->getName()),
349  ConstantInt::get(Type::getInt8Ty(Ctx), A.getVisibility())),
351  ConstantInt::get(Type::getInt8Ty(Ctx), A.isWeakForLinker())),
352  };
353 
354  FunctionAliases.push_back(MDTuple::get(Ctx, Elts));
355  }
356 
357  if (!FunctionAliases.empty()) {
358  NamedMDNode *NMD = MergedM->getOrInsertNamedMetadata("aliases");
359  for (auto MD : FunctionAliases)
360  NMD->addOperand(MD);
361  }
362 
363  SmallVector<MDNode *, 8> Symvers;
365  Function *F = M.getFunction(Name);
366  if (!F || F->use_empty())
367  return;
368 
369  Symvers.push_back(MDTuple::get(
370  Ctx, {MDString::get(Ctx, Name), MDString::get(Ctx, Alias)}));
371  });
372 
373  if (!Symvers.empty()) {
374  NamedMDNode *NMD = MergedM->getOrInsertNamedMetadata("symvers");
375  for (auto MD : Symvers)
376  NMD->addOperand(MD);
377  }
378 
379  simplifyExternals(*MergedM);
380 
381  // FIXME: Try to re-use BSI and PFI from the original module here.
382  ProfileSummaryInfo PSI(M);
383  ModuleSummaryIndex Index = buildModuleSummaryIndex(M, nullptr, &PSI);
384 
385  // Mark the merged module as requiring full LTO. We still want an index for
386  // it though, so that it can participate in summary-based dead stripping.
387  MergedM->addModuleFlag(Module::Error, "ThinLTO", uint32_t(0));
388  ModuleSummaryIndex MergedMIndex =
389  buildModuleSummaryIndex(*MergedM, nullptr, &PSI);
390 
391  SmallVector<char, 0> Buffer;
392 
393  BitcodeWriter W(Buffer);
394  // Save the module hash produced for the full bitcode, which will
395  // be used in the backends, and use that in the minimized bitcode
396  // produced for the full link.
397  ModuleHash ModHash = {{0}};
398  W.writeModule(M, /*ShouldPreserveUseListOrder=*/false, &Index,
399  /*GenerateHash=*/true, &ModHash);
400  W.writeModule(*MergedM, /*ShouldPreserveUseListOrder=*/false, &MergedMIndex);
401  W.writeSymtab();
402  W.writeStrtab();
403  OS << Buffer;
404 
405  // If a minimized bitcode module was requested for the thin link, only
406  // the information that is needed by thin link will be written in the
407  // given OS (the merged module will be written as usual).
408  if (ThinLinkOS) {
409  Buffer.clear();
410  BitcodeWriter W2(Buffer);
411  StripDebugInfo(M);
412  W2.writeThinLinkBitcode(M, Index, ModHash);
413  W2.writeModule(*MergedM, /*ShouldPreserveUseListOrder=*/false,
414  &MergedMIndex);
415  W2.writeSymtab();
416  W2.writeStrtab();
417  *ThinLinkOS << Buffer;
418  }
419 }
420 
421 // Returns whether this module needs to be split because splitting is
422 // enabled and it uses type metadata.
423 bool requiresSplit(Module &M) {
424  // First check if the LTO Unit splitting has been enabled.
425  bool EnableSplitLTOUnit = false;
426  if (auto *MD = mdconst::extract_or_null<ConstantInt>(
427  M.getModuleFlag("EnableSplitLTOUnit")))
428  EnableSplitLTOUnit = MD->getZExtValue();
429  if (!EnableSplitLTOUnit)
430  return false;
431 
432  // Module only needs to be split if it contains type metadata.
433  for (auto &GO : M.global_objects()) {
434  if (GO.hasMetadata(LLVMContext::MD_type))
435  return true;
436  }
437 
438  return false;
439 }
440 
441 void writeThinLTOBitcode(raw_ostream &OS, raw_ostream *ThinLinkOS,
442  function_ref<AAResults &(Function &)> AARGetter,
443  Module &M, const ModuleSummaryIndex *Index) {
444  // Split module if splitting is enabled and it contains any type metadata.
445  if (requiresSplit(M))
446  return splitAndWriteThinLTOBitcode(OS, ThinLinkOS, AARGetter, M);
447 
448  // Otherwise we can just write it out as a regular module.
449 
450  // Save the module hash produced for the full bitcode, which will
451  // be used in the backends, and use that in the minimized bitcode
452  // produced for the full link.
453  ModuleHash ModHash = {{0}};
454  WriteBitcodeToFile(M, OS, /*ShouldPreserveUseListOrder=*/false, Index,
455  /*GenerateHash=*/true, &ModHash);
456  // If a minimized bitcode module was requested for the thin link, only
457  // the information that is needed by thin link will be written in the
458  // given OS.
459  if (ThinLinkOS && Index)
460  WriteThinLinkBitcodeToFile(M, *ThinLinkOS, *Index, ModHash);
461 }
462 
463 class WriteThinLTOBitcode : public ModulePass {
464  raw_ostream &OS; // raw_ostream to print on
465  // The output stream on which to emit a minimized module for use
466  // just in the thin link, if requested.
467  raw_ostream *ThinLinkOS;
468 
469 public:
470  static char ID; // Pass identification, replacement for typeid
471  WriteThinLTOBitcode() : ModulePass(ID), OS(dbgs()), ThinLinkOS(nullptr) {
473  }
474 
475  explicit WriteThinLTOBitcode(raw_ostream &o, raw_ostream *ThinLinkOS)
476  : ModulePass(ID), OS(o), ThinLinkOS(ThinLinkOS) {
478  }
479 
480  StringRef getPassName() const override { return "ThinLTO Bitcode Writer"; }
481 
482  bool runOnModule(Module &M) override {
483  const ModuleSummaryIndex *Index =
484  &(getAnalysis<ModuleSummaryIndexWrapperPass>().getIndex());
485  writeThinLTOBitcode(OS, ThinLinkOS, LegacyAARGetter(*this), M, Index);
486  return true;
487  }
488  void getAnalysisUsage(AnalysisUsage &AU) const override {
489  AU.setPreservesAll();
493  }
494 };
495 } // anonymous namespace
496 
497 char WriteThinLTOBitcode::ID = 0;
498 INITIALIZE_PASS_BEGIN(WriteThinLTOBitcode, "write-thinlto-bitcode",
499  "Write ThinLTO Bitcode", false, true)
503 INITIALIZE_PASS_END(WriteThinLTOBitcode, "write-thinlto-bitcode",
504  "Write ThinLTO Bitcode", false, true)
505 
507  raw_ostream *ThinLinkOS) {
508  return new WriteThinLTOBitcode(Str, ThinLinkOS);
509 }
510 
514  AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
515  writeThinLTOBitcode(OS, ThinLinkOS,
516  [&FAM](Function &F) -> AAResults & {
517  return FAM.getResult<AAManager>(F);
518  },
520  return PreservedAnalyses::all();
521 }
void setVisibility(VisibilityTypes V)
Definition: GlobalValue.h:239
const Function & getFunction() const
Definition: Function.h:134
bool isDeclarationForLinker() const
Definition: GlobalValue.h:524
uint64_t CallInst * C
ModulePass * createWriteThinLTOBitcodePass(raw_ostream &Str, raw_ostream *ThinLinkOS=nullptr)
Write ThinLTO-ready bitcode to Str.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata *> MDs)
Definition: Metadata.h:1133
iterator_range< use_iterator > uses()
Definition: Value.h:355
bool hasLocalLinkage() const
Definition: GlobalValue.h:436
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Definition: PassManager.h:770
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
This class represents lattice values for constants.
Definition: AllocatorList.h:24
A Module instance is used to store all the information related to an LLVM module. ...
Definition: Module.h:65
static MDString * get(LLVMContext &Context, StringRef Str)
Definition: Metadata.cpp:454
This is the interface to build a ModuleSummaryIndex for a module.
Implements a dense probed hash-table based set.
Definition: DenseSet.h:250
Available for inspection, not emission.
Definition: GlobalValue.h:50
Analysis providing profile information.
void addOperand(MDNode *M)
Definition: Metadata.cpp:1087
This class represents a function call, abstracting a target machine&#39;s calling convention.
write thinlto bitcode
An immutable pass that tracks lazily created AssumptionCache objects.
bool convertToDeclaration(GlobalValue &GV)
Converts value GV to declaration, or replaces with a declaration if it is an alias.
An efficient, type-erasing, non-owning reference to a callable.
Definition: STLExtras.h:117
CfiFunctionLinkage
The type of CFI jumptable needed for a function.
Externally visible function.
Definition: GlobalValue.h:49
arg_iterator arg_end()
Definition: Function.h:680
void setArgOperand(unsigned i, Value *v)
Definition: InstrTypes.h:1140
F(f)
block Block Frequency true
MemoryAccessKind computeFunctionBodyMemoryAccess(Function &F, AAResults &AAR)
Returns the memory access properties of this copy of the function.
Analysis pass to provide the ModuleSummaryIndex object.
ModuleSummaryIndex buildModuleSummaryIndex(const Module &M, std::function< BlockFrequencyInfo *(const Function &F)> GetBFICallback, ProfileSummaryInfo *PSI)
Direct function to compute a ModuleSummaryIndex from a given module.
iterator_range< global_object_iterator > global_objects()
Definition: Module.h:659
Value * getArgOperand(unsigned i) const
Definition: InstrTypes.h:1135
AnalysisUsage & addRequired()
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:51
A tuple of MDNodes.
Definition: Metadata.h:1326
amdgpu Simplify well known AMD library false Value Value const Twine & Name
StringRef getName(ID id)
Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx".
Definition: Function.cpp:626
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
LLVMContext & getContext() const
Get the global data context.
Definition: Module.h:244
A Use represents the edge between a Value definition and its users.
Definition: Use.h:56
This class is a functor to be used in legacy module or SCC passes for computing AA results for a func...
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
Definition: Metadata.cpp:1444
std::array< uint32_t, 5 > ModuleHash
160 bits SHA1
void setName(const Twine &Name)
Change the name of the value.
Definition: Value.cpp:285
void WriteThinLinkBitcodeToFile(const Module &M, raw_ostream &Out, const ModuleSummaryIndex &Index, const ModuleHash &ModHash)
Write the specified thin link bitcode file (i.e., the minimized bitcode file) to the given raw output...
global_iterator global_begin()
Definition: Module.h:578
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool startswith(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition: StringRef.h:267
Class to represent function types.
Definition: DerivedTypes.h:103
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:245
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition: SetVector.h:142
bool arg_empty() const
Definition: Function.h:699
void setComdat(Comdat *C)
Definition: GlobalObject.h:103
bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
Definition: DebugInfo.cpp:351
GlobalValue * getNamedValue(StringRef Name) const
Return the global value in the module with the specified name, of arbitrary type. ...
Definition: Module.cpp:114
void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition: Value.cpp:429
void takeName(Value *V)
Transfer the name from V to this value.
Definition: Value.cpp:291
Class to hold module path string table and global value map, and encapsulate methods for operating on...
static ConstantAsMetadata * get(Constant *C)
Definition: Metadata.h:410
size_type count(const key_type &key) const
Count the number of elements of a given key in the SetVector.
Definition: SetVector.h:211
void removeDeadConstantUsers() const
If there are any dead constant users dangling off of this constant, remove them.
Definition: Constants.cpp:537
static bool isWeakForLinker(LinkageTypes Linkage)
Whether the definition of this global may be replaced at link time.
Definition: GlobalValue.h:370
static MetadataAsValue * get(LLVMContext &Context, Metadata *MD)
Definition: Metadata.cpp:106
static Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Definition: Constants.cpp:1773
std::unique_ptr< Module > CloneModule(const Module &M)
Return an exact copy of the specified module.
Definition: CloneModule.cpp:35
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata *> MDs)
Definition: Metadata.h:1166
Type * getReturnType() const
Returns the type of the ret val.
Definition: Function.h:169
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
Definition: Function.h:136
static void CollectAsmSymvers(const Module &M, function_ref< void(StringRef, StringRef)> AsmSymver)
Parse inline ASM and collect the symvers directives that are defined in the current module...
Emits an error if two values disagree, otherwise the resulting value is that of the operands...
Definition: Module.h:116
A set of analyses that are preserved following a run of a transformation pass.
Definition: PassManager.h:154
VisibilityTypes getVisibility() const
Definition: GlobalValue.h:233
write thinlto Write ThinLTO Bitcode
The instances of the Type class are immutable: once they are created, they are never changed...
Definition: Type.h:46
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
Definition: Module.cpp:312
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This is an important base class in LLVM.
Definition: Constant.h:42
This file contains the declarations for the subclasses of Constant, which represent the different fla...
A manager for alias analyses.
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
void WriteBitcodeToFile(const Module &M, raw_ostream &Out, bool ShouldPreserveUseListOrder=false, const ModuleSummaryIndex *Index=nullptr, bool GenerateHash=false, ModuleHash *ModHash=nullptr)
Write the specified module to the specified raw output stream.
void eraseFromParent()
eraseFromParent - This method unlinks &#39;this&#39; from the containing module and deletes it...
Definition: Globals.cpp:359
Represent the analysis usage information of a pass.
static Type * getVoidTy(LLVMContext &C)
Definition: Type.cpp:161
void addModuleFlag(ModFlagBehavior Behavior, StringRef Key, Metadata *Val)
Add a module-level flag to the module-level flags metadata.
Definition: Module.cpp:339
unsigned getAddressSpace() const
Definition: Globals.cpp:111
static FunctionType * get(Type *Result, ArrayRef< Type *> Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
Definition: Type.cpp:297
op_range operands()
Definition: User.h:238
arg_iterator arg_begin()
Definition: Function.h:671
Class to represent integer types.
Definition: DerivedTypes.h:40
std::string getUniqueModuleId(Module *M)
Produce a unique identifier for this module by taking the MD5 sum of the names of the module&#39;s strong...
static void write(bool isBE, void *P, T V)
Comdat * getOrInsertComdat(StringRef Name)
Return the Comdat in the module with the specified name.
Definition: Module.cpp:484
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: PassManager.h:160
INITIALIZE_PASS_END(RegBankSelect, DEBUG_TYPE, "Assign register bank of generic virtual registers", false, false) RegBankSelect
global_iterator global_end()
Definition: Module.h:580
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void initializeWriteThinLTOBitcodePass(PassRegistry &)
This is a &#39;vector&#39; (really, a variable-sized array), optimized for the case when the array is small...
Definition: SmallVector.h:847
Module.h This file contains the declarations for the Module class.
static Constant * get(Type *Ty, uint64_t V, bool isSigned=false)
If Ty is a vector type, return a Constant with a splat of the given value.
Definition: Constants.cpp:622
void setLinkage(LinkageTypes LT)
Definition: GlobalValue.h:445
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:133
Function * getFunction(StringRef Name) const
Look up the specified function in the module symbol table.
Definition: Module.cpp:176
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition: Function.h:164
const Comdat * getComdat() const
Definition: Globals.cpp:171
void setPreservesAll()
Set by analyses that do not transform their input at all.
amdgpu Simplify well known AMD library false Value Value * Arg
const Comdat * getComdat() const
Definition: GlobalObject.h:101
void eraseFromParent()
This method unlinks &#39;this&#39; from the containing module and deletes it.
Definition: Globals.cpp:85
iterator end()
Definition: Module.h:597
LLVM_NODISCARD bool empty() const
Definition: SmallVector.h:56
StringRef getName() const
Return a constant reference to the value&#39;s name.
Definition: Value.cpp:214
#define I(x, y, z)
Definition: MD5.cpp:58
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
Definition: Pass.h:225
iterator begin()
Definition: Module.h:595
LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
Definition: Casting.h:323
void eraseFromParent()
eraseFromParent - This method unlinks &#39;this&#39; from the containing module and deletes it...
Definition: Function.cpp:214
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
Definition: DenseSet.h:92
Provides passes for computing function attributes based on interprocedural analyses.
const GlobalObject * getBaseObject() const
Definition: Globals.cpp:261
bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
Definition: Globals.cpp:206
bool hasAddressTaken(const User **=nullptr) const
hasAddressTaken - returns true if there are any uses of this function other than direct calls or invo...
Definition: Function.cpp:1254
LLVM Value Representation.
Definition: Value.h:73
A vector that has set insertion semantics.
Definition: SetVector.h:41
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:46
iterator_range< global_iterator > globals()
Definition: Module.h:584
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
This is the interface for LLVM&#39;s primary stateless and local alias analysis.
A container for analyses that lazily runs them and caches their results.
This header defines various interfaces for pass management in LLVM.
INITIALIZE_PASS_BEGIN(WriteThinLTOBitcode, "write-thinlto-bitcode", "Write ThinLTO Bitcode", false, true) INITIALIZE_PASS_END(WriteThinLTOBitcode
iterator_range< global_value_iterator > global_values()
Definition: Module.h:685
Root of the metadata hierarchy.
Definition: Metadata.h:58
static IntegerType * getInt8Ty(LLVMContext &C)
Definition: Type.cpp:174
bool use_empty() const
Definition: Value.h:323
PointerType * getType() const
Global values are always pointers.
Definition: GlobalValue.h:274
Legacy wrapper pass to provide the ModuleSummaryIndex object.
An analysis over an "outer" IR unit that provides access to an analysis manager over an "inner" IR un...
Definition: PassManager.h:1038