1 //===- lib/Linker/LinkModules.cpp - Module Linker Implementation ----------===// 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 // 10 // This file implements the LLVM module linker. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "LinkDiagnosticInfo.h" 15 #include "llvm-c/Linker.h" 16 #include "llvm/ADT/SetVector.h" 17 #include "llvm/ADT/StringSet.h" 18 #include "llvm/IR/DiagnosticPrinter.h" 19 #include "llvm/IR/LLVMContext.h" 20 #include "llvm/Linker/Linker.h" 21 #include "llvm/Support/Error.h" 22 #include "llvm/Transforms/Utils/FunctionImportUtils.h" 23 using namespace llvm; 24 25 namespace { 26 27 /// This is an implementation class for the LinkModules function, which is the 28 /// entrypoint for this file. 29 class ModuleLinker { 30 IRMover &Mover; 31 std::unique_ptr<Module> SrcM; 32 33 SetVector<GlobalValue *> ValuesToLink; 34 StringSet<> Internalize; 35 36 /// For symbol clashes, prefer those from Src. 37 unsigned Flags; 38 39 /// Functions to import from source module, all other functions are 40 /// imported as declarations instead of definitions. 41 DenseSet<const GlobalValue *> *GlobalsToImport; 42 43 /// Used as the callback for lazy linking. 44 /// The mover has just hit GV and we have to decide if it, and other members 45 /// of the same comdat, should be linked. Every member to be linked is passed 46 /// to Add. 47 void addLazyFor(GlobalValue &GV, IRMover::ValueAdder Add); 48 49 bool shouldLinkReferencedLinkOnce() { 50 return !(Flags & Linker::DontForceLinkLinkonceODR); 51 } 52 bool shouldOverrideFromSrc() { return Flags & Linker::OverrideFromSrc; } 53 bool shouldLinkOnlyNeeded() { return Flags & Linker::LinkOnlyNeeded; } 54 bool shouldInternalizeLinkedSymbols() { 55 return Flags & Linker::InternalizeLinkedSymbols; 56 } 57 58 bool shouldLinkFromSource(bool &LinkFromSrc, const GlobalValue &Dest, 59 const GlobalValue &Src); 60 61 /// Should we have mover and linker error diag info? 62 bool emitError(const Twine &Message) { 63 SrcM->getContext().diagnose(LinkDiagnosticInfo(DS_Error, Message)); 64 return true; 65 } 66 67 bool getComdatLeader(Module &M, StringRef ComdatName, 68 const GlobalVariable *&GVar); 69 bool computeResultingSelectionKind(StringRef ComdatName, 70 Comdat::SelectionKind Src, 71 Comdat::SelectionKind Dst, 72 Comdat::SelectionKind &Result, 73 bool &LinkFromSrc); 74 std::map<const Comdat *, std::pair<Comdat::SelectionKind, bool>> 75 ComdatsChosen; 76 bool getComdatResult(const Comdat *SrcC, Comdat::SelectionKind &SK, 77 bool &LinkFromSrc); 78 // Keep track of the lazy linked global members of each comdat in source. 79 DenseMap<const Comdat *, std::vector<GlobalValue *>> LazyComdatMembers; 80 81 /// Given a global in the source module, return the global in the 82 /// destination module that is being linked to, if any. 83 GlobalValue *getLinkedToGlobal(const GlobalValue *SrcGV) { 84 Module &DstM = Mover.getModule(); 85 // If the source has no name it can't link. If it has local linkage, 86 // there is no name match-up going on. 87 if (!SrcGV->hasName() || GlobalValue::isLocalLinkage(SrcGV->getLinkage())) 88 return nullptr; 89 90 // Otherwise see if we have a match in the destination module's symtab. 91 GlobalValue *DGV = DstM.getNamedValue(SrcGV->getName()); 92 if (!DGV) 93 return nullptr; 94 95 // If we found a global with the same name in the dest module, but it has 96 // internal linkage, we are really not doing any linkage here. 97 if (DGV->hasLocalLinkage()) 98 return nullptr; 99 100 // Otherwise, we do in fact link to the destination global. 101 return DGV; 102 } 103 104 /// Drop GV if it is a member of a comdat that we are dropping. 105 /// This can happen with COFF's largest selection kind. 106 void dropReplacedComdat(GlobalValue &GV, 107 const DenseSet<const Comdat *> &ReplacedDstComdats); 108 109 bool linkIfNeeded(GlobalValue &GV); 110 111 /// Helper method to check if we are importing from the current source 112 /// module. 113 bool isPerformingImport() const { return GlobalsToImport != nullptr; } 114 115 /// If we are importing from the source module, checks if we should 116 /// import SGV as a definition, otherwise import as a declaration. 117 bool doImportAsDefinition(const GlobalValue *SGV); 118 119 public: 120 ModuleLinker(IRMover &Mover, std::unique_ptr<Module> SrcM, unsigned Flags, 121 DenseSet<const GlobalValue *> *GlobalsToImport = nullptr) 122 : Mover(Mover), SrcM(std::move(SrcM)), Flags(Flags), 123 GlobalsToImport(GlobalsToImport) {} 124 125 bool run(); 126 }; 127 } 128 129 bool ModuleLinker::doImportAsDefinition(const GlobalValue *SGV) { 130 if (!isPerformingImport()) 131 return false; 132 return FunctionImportGlobalProcessing::doImportAsDefinition(SGV, 133 GlobalsToImport); 134 } 135 136 static GlobalValue::VisibilityTypes 137 getMinVisibility(GlobalValue::VisibilityTypes A, 138 GlobalValue::VisibilityTypes B) { 139 if (A == GlobalValue::HiddenVisibility || B == GlobalValue::HiddenVisibility) 140 return GlobalValue::HiddenVisibility; 141 if (A == GlobalValue::ProtectedVisibility || 142 B == GlobalValue::ProtectedVisibility) 143 return GlobalValue::ProtectedVisibility; 144 return GlobalValue::DefaultVisibility; 145 } 146 147 bool ModuleLinker::getComdatLeader(Module &M, StringRef ComdatName, 148 const GlobalVariable *&GVar) { 149 const GlobalValue *GVal = M.getNamedValue(ComdatName); 150 if (const auto *GA = dyn_cast_or_null<GlobalAlias>(GVal)) { 151 GVal = GA->getBaseObject(); 152 if (!GVal) 153 // We cannot resolve the size of the aliasee yet. 154 return emitError("Linking COMDATs named '" + ComdatName + 155 "': COMDAT key involves incomputable alias size."); 156 } 157 158 GVar = dyn_cast_or_null<GlobalVariable>(GVal); 159 if (!GVar) 160 return emitError( 161 "Linking COMDATs named '" + ComdatName + 162 "': GlobalVariable required for data dependent selection!"); 163 164 return false; 165 } 166 167 bool ModuleLinker::computeResultingSelectionKind(StringRef ComdatName, 168 Comdat::SelectionKind Src, 169 Comdat::SelectionKind Dst, 170 Comdat::SelectionKind &Result, 171 bool &LinkFromSrc) { 172 Module &DstM = Mover.getModule(); 173 // The ability to mix Comdat::SelectionKind::Any with 174 // Comdat::SelectionKind::Largest is a behavior that comes from COFF. 175 bool DstAnyOrLargest = Dst == Comdat::SelectionKind::Any || 176 Dst == Comdat::SelectionKind::Largest; 177 bool SrcAnyOrLargest = Src == Comdat::SelectionKind::Any || 178 Src == Comdat::SelectionKind::Largest; 179 if (DstAnyOrLargest && SrcAnyOrLargest) { 180 if (Dst == Comdat::SelectionKind::Largest || 181 Src == Comdat::SelectionKind::Largest) 182 Result = Comdat::SelectionKind::Largest; 183 else 184 Result = Comdat::SelectionKind::Any; 185 } else if (Src == Dst) { 186 Result = Dst; 187 } else { 188 return emitError("Linking COMDATs named '" + ComdatName + 189 "': invalid selection kinds!"); 190 } 191 192 switch (Result) { 193 case Comdat::SelectionKind::Any: 194 // Go with Dst. 195 LinkFromSrc = false; 196 break; 197 case Comdat::SelectionKind::NoDuplicates: 198 return emitError("Linking COMDATs named '" + ComdatName + 199 "': noduplicates has been violated!"); 200 case Comdat::SelectionKind::ExactMatch: 201 case Comdat::SelectionKind::Largest: 202 case Comdat::SelectionKind::SameSize: { 203 const GlobalVariable *DstGV; 204 const GlobalVariable *SrcGV; 205 if (getComdatLeader(DstM, ComdatName, DstGV) || 206 getComdatLeader(*SrcM, ComdatName, SrcGV)) 207 return true; 208 209 const DataLayout &DstDL = DstM.getDataLayout(); 210 const DataLayout &SrcDL = SrcM->getDataLayout(); 211 uint64_t DstSize = DstDL.getTypeAllocSize(DstGV->getValueType()); 212 uint64_t SrcSize = SrcDL.getTypeAllocSize(SrcGV->getValueType()); 213 if (Result == Comdat::SelectionKind::ExactMatch) { 214 if (SrcGV->getInitializer() != DstGV->getInitializer()) 215 return emitError("Linking COMDATs named '" + ComdatName + 216 "': ExactMatch violated!"); 217 LinkFromSrc = false; 218 } else if (Result == Comdat::SelectionKind::Largest) { 219 LinkFromSrc = SrcSize > DstSize; 220 } else if (Result == Comdat::SelectionKind::SameSize) { 221 if (SrcSize != DstSize) 222 return emitError("Linking COMDATs named '" + ComdatName + 223 "': SameSize violated!"); 224 LinkFromSrc = false; 225 } else { 226 llvm_unreachable("unknown selection kind"); 227 } 228 break; 229 } 230 } 231 232 return false; 233 } 234 235 bool ModuleLinker::getComdatResult(const Comdat *SrcC, 236 Comdat::SelectionKind &Result, 237 bool &LinkFromSrc) { 238 Module &DstM = Mover.getModule(); 239 Comdat::SelectionKind SSK = SrcC->getSelectionKind(); 240 StringRef ComdatName = SrcC->getName(); 241 Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable(); 242 Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(ComdatName); 243 244 if (DstCI == ComdatSymTab.end()) { 245 // Use the comdat if it is only available in one of the modules. 246 LinkFromSrc = true; 247 Result = SSK; 248 return false; 249 } 250 251 const Comdat *DstC = &DstCI->second; 252 Comdat::SelectionKind DSK = DstC->getSelectionKind(); 253 return computeResultingSelectionKind(ComdatName, SSK, DSK, Result, 254 LinkFromSrc); 255 } 256 257 bool ModuleLinker::shouldLinkFromSource(bool &LinkFromSrc, 258 const GlobalValue &Dest, 259 const GlobalValue &Src) { 260 261 // Should we unconditionally use the Src? 262 if (shouldOverrideFromSrc()) { 263 LinkFromSrc = true; 264 return false; 265 } 266 267 // We always have to add Src if it has appending linkage. 268 if (Src.hasAppendingLinkage()) { 269 // Should have prevented importing for appending linkage in linkIfNeeded. 270 assert(!isPerformingImport()); 271 LinkFromSrc = true; 272 return false; 273 } 274 275 if (isPerformingImport()) { 276 // LinkFromSrc iff this is a global requested for importing. 277 LinkFromSrc = GlobalsToImport->count(&Src); 278 return false; 279 } 280 281 bool SrcIsDeclaration = Src.isDeclarationForLinker(); 282 bool DestIsDeclaration = Dest.isDeclarationForLinker(); 283 284 if (SrcIsDeclaration) { 285 // If Src is external or if both Src & Dest are external.. Just link the 286 // external globals, we aren't adding anything. 287 if (Src.hasDLLImportStorageClass()) { 288 // If one of GVs is marked as DLLImport, result should be dllimport'ed. 289 LinkFromSrc = DestIsDeclaration; 290 return false; 291 } 292 // If the Dest is weak, use the source linkage. 293 if (Dest.hasExternalWeakLinkage()) { 294 LinkFromSrc = true; 295 return false; 296 } 297 // Link an available_externally over a declaration. 298 LinkFromSrc = !Src.isDeclaration() && Dest.isDeclaration(); 299 return false; 300 } 301 302 if (DestIsDeclaration) { 303 // If Dest is external but Src is not: 304 LinkFromSrc = true; 305 return false; 306 } 307 308 if (Src.hasCommonLinkage()) { 309 if (Dest.hasLinkOnceLinkage() || Dest.hasWeakLinkage()) { 310 LinkFromSrc = true; 311 return false; 312 } 313 314 if (!Dest.hasCommonLinkage()) { 315 LinkFromSrc = false; 316 return false; 317 } 318 319 const DataLayout &DL = Dest.getParent()->getDataLayout(); 320 uint64_t DestSize = DL.getTypeAllocSize(Dest.getValueType()); 321 uint64_t SrcSize = DL.getTypeAllocSize(Src.getValueType()); 322 LinkFromSrc = SrcSize > DestSize; 323 return false; 324 } 325 326 if (Src.isWeakForLinker()) { 327 assert(!Dest.hasExternalWeakLinkage()); 328 assert(!Dest.hasAvailableExternallyLinkage()); 329 330 if (Dest.hasLinkOnceLinkage() && Src.hasWeakLinkage()) { 331 LinkFromSrc = true; 332 return false; 333 } 334 335 LinkFromSrc = false; 336 return false; 337 } 338 339 if (Dest.isWeakForLinker()) { 340 assert(Src.hasExternalLinkage()); 341 LinkFromSrc = true; 342 return false; 343 } 344 345 assert(!Src.hasExternalWeakLinkage()); 346 assert(!Dest.hasExternalWeakLinkage()); 347 assert(Dest.hasExternalLinkage() && Src.hasExternalLinkage() && 348 "Unexpected linkage type!"); 349 return emitError("Linking globals named '" + Src.getName() + 350 "': symbol multiply defined!"); 351 } 352 353 bool ModuleLinker::linkIfNeeded(GlobalValue &GV) { 354 GlobalValue *DGV = getLinkedToGlobal(&GV); 355 356 if (shouldLinkOnlyNeeded() && !(DGV && DGV->isDeclaration())) 357 return false; 358 359 if (DGV && !GV.hasLocalLinkage() && !GV.hasAppendingLinkage()) { 360 auto *DGVar = dyn_cast<GlobalVariable>(DGV); 361 auto *SGVar = dyn_cast<GlobalVariable>(&GV); 362 if (DGVar && SGVar) { 363 if (DGVar->isDeclaration() && SGVar->isDeclaration() && 364 (!DGVar->isConstant() || !SGVar->isConstant())) { 365 DGVar->setConstant(false); 366 SGVar->setConstant(false); 367 } 368 if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) { 369 unsigned Align = std::max(DGVar->getAlignment(), SGVar->getAlignment()); 370 SGVar->setAlignment(Align); 371 DGVar->setAlignment(Align); 372 } 373 } 374 375 GlobalValue::VisibilityTypes Visibility = 376 getMinVisibility(DGV->getVisibility(), GV.getVisibility()); 377 DGV->setVisibility(Visibility); 378 GV.setVisibility(Visibility); 379 380 bool HasUnnamedAddr = GV.hasUnnamedAddr() && DGV->hasUnnamedAddr(); 381 DGV->setUnnamedAddr(HasUnnamedAddr); 382 GV.setUnnamedAddr(HasUnnamedAddr); 383 } 384 385 // Don't want to append to global_ctors list, for example, when we 386 // are importing for ThinLTO, otherwise the global ctors and dtors 387 // get executed multiple times for local variables (the latter causing 388 // double frees). 389 if (GV.hasAppendingLinkage() && isPerformingImport()) 390 return false; 391 392 if (isPerformingImport()) { 393 if (!doImportAsDefinition(&GV)) 394 return false; 395 } else if (!DGV && !shouldOverrideFromSrc() && 396 (GV.hasLocalLinkage() || GV.hasLinkOnceLinkage() || 397 GV.hasAvailableExternallyLinkage())) 398 return false; 399 400 if (GV.isDeclaration()) 401 return false; 402 403 if (const Comdat *SC = GV.getComdat()) { 404 bool LinkFromSrc; 405 Comdat::SelectionKind SK; 406 std::tie(SK, LinkFromSrc) = ComdatsChosen[SC]; 407 if (!LinkFromSrc) 408 return false; 409 } 410 411 bool LinkFromSrc = true; 412 if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, GV)) 413 return true; 414 if (LinkFromSrc) 415 ValuesToLink.insert(&GV); 416 return false; 417 } 418 419 void ModuleLinker::addLazyFor(GlobalValue &GV, IRMover::ValueAdder Add) { 420 if (!shouldLinkReferencedLinkOnce()) 421 // For ThinLTO we don't import more than what was required. 422 // The client has to guarantee that the linkonce will be availabe at link 423 // time (by promoting it to weak for instance). 424 return; 425 426 // Add these to the internalize list 427 if (!GV.hasLinkOnceLinkage() && !shouldLinkOnlyNeeded()) 428 return; 429 430 if (shouldInternalizeLinkedSymbols()) 431 Internalize.insert(GV.getName()); 432 Add(GV); 433 434 const Comdat *SC = GV.getComdat(); 435 if (!SC) 436 return; 437 for (GlobalValue *GV2 : LazyComdatMembers[SC]) { 438 GlobalValue *DGV = getLinkedToGlobal(GV2); 439 bool LinkFromSrc = true; 440 if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2)) 441 return; 442 if (!LinkFromSrc) 443 continue; 444 if (shouldInternalizeLinkedSymbols()) 445 Internalize.insert(GV2->getName()); 446 Add(*GV2); 447 } 448 } 449 450 void ModuleLinker::dropReplacedComdat( 451 GlobalValue &GV, const DenseSet<const Comdat *> &ReplacedDstComdats) { 452 Comdat *C = GV.getComdat(); 453 if (!C) 454 return; 455 if (!ReplacedDstComdats.count(C)) 456 return; 457 if (GV.use_empty()) { 458 GV.eraseFromParent(); 459 return; 460 } 461 462 if (auto *F = dyn_cast<Function>(&GV)) { 463 F->deleteBody(); 464 } else if (auto *Var = dyn_cast<GlobalVariable>(&GV)) { 465 Var->setInitializer(nullptr); 466 } else { 467 auto &Alias = cast<GlobalAlias>(GV); 468 Module &M = *Alias.getParent(); 469 PointerType &Ty = *cast<PointerType>(Alias.getType()); 470 GlobalValue *Declaration; 471 if (auto *FTy = dyn_cast<FunctionType>(Alias.getValueType())) { 472 Declaration = Function::Create(FTy, GlobalValue::ExternalLinkage, "", &M); 473 } else { 474 Declaration = 475 new GlobalVariable(M, Ty.getElementType(), /*isConstant*/ false, 476 GlobalValue::ExternalLinkage, 477 /*Initializer*/ nullptr); 478 } 479 Declaration->takeName(&Alias); 480 Alias.replaceAllUsesWith(Declaration); 481 Alias.eraseFromParent(); 482 } 483 } 484 485 bool ModuleLinker::run() { 486 Module &DstM = Mover.getModule(); 487 DenseSet<const Comdat *> ReplacedDstComdats; 488 489 for (const auto &SMEC : SrcM->getComdatSymbolTable()) { 490 const Comdat &C = SMEC.getValue(); 491 if (ComdatsChosen.count(&C)) 492 continue; 493 Comdat::SelectionKind SK; 494 bool LinkFromSrc; 495 if (getComdatResult(&C, SK, LinkFromSrc)) 496 return true; 497 ComdatsChosen[&C] = std::make_pair(SK, LinkFromSrc); 498 499 if (!LinkFromSrc) 500 continue; 501 502 Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable(); 503 Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(C.getName()); 504 if (DstCI == ComdatSymTab.end()) 505 continue; 506 507 // The source comdat is replacing the dest one. 508 const Comdat *DstC = &DstCI->second; 509 ReplacedDstComdats.insert(DstC); 510 } 511 512 // Alias have to go first, since we are not able to find their comdats 513 // otherwise. 514 for (auto I = DstM.alias_begin(), E = DstM.alias_end(); I != E;) { 515 GlobalAlias &GV = *I++; 516 dropReplacedComdat(GV, ReplacedDstComdats); 517 } 518 519 for (auto I = DstM.global_begin(), E = DstM.global_end(); I != E;) { 520 GlobalVariable &GV = *I++; 521 dropReplacedComdat(GV, ReplacedDstComdats); 522 } 523 524 for (auto I = DstM.begin(), E = DstM.end(); I != E;) { 525 Function &GV = *I++; 526 dropReplacedComdat(GV, ReplacedDstComdats); 527 } 528 529 for (GlobalVariable &GV : SrcM->globals()) 530 if (GV.hasLinkOnceLinkage()) 531 if (const Comdat *SC = GV.getComdat()) 532 LazyComdatMembers[SC].push_back(&GV); 533 534 for (Function &SF : *SrcM) 535 if (SF.hasLinkOnceLinkage()) 536 if (const Comdat *SC = SF.getComdat()) 537 LazyComdatMembers[SC].push_back(&SF); 538 539 for (GlobalAlias &GA : SrcM->aliases()) 540 if (GA.hasLinkOnceLinkage()) 541 if (const Comdat *SC = GA.getComdat()) 542 LazyComdatMembers[SC].push_back(&GA); 543 544 // Insert all of the globals in src into the DstM module... without linking 545 // initializers (which could refer to functions not yet mapped over). 546 for (GlobalVariable &GV : SrcM->globals()) 547 if (linkIfNeeded(GV)) 548 return true; 549 550 for (Function &SF : *SrcM) 551 if (linkIfNeeded(SF)) 552 return true; 553 554 for (GlobalAlias &GA : SrcM->aliases()) 555 if (linkIfNeeded(GA)) 556 return true; 557 558 for (unsigned I = 0; I < ValuesToLink.size(); ++I) { 559 GlobalValue *GV = ValuesToLink[I]; 560 const Comdat *SC = GV->getComdat(); 561 if (!SC) 562 continue; 563 for (GlobalValue *GV2 : LazyComdatMembers[SC]) { 564 GlobalValue *DGV = getLinkedToGlobal(GV2); 565 bool LinkFromSrc = true; 566 if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2)) 567 return true; 568 if (LinkFromSrc) 569 ValuesToLink.insert(GV2); 570 } 571 } 572 573 if (shouldInternalizeLinkedSymbols()) { 574 for (GlobalValue *GV : ValuesToLink) 575 Internalize.insert(GV->getName()); 576 } 577 578 // FIXME: Propagate Errors through to the caller instead of emitting 579 // diagnostics. 580 bool HasErrors = false; 581 if (Error E = Mover.move(std::move(SrcM), ValuesToLink.getArrayRef(), 582 [this](GlobalValue &GV, IRMover::ValueAdder Add) { 583 addLazyFor(GV, Add); 584 })) { 585 handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) { 586 DstM.getContext().diagnose(LinkDiagnosticInfo(DS_Error, EIB.message())); 587 HasErrors = true; 588 }); 589 } 590 if (HasErrors) 591 return true; 592 593 for (auto &P : Internalize) { 594 GlobalValue *GV = DstM.getNamedValue(P.first()); 595 GV->setLinkage(GlobalValue::InternalLinkage); 596 } 597 598 return false; 599 } 600 601 Linker::Linker(Module &M) : Mover(M) {} 602 603 bool Linker::linkInModule(std::unique_ptr<Module> Src, unsigned Flags, 604 DenseSet<const GlobalValue *> *GlobalsToImport) { 605 ModuleLinker ModLinker(Mover, std::move(Src), Flags, GlobalsToImport); 606 return ModLinker.run(); 607 } 608 609 //===----------------------------------------------------------------------===// 610 // LinkModules entrypoint. 611 //===----------------------------------------------------------------------===// 612 613 /// This function links two modules together, with the resulting Dest module 614 /// modified to be the composite of the two input modules. If an error occurs, 615 /// true is returned and ErrorMsg (if not null) is set to indicate the problem. 616 /// Upon failure, the Dest module could be in a modified state, and shouldn't be 617 /// relied on to be consistent. 618 bool Linker::linkModules(Module &Dest, std::unique_ptr<Module> Src, 619 unsigned Flags) { 620 Linker L(Dest); 621 return L.linkInModule(std::move(Src), Flags); 622 } 623 624 //===----------------------------------------------------------------------===// 625 // C API. 626 //===----------------------------------------------------------------------===// 627 628 LLVMBool LLVMLinkModules2(LLVMModuleRef Dest, LLVMModuleRef Src) { 629 Module *D = unwrap(Dest); 630 std::unique_ptr<Module> M(unwrap(Src)); 631 return Linker::linkModules(*D, std::move(M)); 632 } 633