LLVM 23.0.0git
ThinLTOBitcodeWriter.cpp
Go to the documentation of this file.
1//===- ThinLTOBitcodeWriter.cpp - Bitcode writing pass for ThinLTO --------===//
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
15#include "llvm/IR/Constants.h"
16#include "llvm/IR/DebugInfo.h"
18#include "llvm/IR/Intrinsics.h"
19#include "llvm/IR/Module.h"
20#include "llvm/IR/PassManager.h"
23#include "llvm/Transforms/IPO.h"
29using namespace llvm;
30
31namespace {
32
33// Determine if a promotion alias should be created for a symbol name.
34static bool allowPromotionAlias(const std::string &Name) {
35 // Promotion aliases are used only in inline assembly. It's safe to
36 // simply skip unusual names. Subset of MCAsmInfo::isAcceptableChar()
37 // and MCAsmInfoXCOFF::isAcceptableChar().
38 for (const char &C : Name) {
39 if (isAlnum(C) || C == '_' || C == '.')
40 continue;
41 return false;
42 }
43 return true;
44}
45
46// Promote each local-linkage entity defined by ExportM and used by ImportM by
47// changing visibility and appending the given ModuleId.
48void promoteInternals(Module &ExportM, Module &ImportM, StringRef ModuleId,
49 const SetVector<GlobalValue *> &PromoteExtra) {
51 for (auto &ExportGV : ExportM.global_values()) {
52 if (!ExportGV.hasLocalLinkage())
53 continue;
54
55 auto Name = ExportGV.getName();
56 GlobalValue *ImportGV = nullptr;
57 if (!PromoteExtra.count(&ExportGV)) {
58 ImportGV = ImportM.getNamedValue(Name);
59 if (!ImportGV)
60 continue;
61 ImportGV->removeDeadConstantUsers();
62 if (ImportGV->use_empty()) {
63 ImportGV->eraseFromParent();
64 continue;
65 }
66 }
67
68 std::string OldName = Name.str();
69 std::string NewName = (Name + ModuleId).str();
70
71 if (const auto *C = ExportGV.getComdat())
72 if (C->getName() == Name)
73 RenamedComdats.try_emplace(C, ExportM.getOrInsertComdat(NewName));
74
75 ExportGV.setName(NewName);
76 ExportGV.setLinkage(GlobalValue::ExternalLinkage);
77 ExportGV.setVisibility(GlobalValue::HiddenVisibility);
78
79 if (ImportGV) {
80 ImportGV->setName(NewName);
82 }
83
84 if (isa<Function>(&ExportGV) && allowPromotionAlias(OldName)) {
85 // Create a local alias with the original name to avoid breaking
86 // references from inline assembly.
87 std::string Alias =
88 ".lto_set_conditional " + OldName + "," + NewName + "\n";
89 ExportM.appendModuleInlineAsm(Alias);
90 }
91 }
92
93 if (!RenamedComdats.empty())
94 for (auto &GO : ExportM.global_objects())
95 if (auto *C = GO.getComdat()) {
96 auto Replacement = RenamedComdats.find(C);
97 if (Replacement != RenamedComdats.end())
98 GO.setComdat(Replacement->second);
99 }
100}
101
102// Promote all internal (i.e. distinct) type ids used by the module by replacing
103// them with external type ids formed using the module id.
104//
105// Note that this needs to be done before we clone the module because each clone
106// will receive its own set of distinct metadata nodes.
107void promoteTypeIds(Module &M, StringRef ModuleId) {
109 auto ExternalizeTypeId = [&](CallInst *CI, unsigned ArgNo) {
110 Metadata *MD =
111 cast<MetadataAsValue>(CI->getArgOperand(ArgNo))->getMetadata();
112
113 if (isa<MDNode>(MD) && cast<MDNode>(MD)->isDistinct()) {
114 Metadata *&GlobalMD = LocalToGlobal[MD];
115 if (!GlobalMD) {
116 std::string NewName = (Twine(LocalToGlobal.size()) + ModuleId).str();
117 GlobalMD = MDString::get(M.getContext(), NewName);
118 }
119
120 CI->setArgOperand(ArgNo,
121 MetadataAsValue::get(M.getContext(), GlobalMD));
122 }
123 };
124
125 if (Function *TypeTestFunc =
126 Intrinsic::getDeclarationIfExists(&M, Intrinsic::type_test)) {
127 for (const Use &U : TypeTestFunc->uses()) {
128 auto CI = cast<CallInst>(U.getUser());
129 ExternalizeTypeId(CI, 1);
130 }
131 }
132
133 if (Function *PublicTypeTestFunc =
134 Intrinsic::getDeclarationIfExists(&M, Intrinsic::public_type_test)) {
135 for (const Use &U : PublicTypeTestFunc->uses()) {
136 auto CI = cast<CallInst>(U.getUser());
137 ExternalizeTypeId(CI, 1);
138 }
139 }
140
141 if (Function *TypeCheckedLoadFunc =
142 Intrinsic::getDeclarationIfExists(&M, Intrinsic::type_checked_load)) {
143 for (const Use &U : TypeCheckedLoadFunc->uses()) {
144 auto CI = cast<CallInst>(U.getUser());
145 ExternalizeTypeId(CI, 2);
146 }
147 }
148
149 if (Function *TypeCheckedLoadRelativeFunc = Intrinsic::getDeclarationIfExists(
150 &M, Intrinsic::type_checked_load_relative)) {
151 for (const Use &U : TypeCheckedLoadRelativeFunc->uses()) {
152 auto CI = cast<CallInst>(U.getUser());
153 ExternalizeTypeId(CI, 2);
154 }
155 }
156
157 for (GlobalObject &GO : M.global_objects()) {
159 GO.getMetadata(LLVMContext::MD_type, MDs);
160
161 GO.eraseMetadata(LLVMContext::MD_type);
162 for (auto *MD : MDs) {
163 auto I = LocalToGlobal.find(MD->getOperand(1));
164 if (I == LocalToGlobal.end()) {
165 GO.addMetadata(LLVMContext::MD_type, *MD);
166 continue;
167 }
168 GO.addMetadata(
169 LLVMContext::MD_type,
170 *MDNode::get(M.getContext(), {MD->getOperand(0), I->second}));
171 }
172
174 GO.getMetadata(LLVMContext::MD_callgraph, CGMDs);
175
176 GO.eraseMetadata(LLVMContext::MD_callgraph);
177 for (auto *MD : CGMDs) {
178 if (MD->getNumOperands() == 1) {
179 auto I = LocalToGlobal.find(MD->getOperand(0));
180 if (I == LocalToGlobal.end()) {
181 GO.addMetadata(LLVMContext::MD_callgraph, *MD);
182 continue;
183 }
184 GO.addMetadata(LLVMContext::MD_callgraph,
185 *MDNode::get(M.getContext(), {I->second}));
186 }
187 }
188 }
189}
190
191// Drop unused globals, and drop type information from function declarations.
192// FIXME: If we made functions typeless then there would be no need to do this.
193void simplifyExternals(Module &M) {
194 FunctionType *EmptyFT =
195 FunctionType::get(Type::getVoidTy(M.getContext()), false);
196
198 if (F.isDeclaration() && F.use_empty()) {
199 F.eraseFromParent();
200 continue;
201 }
202
203 if (!F.isDeclaration() || F.getFunctionType() == EmptyFT ||
204 // Changing the type of an intrinsic may invalidate the IR.
205 F.getName().starts_with("llvm."))
206 continue;
207
208 Function *NewF =
210 F.getAddressSpace(), "", &M);
211 NewF->copyAttributesFrom(&F);
212 // Only copy function attribtues.
213 NewF->setAttributes(AttributeList::get(M.getContext(),
214 AttributeList::FunctionIndex,
215 F.getAttributes().getFnAttrs()));
216 NewF->takeName(&F);
217 F.replaceAllUsesWith(NewF);
218 F.eraseFromParent();
219 }
220
221 for (GlobalIFunc &I : llvm::make_early_inc_range(M.ifuncs())) {
222 if (I.use_empty())
223 I.eraseFromParent();
224 else
225 assert(I.getResolverFunction() && "ifunc misses its resolver function");
226 }
227
228 for (GlobalVariable &GV : llvm::make_early_inc_range(M.globals())) {
229 if (GV.isDeclaration() && GV.use_empty()) {
230 GV.eraseFromParent();
231 continue;
232 }
233 }
234}
235
236static void
237filterModule(Module *M,
238 function_ref<bool(const GlobalValue *)> ShouldKeepDefinition) {
239 std::vector<GlobalValue *> V;
240 for (GlobalValue &GV : M->global_values())
241 if (!ShouldKeepDefinition(&GV))
242 V.push_back(&GV);
243
244 for (GlobalValue *GV : V)
245 if (!convertToDeclaration(*GV))
246 GV->eraseFromParent();
247}
248
249void forEachVirtualFunction(Constant *C, function_ref<void(Function *)> Fn) {
250 if (auto *F = dyn_cast<Function>(C))
251 return Fn(F);
252 if (isa<GlobalValue>(C))
253 return;
254 for (Value *Op : C->operands())
255 forEachVirtualFunction(cast<Constant>(Op), Fn);
256}
257
258// Clone any @llvm[.compiler].used over to the new module and append
259// values whose defs were cloned into that module.
260static void cloneUsedGlobalVariables(const Module &SrcM, Module &DestM,
261 bool CompilerUsed) {
263 // First collect those in the llvm[.compiler].used set.
264 collectUsedGlobalVariables(SrcM, Used, CompilerUsed);
265 // Next build a set of the equivalent values defined in DestM.
266 for (auto *V : Used) {
267 auto *GV = DestM.getNamedValue(V->getName());
268 if (GV && !GV->isDeclaration())
269 NewUsed.push_back(GV);
270 }
271 // Finally, add them to a llvm[.compiler].used variable in DestM.
272 if (CompilerUsed)
273 appendToCompilerUsed(DestM, NewUsed);
274 else
275 appendToUsed(DestM, NewUsed);
276}
277
278#ifndef NDEBUG
279static bool enableUnifiedLTO(Module &M) {
280 bool UnifiedLTO = false;
281 if (auto *MD =
282 mdconst::extract_or_null<ConstantInt>(M.getModuleFlag("UnifiedLTO")))
283 UnifiedLTO = MD->getZExtValue();
284 return UnifiedLTO;
285}
286#endif
287
288bool mustEmitToMergedModule(const GlobalValue *GV) {
289 // The __cfi_check definition is filled in by the CrossDSOCFI pass which
290 // runs only in the merged module.
291 return GV->getName() == "__cfi_check";
292}
293
294// If it's possible to split M into regular and thin LTO parts, do so and write
295// a multi-module bitcode file with the two parts to OS. Otherwise, write only a
296// regular LTO bitcode file to OS.
297void splitAndWriteThinLTOBitcode(
298 raw_ostream &OS, raw_ostream *ThinLinkOS,
299 function_ref<AAResults &(Function &)> AARGetter, Module &M,
300 const bool ShouldPreserveUseListOrder) {
301 std::string ModuleId = getUniqueModuleId(&M);
302 if (ModuleId.empty()) {
303 assert(!enableUnifiedLTO(M));
304 // We couldn't generate a module ID for this module, write it out as a
305 // regular LTO module with an index for summary-based dead stripping.
306 ProfileSummaryInfo PSI(M);
307 M.addModuleFlag(Module::Error, "ThinLTO", uint32_t(0));
308 ModuleSummaryIndex Index = buildModuleSummaryIndex(M, nullptr, &PSI);
309 WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, &Index,
310 /*UnifiedLTO=*/false);
311
312 if (ThinLinkOS)
313 // We don't have a ThinLTO part, but still write the module to the
314 // ThinLinkOS if requested so that the expected output file is produced.
315 WriteBitcodeToFile(M, *ThinLinkOS, ShouldPreserveUseListOrder, &Index,
316 /*UnifiedLTO=*/false);
317
318 return;
319 }
320
321 promoteTypeIds(M, ModuleId);
322
323 // Returns whether a global or its associated global has attached type
324 // metadata. The former may participate in CFI or whole-program
325 // devirtualization, so they need to appear in the merged module instead of
326 // the thin LTO module. Similarly, globals that are associated with globals
327 // with type metadata need to appear in the merged module because they will
328 // reference the global's section directly.
329 auto HasTypeMetadata = [](const GlobalObject *GO) {
330 if (MDNode *MD = GO->getMetadata(LLVMContext::MD_associated))
331 if (auto *AssocVM = dyn_cast_or_null<ValueAsMetadata>(MD->getOperand(0)))
332 if (auto *AssocGO = dyn_cast<GlobalObject>(AssocVM->getValue()))
333 if (AssocGO->hasMetadata(LLVMContext::MD_type))
334 return true;
335 return GO->hasMetadata(LLVMContext::MD_type);
336 };
337
338 // Collect the set of virtual functions that are eligible for virtual constant
339 // propagation. Each eligible function must not access memory, must return
340 // an integer of width <=64 bits, must take at least one argument, must not
341 // use its first argument (assumed to be "this") and all arguments other than
342 // the first one must be of <=64 bit integer type.
343 //
344 // Note that we test whether this copy of the function is readnone, rather
345 // than testing function attributes, which must hold for any copy of the
346 // function, even a less optimized version substituted at link time. This is
347 // sound because the virtual constant propagation optimizations effectively
348 // inline all implementations of the virtual function into each call site,
349 // rather than using function attributes to perform local optimization.
350 DenseSet<const Function *> EligibleVirtualFns;
351 // If any member of a comdat lives in MergedM, put all members of that
352 // comdat in MergedM to keep the comdat together.
353 DenseSet<const Comdat *> MergedMComdats;
354 for (GlobalVariable &GV : M.globals())
355 if (!GV.isDeclaration() && HasTypeMetadata(&GV)) {
356 if (const auto *C = GV.getComdat())
357 MergedMComdats.insert(C);
358 forEachVirtualFunction(GV.getInitializer(), [&](Function *F) {
359 auto *RT = dyn_cast<IntegerType>(F->getReturnType());
360 if (!RT || RT->getBitWidth() > 64 || F->arg_empty() ||
361 !F->arg_begin()->use_empty())
362 return;
363 for (auto &Arg : drop_begin(F->args())) {
364 auto *ArgT = dyn_cast<IntegerType>(Arg.getType());
365 if (!ArgT || ArgT->getBitWidth() > 64)
366 return;
367 }
368 if (!F->isDeclaration() &&
369 computeFunctionBodyMemoryAccess(*F, AARGetter(*F))
370 .doesNotAccessMemory())
371 EligibleVirtualFns.insert(F);
372 });
373 }
374
376 std::unique_ptr<Module> MergedM(
377 CloneModule(M, VMap, [&](const GlobalValue *GV) -> bool {
378 if (const auto *C = GV->getComdat())
379 if (MergedMComdats.count(C))
380 return true;
381 if (mustEmitToMergedModule(GV))
382 return true;
383 if (auto *F = dyn_cast<Function>(GV))
384 return EligibleVirtualFns.count(F);
385 if (auto *GVar =
387 return HasTypeMetadata(GVar);
388 return false;
389 }));
390 StripDebugInfo(*MergedM);
391 MergedM->setModuleInlineAsm("");
392
393 // Clone any llvm.*used globals to ensure the included values are
394 // not deleted.
395 cloneUsedGlobalVariables(M, *MergedM, /*CompilerUsed*/ false);
396 cloneUsedGlobalVariables(M, *MergedM, /*CompilerUsed*/ true);
397
398 for (Function &F : *MergedM)
399 if (!F.isDeclaration() && !mustEmitToMergedModule(&F)) {
400 // Reset the linkage of all functions eligible for virtual constant
401 // propagation. The canonical definitions live in the thin LTO module so
402 // that they can be imported.
404 F.setComdat(nullptr);
405 }
406
407 SetVector<GlobalValue *> CfiFunctions;
408 for (auto &F : M)
409 if ((!F.hasLocalLinkage() || F.hasAddressTaken()) && HasTypeMetadata(&F))
410 CfiFunctions.insert(&F);
411 for (auto &A : M.aliases())
412 if (auto *F = dyn_cast<Function>(A.getAliasee()))
413 if (HasTypeMetadata(F))
414 CfiFunctions.insert(&A);
415
416 // Remove all globals with type metadata, globals with comdats that live in
417 // MergedM, and aliases pointing to such globals from the thin LTO module.
418 filterModule(&M, [&](const GlobalValue *GV) {
420 if (HasTypeMetadata(GVar))
421 return false;
422 if (const auto *C = GV->getComdat())
423 if (MergedMComdats.count(C))
424 return false;
425 if (mustEmitToMergedModule(GV))
426 return false;
427 return true;
428 });
429
430 // CfiFunctions contains only symbols from M. promoteInternals tries to find
431 // match values from its first argument (the "exporting module") in
432 // CfiFunctions. So we only need CfiFunctions for the second promotion (M ->
433 // MergedM)
434 promoteInternals(*MergedM, M, ModuleId, {});
435 promoteInternals(M, *MergedM, ModuleId, CfiFunctions);
436
437 auto &Ctx = MergedM->getContext();
438 SmallVector<MDNode *, 8> CfiFunctionMDs;
439 for (auto *V : CfiFunctions) {
440 Function &F = *cast<Function>(V->getAliaseeObject());
442 F.getMetadata(LLVMContext::MD_type, Types);
443
445 Elts.push_back(MDString::get(Ctx, V->getName()));
449 else if (F.hasExternalWeakLinkage())
451 else
454 llvm::ConstantInt::get(Type::getInt8Ty(Ctx), Linkage)));
455 // TODO: use F->getGUID() once #184065 is relanded.
459 llvm::ConstantInt::get(Type::getInt64Ty(Ctx), GUID)));
460 append_range(Elts, Types);
461 CfiFunctionMDs.push_back(MDTuple::get(Ctx, Elts));
462 }
463
464 if(!CfiFunctionMDs.empty()) {
465 NamedMDNode *NMD = MergedM->getOrInsertNamedMetadata("cfi.functions");
466 for (auto *MD : CfiFunctionMDs)
467 NMD->addOperand(MD);
468 }
469
471 for (auto &A : M.aliases()) {
472 if (!isa<Function>(A.getAliasee()))
473 continue;
474
475 auto *F = cast<Function>(A.getAliasee());
476 FunctionAliases[F].push_back(&A);
477 }
478
479 if (!FunctionAliases.empty()) {
480 NamedMDNode *NMD = MergedM->getOrInsertNamedMetadata("aliases");
481 for (auto &Alias : FunctionAliases) {
483 Elts.push_back(MDString::get(Ctx, Alias.first->getName()));
484 for (auto *A : Alias.second)
485 Elts.push_back(MDString::get(Ctx, A->getName()));
486 NMD->addOperand(MDTuple::get(Ctx, Elts));
487 }
488 }
489
492 Function *F = M.getFunction(Name);
493 if (!F || F->use_empty())
494 return;
495
496 Symvers.push_back(MDTuple::get(
497 Ctx, {MDString::get(Ctx, Name), MDString::get(Ctx, Alias)}));
498 });
499
500 if (!Symvers.empty()) {
501 NamedMDNode *NMD = MergedM->getOrInsertNamedMetadata("symvers");
502 for (auto *MD : Symvers)
503 NMD->addOperand(MD);
504 }
505
506 simplifyExternals(*MergedM);
507
508 // FIXME: Try to re-use BSI and PFI from the original module here.
509 ProfileSummaryInfo PSI(M);
510 ModuleSummaryIndex Index = buildModuleSummaryIndex(M, nullptr, &PSI);
511
512 // Mark the merged module as requiring full LTO. We still want an index for
513 // it though, so that it can participate in summary-based dead stripping.
514 MergedM->addModuleFlag(Module::Error, "ThinLTO", uint32_t(0));
515 ModuleSummaryIndex MergedMIndex =
516 buildModuleSummaryIndex(*MergedM, nullptr, &PSI);
517
519
520 BitcodeWriter W(Buffer);
521 // Save the module hash produced for the full bitcode, which will
522 // be used in the backends, and use that in the minimized bitcode
523 // produced for the full link.
524 ModuleHash ModHash = {{0}};
525 W.writeModule(M, ShouldPreserveUseListOrder, &Index,
526 /*GenerateHash=*/true, &ModHash);
527 W.writeModule(*MergedM, ShouldPreserveUseListOrder, &MergedMIndex);
528 W.writeSymtab();
529 W.writeStrtab();
530 OS << Buffer;
531
532 // If a minimized bitcode module was requested for the thin link, only
533 // the information that is needed by thin link will be written in the
534 // given OS (the merged module will be written as usual).
535 if (ThinLinkOS) {
536 Buffer.clear();
537 BitcodeWriter W2(Buffer);
539 W2.writeThinLinkBitcode(M, Index, ModHash);
540 W2.writeModule(*MergedM, /*ShouldPreserveUseListOrder=*/false,
541 &MergedMIndex);
542 W2.writeSymtab();
543 W2.writeStrtab();
544 *ThinLinkOS << Buffer;
545 }
546}
547
548// Check if the LTO Unit splitting has been enabled.
549bool enableSplitLTOUnit(Module &M) {
550 bool EnableSplitLTOUnit = false;
552 M.getModuleFlag("EnableSplitLTOUnit")))
553 EnableSplitLTOUnit = MD->getZExtValue();
554 return EnableSplitLTOUnit;
555}
556
557// Returns whether this module needs to be split (if splitting is enabled).
558bool requiresSplit(Module &M) {
559 for (auto &GO : M.global_objects()) {
560 if (GO.hasMetadata(LLVMContext::MD_type))
561 return true;
562 if (mustEmitToMergedModule(&GO))
563 return true;
564 }
565 return false;
566}
567
568bool writeThinLTOBitcode(raw_ostream &OS, raw_ostream *ThinLinkOS,
569 function_ref<AAResults &(Function &)> AARGetter,
570 Module &M, const ModuleSummaryIndex *Index,
571 const bool ShouldPreserveUseListOrder) {
572 std::unique_ptr<ModuleSummaryIndex> NewIndex = nullptr;
573 // See if this module needs to be split. If so, we try to split it
574 // or at least promote type ids to enable WPD.
575 if (requiresSplit(M)) {
576 if (enableSplitLTOUnit(M)) {
577 splitAndWriteThinLTOBitcode(OS, ThinLinkOS, AARGetter, M,
578 ShouldPreserveUseListOrder);
579 return true;
580 }
581 // Promote type ids as needed for index-based WPD.
582 std::string ModuleId = getUniqueModuleId(&M);
583 if (!ModuleId.empty()) {
584 promoteTypeIds(M, ModuleId);
585 // Need to rebuild the index so that it contains type metadata
586 // for the newly promoted type ids.
587 // FIXME: Probably should not bother building the index at all
588 // in the caller of writeThinLTOBitcode (which does so via the
589 // ModuleSummaryIndexAnalysis pass), since we have to rebuild it
590 // anyway whenever there is type metadata (here or in
591 // splitAndWriteThinLTOBitcode). Just always build it once via the
592 // buildModuleSummaryIndex when Module(s) are ready.
593 ProfileSummaryInfo PSI(M);
594 NewIndex = std::make_unique<ModuleSummaryIndex>(
595 buildModuleSummaryIndex(M, nullptr, &PSI));
596 Index = NewIndex.get();
597 }
598 }
599
600 // Write it out as an unsplit ThinLTO module.
601
602 // Save the module hash produced for the full bitcode, which will
603 // be used in the backends, and use that in the minimized bitcode
604 // produced for the full link.
605 ModuleHash ModHash = {{0}};
606 WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, Index,
607 /*GenerateHash=*/true, &ModHash);
608 // If a minimized bitcode module was requested for the thin link, only
609 // the information that is needed by thin link will be written in the
610 // given OS.
611 if (ThinLinkOS && Index)
612 writeThinLinkBitcodeToFile(M, *ThinLinkOS, *Index, ModHash);
613 return false;
614}
615
616} // anonymous namespace
617
622
623 bool Changed = writeThinLTOBitcode(
624 OS, ThinLinkOS,
625 [&FAM](Function &F) -> AAResults & {
626 return FAM.getResult<AAManager>(F);
627 },
629 ShouldPreserveUseListOrder);
630
632}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This is the interface for LLVM's primary stateless and local alias analysis.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
DXIL Finalize Linkage
Provides passes for computing function attributes based on interprocedural analyses.
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This is the interface to build a ModuleSummaryIndex for a module.
FunctionAnalysisManager FAM
if(PassOpts->AAPipeline)
A manager for alias analyses.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Value * getArgOperand(unsigned i) const
void setArgOperand(unsigned i, Value *v)
This class represents a function call, abstracting a target machine's calling convention.
static ConstantAsMetadata * get(Constant *C)
Definition Metadata.h:537
This is an important base class in LLVM.
Definition Constant.h:43
LLVM_ABI void removeDeadConstantUsers() const
If there are any dead constant users dangling off of this constant, remove them.
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:225
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:301
unsigned size() const
Definition DenseMap.h:174
bool empty() const
Definition DenseMap.h:173
iterator end()
Definition DenseMap.h:143
Implements a dense probed hash-table based set.
Definition DenseSet.h:289
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
Definition Function.h:168
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
Definition Function.h:331
void copyAttributesFrom(const Function *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a Function) from the ...
Definition Function.cpp:838
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
Definition Globals.cpp:80
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
Definition Globals.cpp:346
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
LLVM_ABI const Comdat * getComdat() const
Definition Globals.cpp:212
LLVM_ABI const GlobalObject * getAliaseeObject() const
Definition Globals.cpp:459
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing module and deletes it.
Definition Globals.cpp:96
@ HiddenVisibility
The GV is hidden.
Definition GlobalValue.h:69
void setVisibility(VisibilityTypes V)
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
@ AvailableExternallyLinkage
Available for inspection, not emission.
Definition GlobalValue.h:54
Metadata node.
Definition Metadata.h:1069
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1554
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:614
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1511
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:38
bool empty() const
Definition MapVector.h:79
static LLVM_ABI MetadataAsValue * get(LLVMContext &Context, Metadata *MD)
Definition Metadata.cpp:110
Root of the metadata hierarchy.
Definition Metadata.h:64
Analysis pass to provide the ModuleSummaryIndex object.
Class to hold module path string table and global value map, and encapsulate methods for operating on...
static LLVM_ABI 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.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
@ Error
Emits an error if two values disagree, otherwise the resulting value is that of the operands.
Definition Module.h:120
iterator_range< global_object_iterator > global_objects()
Definition Module.cpp:451
GlobalValue * getNamedValue(StringRef Name) const
Return the global value in the module with the specified name, of arbitrary type.
Definition Module.cpp:177
Comdat * getOrInsertComdat(StringRef Name)
Return the Comdat in the module with the specified name.
Definition Module.cpp:621
void appendModuleInlineAsm(StringRef Asm)
Append to the module-scope inline assembly blocks.
Definition Module.h:338
iterator_range< global_value_iterator > global_values()
Definition Module.cpp:459
A tuple of MDNodes.
Definition Metadata.h:1742
LLVM_ABI void addOperand(MDNode *M)
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
Definition Analysis.h:115
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
Analysis providing profile information.
A vector that has set insertion semantics.
Definition SetVector.h:57
size_type count(const_arg_type key) const
Count the number of elements of a given key in the SetVector.
Definition SetVector.h:262
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:151
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:310
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:282
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:307
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM Value Representation.
Definition Value.h:75
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
Definition Value.cpp:394
bool use_empty() const
Definition Value.h:346
iterator_range< use_iterator > uses()
Definition Value.h:380
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:400
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:212
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:190
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
Changed
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
LLVM_ABI Function * getDeclarationIfExists(const Module *M, ID id)
Look up the Function declaration of the intrinsic id in the Module M and return it if it exists.
LLVM_ABI bool isJumpTableCanonical(Function *F)
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract_or_null(Y &&MD)
Extract a Value from Metadata, allowing null.
Definition Metadata.h:683
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI MemoryEffects computeFunctionBodyMemoryAccess(Function &F, AAResults &AAR)
Returns the memory access properties of this copy of the function.
LLVM_ABI 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.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
std::array< uint32_t, 5 > ModuleHash
160 bits SHA1
LLVM_ABI 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...
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:633
LLVM_ABI bool convertToDeclaration(GlobalValue &GV)
Converts value GV to declaration, or replaces with a declaration if it is an alias.
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
LLVM_ABI ModuleSummaryIndex buildModuleSummaryIndex(const Module &M, std::function< BlockFrequencyInfo *(const Function &F)> GetBFICallback, ProfileSummaryInfo *PSI, std::function< const StackSafetyInfo *(const Function &F)> GetSSICallback=[](const Function &F) -> const StackSafetyInfo *{ return nullptr;})
Direct function to compute a ModuleSummaryIndex from a given module.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
LLVM_ABI std::string getUniqueModuleId(Module *M)
Produce a unique identifier for this module by taking the MD5 sum of the names of the module's strong...
bool isAlnum(char C)
Checks whether character C is either a decimal digit or an uppercase or lowercase letter as classifie...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
LLVM_ABI void appendToCompilerUsed(Module &M, ArrayRef< GlobalValue * > Values)
Adds global values to the llvm.compiler.used list.
DWARFExpression::Operation Op
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI std::unique_ptr< Module > CloneModule(const Module &M)
Return an exact copy of the specified module.
LLVM_ABI void appendToUsed(Module &M, ArrayRef< GlobalValue * > Values)
Adds global values to the llvm.used list.
CfiFunctionLinkage
The type of CFI jumptable needed for a function.
@ CFL_WeakDeclaration
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
LLVM_ABI GlobalVariable * collectUsedGlobalVariables(const Module &M, SmallVectorImpl< GlobalValue * > &Vec, bool CompilerUsed)
Given "llvm.used" or "llvm.compiler.used" as a global name, collect the initializer elements of that ...
Definition Module.cpp:898