34static bool allowPromotionAlias(
const std::string &Name) {
38 for (
const char &
C : Name) {
52 if (!ExportGV.hasLocalLinkage())
55 auto Name = ExportGV.getName();
57 if (!PromoteExtra.
count(&ExportGV)) {
68 std::string OldName =
Name.str();
69 std::string NewName = (
Name + ModuleId).str();
71 if (
const auto *
C = ExportGV.getComdat())
72 if (
C->getName() == Name)
75 ExportGV.setName(NewName);
79 ExportGV.reassignGUID();
86 if (
isa<Function>(&ExportGV) && allowPromotionAlias(OldName)) {
90 ".lto_set_conditional " + OldName +
"," + NewName +
"\n";
95 if (!RenamedComdats.
empty())
97 if (
auto *
C = GO.getComdat()) {
98 auto Replacement = RenamedComdats.
find(
C);
99 if (Replacement != RenamedComdats.
end())
100 GO.setComdat(Replacement->second);
111 auto ExternalizeTypeId = [&](
CallInst *CI,
unsigned ArgNo) {
116 Metadata *&GlobalMD = LocalToGlobal[MD];
118 std::string NewName = (
Twine(LocalToGlobal.
size()) + ModuleId).str();
129 for (
const Use &U : TypeTestFunc->
uses()) {
131 ExternalizeTypeId(CI, 1);
137 for (
const Use &U : PublicTypeTestFunc->
uses()) {
139 ExternalizeTypeId(CI, 1);
145 for (
const Use &U : TypeCheckedLoadFunc->
uses()) {
147 ExternalizeTypeId(CI, 2);
152 &M, Intrinsic::type_checked_load_relative)) {
153 for (
const Use &U : TypeCheckedLoadRelativeFunc->
uses()) {
155 ExternalizeTypeId(CI, 2);
161 GO.getMetadata(LLVMContext::MD_type, MDs);
163 GO.eraseMetadata(LLVMContext::MD_type);
164 for (
auto *MD : MDs) {
165 auto I = LocalToGlobal.
find(MD->getOperand(1));
166 if (
I == LocalToGlobal.
end()) {
167 GO.addMetadata(LLVMContext::MD_type, *MD);
171 LLVMContext::MD_type,
172 *
MDNode::get(M.getContext(), {MD->getOperand(0), I->second}));
176 GO.getMetadata(LLVMContext::MD_callgraph, CGMDs);
178 GO.eraseMetadata(LLVMContext::MD_callgraph);
179 for (
auto *MD : CGMDs) {
180 if (MD->getNumOperands() == 1) {
181 auto I = LocalToGlobal.
find(MD->getOperand(0));
182 if (
I == LocalToGlobal.
end()) {
183 GO.addMetadata(LLVMContext::MD_callgraph, *MD);
186 GO.addMetadata(LLVMContext::MD_callgraph,
195void simplifyExternals(
Module &M) {
200 if (
F.isDeclaration() &&
F.use_empty()) {
205 if (!
F.isDeclaration() ||
F.getFunctionType() == EmptyFT ||
207 F.getName().starts_with(
"llvm."))
212 F.getAddressSpace(),
"", &M);
216 AttributeList::FunctionIndex,
217 F.getAttributes().getFnAttrs()));
220 F.getMetadata(LLVMContext::MD_unique_id));
221 F.replaceAllUsesWith(NewF);
229 assert(
I.getResolverFunction() &&
"ifunc misses its resolver function");
233 if (GV.isDeclaration() && GV.use_empty()) {
234 GV.eraseFromParent();
243 std::vector<GlobalValue *> V;
245 if (!ShouldKeepDefinition(&GV))
250 GV->eraseFromParent();
264static void cloneUsedGlobalVariables(
const Module &SrcM,
Module &DestM,
270 for (
auto *V : Used) {
272 if (GV && !GV->isDeclaration())
283static bool enableUnifiedLTO(
Module &M) {
284 bool UnifiedLTO =
false;
287 UnifiedLTO = MD->getZExtValue();
292bool mustEmitToMergedModule(
const GlobalValue *GV) {
295 return GV->
getName() ==
"__cfi_check";
301void splitAndWriteThinLTOBitcode(
304 const bool ShouldPreserveUseListOrder) {
306 if (ModuleId.empty()) {
307 assert(!enableUnifiedLTO(M));
325 promoteTypeIds(M, ModuleId);
334 if (
MDNode *MD = GO->getMetadata(LLVMContext::MD_associated))
337 if (AssocGO->hasMetadata(LLVMContext::MD_type))
339 return GO->hasMetadata(LLVMContext::MD_type);
362 forEachVirtualFunction(GV.getInitializer(), [&](
Function *
F) {
363 auto *RT = dyn_cast<IntegerType>(F->getReturnType());
364 if (!RT || RT->getBitWidth() > 64 || F->arg_empty() ||
365 !F->arg_begin()->use_empty())
367 for (auto &Arg : drop_begin(F->args())) {
368 auto *ArgT = dyn_cast<IntegerType>(Arg.getType());
369 if (!ArgT || ArgT->getBitWidth() > 64)
372 if (!
F->isDeclaration() &&
374 .doesNotAccessMemory())
380 std::unique_ptr<Module> MergedM(
383 if (MergedMComdats.
count(
C))
385 if (mustEmitToMergedModule(GV))
388 return EligibleVirtualFns.
count(
F);
391 return HasTypeMetadata(GVar);
395 MergedM->removeModuleInlineAsm();
399 cloneUsedGlobalVariables(M, *MergedM,
false);
400 cloneUsedGlobalVariables(M, *MergedM,
true);
403 if (!
F.isDeclaration() && !mustEmitToMergedModule(&
F)) {
408 F.setComdat(
nullptr);
413 if ((!
F.hasLocalLinkage() ||
F.hasAddressTaken()) && HasTypeMetadata(&
F))
415 for (
auto &
A : M.aliases())
417 if (HasTypeMetadata(
F))
424 if (HasTypeMetadata(GVar))
427 if (MergedMComdats.
count(
C))
429 if (mustEmitToMergedModule(GV))
438 promoteInternals(*MergedM, M, ModuleId, {});
439 promoteInternals(M, *MergedM, ModuleId, CfiFunctions);
441 auto &Ctx = MergedM->getContext();
443 for (
auto *V : CfiFunctions) {
446 F.getMetadata(LLVMContext::MD_type, Types);
453 else if (
F.hasExternalWeakLinkage())
466 if(!CfiFunctionMDs.
empty()) {
467 NamedMDNode *NMD = MergedM->getOrInsertNamedMetadata(
"cfi.functions");
468 for (
auto *MD : CfiFunctionMDs)
473 for (
auto &
A : M.aliases()) {
478 FunctionAliases[
F].push_back(&
A);
481 if (!FunctionAliases.
empty()) {
482 NamedMDNode *NMD = MergedM->getOrInsertNamedMetadata(
"aliases");
483 for (
auto &Alias : FunctionAliases) {
486 for (
auto *
A : Alias.second)
495 if (!
F ||
F->use_empty())
502 if (!Symvers.
empty()) {
503 NamedMDNode *NMD = MergedM->getOrInsertNamedMetadata(
"symvers");
504 for (
auto *MD : Symvers)
508 simplifyExternals(*MergedM);
527 W.writeModule(M, ShouldPreserveUseListOrder, &Index,
529 W.writeModule(*MergedM, ShouldPreserveUseListOrder, &MergedMIndex);
541 W2.writeThinLinkBitcode(M, Index, ModHash);
542 W2.writeModule(*MergedM,
false,
546 *ThinLinkOS << Buffer;
551bool enableSplitLTOUnit(
Module &M) {
552 bool EnableSplitLTOUnit =
false;
554 M.getModuleFlag(
"EnableSplitLTOUnit")))
555 EnableSplitLTOUnit = MD->getZExtValue();
556 return EnableSplitLTOUnit;
560bool requiresSplit(
Module &M) {
561 for (
auto &GO : M.global_objects()) {
562 if (GO.hasMetadata(LLVMContext::MD_type))
564 if (mustEmitToMergedModule(&GO))
573 const bool ShouldPreserveUseListOrder) {
574 std::unique_ptr<ModuleSummaryIndex> NewIndex =
nullptr;
577 if (requiresSplit(M)) {
578 if (enableSplitLTOUnit(M)) {
579 splitAndWriteThinLTOBitcode(OS, ThinLinkOS, AARGetter, M,
580 ShouldPreserveUseListOrder);
585 if (!ModuleId.empty()) {
586 promoteTypeIds(M, ModuleId);
596 NewIndex = std::make_unique<ModuleSummaryIndex>(
598 Index = NewIndex.get();
613 if (ThinLinkOS && Index)
625 bool Changed = writeThinLTOBitcode(
631 ShouldPreserveUseListOrder);
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...
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.
This is the interface to build a ModuleSummaryIndex for a module.
FunctionAnalysisManager FAM
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.
This is an important base class in LLVM.
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)
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Implements a dense probed hash-table based set.
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)
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
void copyAttributesFrom(const Function *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a Function) from the ...
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...
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
LLVM_ABI const Comdat * getComdat() const
LLVM_ABI const GlobalObject * getAliaseeObject() const
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing module and deletes it.
@ HiddenVisibility
The GV is hidden.
void setVisibility(VisibilityTypes V)
LLVM_ABI void reassignGUID()
Recompute and assign a GUID to this value, replacing the existing GUID.
@ ExternalLinkage
Externally visible function.
@ AvailableExternallyLinkage
Available for inspection, not emission.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
This class implements a map that also provides access to all stored values in a deterministic order.
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.
@ Error
Emits an error if two values disagree, otherwise the resulting value is that of the operands.
void appendModuleInlineAsm(GlobalAsmFragment Fragment)
Append to the module-scope inline assembly blocks.
iterator_range< global_object_iterator > global_objects()
GlobalValue * getNamedValue(StringRef Name) const
Return the global value in the module with the specified name, of arbitrary type.
Comdat * getOrInsertComdat(StringRef Name)
Return the Comdat in the module with the specified name.
iterator_range< global_value_iterator > global_values()
LLVM_ABI void addOperand(MDNode *M)
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Analysis providing profile information.
A vector that has set insertion semantics.
size_type count(const_arg_type key) const
Count the number of elements of a given key in the SetVector.
bool insert(const value_type &X)
Insert a new element into the SetVector.
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.
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
iterator_range< use_iterator > uses()
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
std::pair< iterator, bool > insert(const ValueT &V)
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
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.
@ C
The default llvm calling convention, compatible with C.
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.
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.
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.
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...
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)
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...
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.
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.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
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 ...