+
+ if (LinkFromSrc) {
+ if (isa<GlobalAlias>(DGV))
+ return Error(Err, "Global-Alias Collision on '" + SGV->getName() +
+ "': symbol multiple defined");
+
+ // If the types don't match, and if we are to link from the source, nuke
+ // DGV and create a new one of the appropriate type. Note that the thing
+ // we are replacing may be a function (if a prototype, weak, etc) or a
+ // global variable.
+ GlobalVariable *NewDGV =
+ new GlobalVariable(SGV->getType()->getElementType(), SGV->isConstant(),
+ NewLinkage, /*init*/0, DGV->getName(), Dest, false,
+ SGV->getType()->getAddressSpace());
+
+ // Propagate alignment, section, and visibility info.
+ CopyGVAttributes(NewDGV, SGV);
+ DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewDGV, DGV->getType()));
+
+ // DGV will conflict with NewDGV because they both had the same
+ // name. We must erase this now so ForceRenaming doesn't assert
+ // because DGV might not have internal linkage.
+ if (GlobalVariable *Var = dyn_cast<GlobalVariable>(DGV))
+ Var->eraseFromParent();
+ else
+ cast<Function>(DGV)->eraseFromParent();
+ DGV = NewDGV;
+
+ // If the symbol table renamed the global, but it is an externally visible
+ // symbol, DGV must be an existing global with internal linkage. Rename.
+ if (NewDGV->getName() != SGV->getName() && !NewDGV->hasLocalLinkage())
+ ForceRenaming(NewDGV, SGV->getName());
+
+ // Inherit const as appropriate.
+ NewDGV->setConstant(SGV->isConstant());
+
+ // Make sure to remember this mapping.
+ ValueMap[SGV] = NewDGV;
+ continue;
+ }
+
+ // Not "link from source", keep the one in the DestModule and remap the
+ // input onto it.
+
+ // Special case for const propagation.
+ if (GlobalVariable *DGVar = dyn_cast<GlobalVariable>(DGV))
+ if (DGVar->isDeclaration() && SGV->isConstant() && !DGVar->isConstant())
+ DGVar->setConstant(true);
+
+ // SGV is global, but DGV is alias.
+ if (isa<GlobalAlias>(DGV)) {
+ // The only valid mappings are:
+ // - SGV is external declaration, which is effectively a no-op.
+ // - SGV is weak, when we just need to throw SGV out.
+ if (!SGV->isDeclaration() && !SGV->mayBeOverridden())
+ return Error(Err, "Global-Alias Collision on '" + SGV->getName() +
+ "': symbol multiple defined");
+ }
+
+ // Set calculated linkage
+ DGV->setLinkage(NewLinkage);
+
+ // Make sure to remember this mapping...
+ ValueMap[SGV] = ConstantExpr::getBitCast(DGV, SGV->getType());