-static void getArrayElements(const Constant *C,
- SmallVectorImpl<Constant *> &Dest) {
- unsigned NumElements = cast<ArrayType>(C->getType())->getNumElements();
-
- for (unsigned i = 0; i != NumElements; ++i)
- Dest.push_back(C->getAggregateElement(i));
-}
-
-void ModuleLinker::linkAppendingVarInit(AppendingVarInfo &AVI) {
- // Merge the initializer.
- SmallVector<Constant *, 16> DstElements;
- if (AVI.DstInit)
- getArrayElements(AVI.DstInit, DstElements);
-
- SmallVector<Constant *, 16> SrcElements;
- getArrayElements(AVI.SrcInit, SrcElements);
-
- ArrayType *NewType = cast<ArrayType>(AVI.NewGV->getType()->getElementType());
-
- StringRef Name = AVI.NewGV->getName();
- bool IsNewStructor =
- (Name == "llvm.global_ctors" || Name == "llvm.global_dtors") &&
- cast<StructType>(NewType->getElementType())->getNumElements() == 3;
-
- for (auto *V : SrcElements) {
- if (IsNewStructor) {
- auto *Key =
- dyn_cast<GlobalValue>(V->getAggregateElement(2)->stripPointerCasts());
- if (DoNotLinkFromSource.count(Key))
- continue;
- }
- DstElements.push_back(
- MapValue(V, ValueMap, RF_MoveDistinctMDs, &TypeMap, &ValMaterializer));
- }
- if (DstElements.size() != NewType->getNumElements()) {
- NewType = ArrayType::get(NewType->getElementType(), DstElements.size());
- GlobalVariable *Old = AVI.NewGV;
- GlobalVariable *NG = new GlobalVariable(
- *DstM, NewType, Old->isConstant(), Old->getLinkage(), /*init*/ nullptr,
- /*name*/ "", Old, Old->getThreadLocalMode(),
- Old->getType()->getAddressSpace());
- copyGVAttributes(NG, Old);
- AVI.NewGV->replaceAllUsesWith(
- ConstantExpr::getBitCast(NG, AVI.NewGV->getType()));
- AVI.NewGV->eraseFromParent();
- AVI.NewGV = NG;
- }
-
- AVI.NewGV->setInitializer(ConstantArray::get(NewType, DstElements));
-}
-