bool Linker::linkInMetadata(Module &Src, DenseMap<unsigned, MDNode *> *ValIDToTempMDMap) { SetVector<GlobalValue *> ValuesToLink; if (Mover.move( Src, ValuesToLink.getArrayRef(), [this](GlobalValue &GV, IRMover::ValueAdder Add) { assert(false); }, ValIDToTempMDMap, true)) return true; return false; }
// If a linkonce global is present in the MustPreserveSymbols, we need to make // sure we honor this. To force the compiler to not drop it, we add it to the // "llvm.compiler.used" global. void LTOCodeGenerator::preserveDiscardableGVs( Module &TheModule, llvm::function_ref<bool(const GlobalValue &)> mustPreserveGV) { SetVector<Constant *> UsedValuesSet; if (GlobalVariable *LLVMUsed = TheModule.getGlobalVariable("llvm.compiler.used")) { ConstantArray *Inits = cast<ConstantArray>(LLVMUsed->getInitializer()); for (auto &V : Inits->operands()) UsedValuesSet.insert(cast<Constant>(&V)); LLVMUsed->eraseFromParent(); } llvm::Type *i8PTy = llvm::Type::getInt8PtrTy(TheModule.getContext()); auto mayPreserveGlobal = [&](GlobalValue &GV) { if (!GV.isDiscardableIfUnused() || GV.isDeclaration()) return; if (!mustPreserveGV(GV)) return; if (GV.hasAvailableExternallyLinkage()) { emitWarning( (Twine("Linker asked to preserve available_externally global: '") + GV.getName() + "'").str()); return; } if (GV.hasInternalLinkage()) { emitWarning((Twine("Linker asked to preserve internal global: '") + GV.getName() + "'").str()); return; } UsedValuesSet.insert(ConstantExpr::getBitCast(&GV, i8PTy)); }; for (auto &GV : TheModule) mayPreserveGlobal(GV); for (auto &GV : TheModule.globals()) mayPreserveGlobal(GV); for (auto &GV : TheModule.aliases()) mayPreserveGlobal(GV); if (UsedValuesSet.empty()) return; llvm::ArrayType *ATy = llvm::ArrayType::get(i8PTy, UsedValuesSet.size()); auto *LLVMUsed = new llvm::GlobalVariable( TheModule, ATy, false, llvm::GlobalValue::AppendingLinkage, llvm::ConstantArray::get(ATy, UsedValuesSet.getArrayRef()), "llvm.compiler.used"); LLVMUsed->setSection("llvm.metadata"); }