LLVM 24.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"
22#include "llvm/Transforms/IPO.h"
28using namespace llvm;
29
30namespace {
31
32// Determine if a promotion alias should be created for a symbol name.
33static bool allowPromotionAlias(const std::string &Name) {
34 // Promotion aliases are used only in inline assembly. It's safe to
35 // simply skip unusual names. Subset of MCAsmInfo::isAcceptableChar().
36 for (const char &C : Name) {
37 if (isAlnum(C) || C == '_' || C == '.')
38 continue;
39 return false;
40 }
41 return true;
42}
43
44// Promote each local-linkage entity defined by ExportM and used by ImportM by
45// changing visibility and appending the given ModuleId.
46void promoteInternals(Module &ExportM, Module &ImportM, StringRef ModuleId,
47 const SetVector<GlobalValue *> &PromoteExtra) {
49 for (auto &ExportGV : ExportM.global_values()) {
50 if (!ExportGV.hasLocalLinkage())
51 continue;
52
53 auto Name = ExportGV.getName();
54 GlobalValue *ImportGV = nullptr;
55 if (!PromoteExtra.count(&ExportGV)) {
56 ImportGV = ImportM.getNamedValue(Name);
57 if (!ImportGV)
58 continue;
59 ImportGV->removeDeadConstantUsers();
60 if (ImportGV->use_empty()) {
61 ImportGV->eraseFromParent();
62 continue;
63 }
64 }
65
66 std::string OldName = Name.str();
67 std::string NewName = (Name + ModuleId).str();
68
69 if (const auto *C = ExportGV.getComdat())
70 if (C->getName() == Name)
71 RenamedComdats.try_emplace(C, ExportM.getOrInsertComdat(NewName));
72
73 ExportGV.setName(NewName);
74 ExportGV.setLinkage(GlobalValue::ExternalLinkage);
75 ExportGV.setVisibility(GlobalValue::HiddenVisibility);
76 // TODO: remove this reassign and instead create an alias.
77 ExportGV.reassignGUID();
78 if (ImportGV) {
79 ImportGV->setName(NewName);
81 ImportGV->reassignGUID();
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
209 F.getAddressSpace(), "", &M);
210 NewF->copyAttributesFrom(&F);
211 // Only copy function attribtues.
212 NewF->setAttributes(AttributeList::get(M.getContext(),
213 AttributeList::FunctionIndex,
214 F.getAttributes().getFnAttrs()));
215 NewF->takeName(&F);
216 NewF->setMetadata(LLVMContext::MD_guid,
217 F.getMetadata(LLVMContext::MD_guid));
218 F.replaceAllUsesWith(NewF);
219 F.eraseFromParent();
220 }
221
222 for (GlobalIFunc &I : llvm::make_early_inc_range(M.ifuncs())) {
223 if (I.use_empty())
224 I.eraseFromParent();
225 else
226 assert(I.getResolverFunction() && "ifunc misses its resolver function");
227 }
228
229 for (GlobalVariable &GV : llvm::make_early_inc_range(M.globals())) {
230 if (GV.isDeclaration() && GV.use_empty()) {
231 GV.eraseFromParent();
232 continue;
233 }
234 }
235}
236
237static void
238filterModule(Module *M,
239 function_ref<bool(const GlobalValue *)> ShouldKeepDefinition) {
240 std::vector<GlobalValue *> V;
241 for (GlobalValue &GV : M->global_values())
242 if (!ShouldKeepDefinition(&GV))
243 V.push_back(&GV);
244
245 for (GlobalValue *GV : V)
246 if (!convertToDeclaration(*GV))
247 GV->eraseFromParent();
248}
249
250void forEachVirtualFunction(Constant *C, function_ref<void(Function *)> Fn) {
251 if (auto *F = dyn_cast<Function>(C))
252 return Fn(F);
253 if (isa<GlobalValue>(C))
254 return;
255 for (Value *Op : C->operands())
256 forEachVirtualFunction(cast<Constant>(Op), Fn);
257}
258
259// Clone any @llvm[.compiler].used over to the new module and append
260// values whose defs were cloned into that module.
261static void cloneUsedGlobalVariables(const Module &SrcM, Module &DestM,
262 bool CompilerUsed) {
264 // First collect those in the llvm[.compiler].used set.
265 collectUsedGlobalVariables(SrcM, Used, CompilerUsed);
266 // Next build a set of the equivalent values defined in DestM.
267 for (auto *V : Used) {
268 auto *GV = DestM.getNamedValue(V->getName());
269 if (GV && !GV->isDeclaration())
270 NewUsed.push_back(GV);
271 }
272 // Finally, add them to a llvm[.compiler].used variable in DestM.
273 if (CompilerUsed)
274 appendToCompilerUsed(DestM, NewUsed);
275 else
276 appendToUsed(DestM, NewUsed);
277}
278
279#ifndef NDEBUG
280static bool enableUnifiedLTO(Module &M) {
281 bool UnifiedLTO = false;
282 if (auto *MD =
283 mdconst::extract_or_null<ConstantInt>(M.getModuleFlag("UnifiedLTO")))
284 UnifiedLTO = MD->getZExtValue();
285 return UnifiedLTO;
286}
287#endif
288
289bool mustEmitToMergedModule(const GlobalValue *GV) {
290 // The __cfi_check definition is filled in by the CrossDSOCFI pass which
291 // runs only in the merged module.
292 return GV->getName() == "__cfi_check";
293}
294
295// If it's possible to split M into regular and thin LTO parts, do so and write
296// a multi-module bitcode file with the two parts to OS. Otherwise, write only a
297// regular LTO bitcode file to OS.
298void splitAndWriteThinLTOBitcode(
299 raw_ostream &OS, raw_ostream *ThinLinkOS,
300 function_ref<AAResults &(Function &)> AARGetter,
301 function_ref<const BlockFrequencyInfo &(Function &)> BFIGetter, Module &M,
302 const bool ShouldPreserveUseListOrder) {
303 std::string ModuleId = getUniqueModuleId(&M);
304 if (ModuleId.empty()) {
305 assert(!enableUnifiedLTO(M));
306 // We couldn't generate a module ID for this module, write it out as a
307 // regular LTO module with an index for summary-based dead stripping.
308 ProfileSummaryInfo PSI(M);
309 M.addModuleFlag(Module::Error, "ThinLTO", uint32_t(0));
310 ModuleSummaryIndex Index = buildModuleSummaryIndex(M, nullptr, &PSI);
311 WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, &Index,
312 /*UnifiedLTO=*/false);
313
314 if (ThinLinkOS)
315 // We don't have a ThinLTO part, but still write the module to the
316 // ThinLinkOS if requested so that the expected output file is produced.
317 WriteBitcodeToFile(M, *ThinLinkOS, ShouldPreserveUseListOrder, &Index,
318 /*UnifiedLTO=*/false);
319
320 return;
321 }
322
323 promoteTypeIds(M, ModuleId);
324
325 // Collect the set of virtual functions that are eligible for virtual constant
326 // propagation. Each eligible function must not access memory, must return
327 // an integer of width <=64 bits, must take at least one argument, must not
328 // use its first argument (assumed to be "this") and all arguments other than
329 // the first one must be of <=64 bit integer type.
330 //
331 // Note that we test whether this copy of the function is readnone, rather
332 // than testing function attributes, which must hold for any copy of the
333 // function, even a less optimized version substituted at link time. This is
334 // sound because the virtual constant propagation optimizations effectively
335 // inline all implementations of the virtual function into each call site,
336 // rather than using function attributes to perform local optimization.
337 DenseSet<const Function *> EligibleVirtualFns;
338 // If any member of a comdat lives in MergedM, put all members of that
339 // comdat in MergedM to keep the comdat together.
340 DenseSet<const Comdat *> MergedMComdats;
341 for (GlobalVariable &GV : M.globals())
343 if (const auto *C = GV.getComdat())
344 MergedMComdats.insert(C);
345 forEachVirtualFunction(GV.getInitializer(), [&](Function *F) {
346 auto *RT = dyn_cast<IntegerType>(F->getReturnType());
347 if (!RT || RT->getBitWidth() > 64 || F->arg_empty() ||
348 !F->arg_begin()->use_empty())
349 return;
350 for (auto &Arg : drop_begin(F->args())) {
351 auto *ArgT = dyn_cast<IntegerType>(Arg.getType());
352 if (!ArgT || ArgT->getBitWidth() > 64)
353 return;
354 }
355 if (!F->isDeclaration() &&
356 computeFunctionBodyMemoryAccess(*F, AARGetter(*F))
357 .doesNotAccessMemory())
358 EligibleVirtualFns.insert(F);
359 });
360 }
361
363 std::unique_ptr<Module> MergedM(
364 CloneModule(M, VMap, [&](const GlobalValue *GV) -> bool {
365 if (const auto *C = GV->getComdat())
366 if (MergedMComdats.count(C))
367 return true;
368 if (mustEmitToMergedModule(GV))
369 return true;
370 if (auto *F = dyn_cast<Function>(GV))
371 return EligibleVirtualFns.count(F);
372 if (auto *GVar =
375 return false;
376 }));
377 StripDebugInfo(*MergedM);
378 MergedM->removeModuleInlineAsm();
379
380 // Clone any llvm.*used globals to ensure the included values are
381 // not deleted.
382 cloneUsedGlobalVariables(M, *MergedM, /*CompilerUsed*/ false);
383 cloneUsedGlobalVariables(M, *MergedM, /*CompilerUsed*/ true);
384
385 for (Function &F : *MergedM)
386 if (!F.isDeclaration() && !mustEmitToMergedModule(&F)) {
387 // Reset the linkage of all functions eligible for virtual constant
388 // propagation. The canonical definitions live in the thin LTO module so
389 // that they can be imported.
391 F.setComdat(nullptr);
392 }
393
395
396 // Remove all globals with type metadata, globals with comdats that live in
397 // MergedM, and aliases pointing to such globals from the thin LTO module.
398 filterModule(&M, [&](const GlobalValue *GV) {
401 return false;
402 if (const auto *C = GV->getComdat())
403 if (MergedMComdats.count(C))
404 return false;
405 if (mustEmitToMergedModule(GV))
406 return false;
407 return true;
408 });
409
410 // CfiFunctions contains only symbols from M. promoteInternals tries to find
411 // match values from its first argument (the "exporting module") in
412 // CfiFunctions. So we only need CfiFunctions for the second promotion (M ->
413 // MergedM)
414 promoteInternals(*MergedM, M, ModuleId, {});
415 promoteInternals(M, *MergedM, ModuleId, CfiFunctions);
416
417 // FIXME: Try to re-use PSI from the original module here.
418 ProfileSummaryInfo PSI(M);
419
420 lowertypetests::createCfiMetadata(*MergedM, M, CfiFunctions.getArrayRef(),
421 PSI, BFIGetter);
422
423 simplifyExternals(*MergedM);
424
425 // FIXME: Try to re-use BSI from the original module here.
426 ModuleSummaryIndex Index = buildModuleSummaryIndex(M, nullptr, &PSI);
427
428 // Mark the merged module as requiring full LTO. We still want an index for
429 // it though, so that it can participate in summary-based dead stripping.
430 MergedM->addModuleFlag(Module::Error, "ThinLTO", uint32_t(0));
431 ModuleSummaryIndex MergedMIndex =
432 buildModuleSummaryIndex(*MergedM, nullptr, &PSI);
433
435
436 BitcodeWriter W(Buffer);
437 // Save the module hash produced for the full bitcode, which will
438 // be used in the backends, and use that in the minimized bitcode
439 // produced for the full link.
440 ModuleHash ModHash = {{0}};
441 W.writeModule(M, ShouldPreserveUseListOrder, &Index,
442 /*GenerateHash=*/true, &ModHash);
443 W.writeModule(*MergedM, ShouldPreserveUseListOrder, &MergedMIndex);
444 W.writeSymtab();
445 W.writeStrtab();
446 OS << Buffer;
447
448 // If a minimized bitcode module was requested for the thin link, only
449 // the information that is needed by thin link will be written in the
450 // given OS (the merged module will be written as usual).
451 if (ThinLinkOS) {
452 Buffer.clear();
453 BitcodeWriter W2(Buffer);
455 W2.writeThinLinkBitcode(M, Index, ModHash);
456 W2.writeModule(*MergedM, /*ShouldPreserveUseListOrder=*/false,
457 &MergedMIndex);
458 W2.writeSymtab();
459 W2.writeStrtab();
460 *ThinLinkOS << Buffer;
461 }
462}
463
464// Check if the LTO Unit splitting has been enabled.
465bool enableSplitLTOUnit(Module &M) {
466 bool EnableSplitLTOUnit = false;
468 M.getModuleFlag("EnableSplitLTOUnit")))
469 EnableSplitLTOUnit = MD->getZExtValue();
470 return EnableSplitLTOUnit;
471}
472
473// Returns whether this module needs to be split (if splitting is enabled).
474bool requiresSplit(Module &M) {
475 for (auto &GO : M.global_objects()) {
476 if (GO.hasMetadata(LLVMContext::MD_type))
477 return true;
478 if (mustEmitToMergedModule(&GO))
479 return true;
480 }
481 return false;
482}
483
484bool writeThinLTOBitcode(
485 raw_ostream &OS, raw_ostream *ThinLinkOS,
486 function_ref<AAResults &(Function &)> AARGetter,
487 function_ref<const BlockFrequencyInfo &(Function &)> BFIGetter, Module &M,
488 const ModuleSummaryIndex *Index, const bool ShouldPreserveUseListOrder) {
489 std::unique_ptr<ModuleSummaryIndex> NewIndex = nullptr;
490 // See if this module needs to be split. If so, we try to split it
491 // or at least promote type ids to enable WPD.
492 if (requiresSplit(M)) {
493 if (enableSplitLTOUnit(M)) {
494 splitAndWriteThinLTOBitcode(OS, ThinLinkOS, AARGetter, BFIGetter, M,
495 ShouldPreserveUseListOrder);
496 return true;
497 }
498 // Promote type ids as needed for index-based WPD.
499 std::string ModuleId = getUniqueModuleId(&M);
500 if (!ModuleId.empty()) {
501 promoteTypeIds(M, ModuleId);
502 // Need to rebuild the index so that it contains type metadata
503 // for the newly promoted type ids.
504 // FIXME: Probably should not bother building the index at all
505 // in the caller of writeThinLTOBitcode (which does so via the
506 // ModuleSummaryIndexAnalysis pass), since we have to rebuild it
507 // anyway whenever there is type metadata (here or in
508 // splitAndWriteThinLTOBitcode). Just always build it once via the
509 // buildModuleSummaryIndex when Module(s) are ready.
510 ProfileSummaryInfo PSI(M);
511 NewIndex = std::make_unique<ModuleSummaryIndex>(
512 buildModuleSummaryIndex(M, nullptr, &PSI));
513 Index = NewIndex.get();
514 }
515 }
516
517 // Write it out as an unsplit ThinLTO module.
518
519 // Save the module hash produced for the full bitcode, which will
520 // be used in the backends, and use that in the minimized bitcode
521 // produced for the full link.
522 ModuleHash ModHash = {{0}};
523 WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, Index,
524 /*GenerateHash=*/true, &ModHash);
525 // If a minimized bitcode module was requested for the thin link, only
526 // the information that is needed by thin link will be written in the
527 // given OS.
528 if (ThinLinkOS && Index)
529 writeThinLinkBitcodeToFile(M, *ThinLinkOS, *Index, ModHash);
530 return false;
531}
532
533} // anonymous namespace
534
539
540 bool Changed = writeThinLTOBitcode(
541 OS, ThinLinkOS,
542 [&FAM](Function &F) -> AAResults & {
543 return FAM.getResult<AAManager>(F);
544 },
545 [&FAM](Function &F) -> const BlockFrequencyInfo & {
546 return FAM.getResult<BlockFrequencyAnalysis>(F);
547 },
549 ShouldPreserveUseListOrder);
550
552}
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< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
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.
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Value * getArgOperand(unsigned i) const
void setArgOperand(unsigned i, Value *v)
This class represents a function call, abstracting a target machine's calling convention.
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:258
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:348
unsigned size() const
Definition DenseMap.h:207
bool empty() const
Definition DenseMap.h:206
iterator end()
Definition DenseMap.h:176
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
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:169
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
Definition Function.h:332
void copyAttributesFrom(const Function *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a Function) from the ...
Definition Function.cpp:845
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set a particular kind of metadata attachment.
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:408
LLVM_ABI const Comdat * getComdat() const
Definition Globals.cpp:274
LLVM_ABI const GlobalObject * getAliaseeObject() const
Definition Globals.cpp:521
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing module and deletes it.
Definition Globals.cpp:158
@ HiddenVisibility
The GV is hidden.
Definition GlobalValue.h:69
void setVisibility(VisibilityTypes V)
LLVM_ABI void reassignGUID()
Recompute and assign a GUID to this value, replacing the existing GUID.
Definition Globals.cpp:96
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
@ AvailableExternallyLinkage
Available for inspection, not emission.
Definition GlobalValue.h:54
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1578
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:597
static LLVM_ABI MetadataAsValue * get(LLVMContext &Context, Metadata *MD)
Definition Metadata.cpp:107
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...
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
@ Error
Emits an error if two values disagree, otherwise the resulting value is that of the operands.
Definition Module.h:121
void appendModuleInlineAsm(GlobalAsmFragment Fragment)
Append to the module-scope inline assembly blocks.
Definition Module.h:398
iterator_range< global_object_iterator > global_objects()
Definition Module.cpp:461
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:631
iterator_range< global_value_iterator > global_values()
Definition Module.cpp:469
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
ArrayRef< value_type > getArrayRef() const
Definition SetVector.h:91
size_type count(const_arg_type key) const
Count the number of elements of a given key in the SetVector.
Definition SetVector.h:268
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 Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:272
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:348
iterator_range< use_iterator > uses()
Definition Value.h:382
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:209
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:187
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
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 void createCfiMetadata(Module &DestM, const Module &SrcM, ArrayRef< GlobalValue * > CfiFunctions, ProfileSummaryInfo &PSI, function_ref< const BlockFrequencyInfo &(Function &)> BFIGetter)
Creates cfi.functions, aliases, and symvers named metadata in DestM for CFI functions in CfiFunctions...
LLVM_ABI bool hasTypeMetadata(const GlobalObject &GO)
Returns whether a global or its associated global has attached type metadata.
LLVM_ABI SetVector< GlobalValue * > findCfiFunctions(Module &M)
Finds all functions and aliases in M that may need CFI jump table entries.
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:694
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...
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:649
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.
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:952