diff options
author | Chris Lattner <sabre@nondot.org> | 2012-01-24 13:41:11 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2012-01-24 13:41:11 +0000 |
commit | 1ee0ecf84a07693c3a517ba030fac8ac1f9f3fbc (patch) | |
tree | ce6fb6a15a49539b812ba49d0aec84154fbe1aae /lib/Linker | |
parent | 53fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401 (diff) | |
download | external_llvm-1ee0ecf84a07693c3a517ba030fac8ac1f9f3fbc.zip external_llvm-1ee0ecf84a07693c3a517ba030fac8ac1f9f3fbc.tar.gz external_llvm-1ee0ecf84a07693c3a517ba030fac8ac1f9f3fbc.tar.bz2 |
add more support for ConstantDataSequential
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148802 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Linker')
-rw-r--r-- | lib/Linker/LinkModules.cpp | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 46a76a2..563aed5 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -843,29 +843,32 @@ bool ModuleLinker::linkAliasProto(GlobalAlias *SGA) { return false; } +static void getArrayElements(Constant *C, SmallVectorImpl<Constant*> &Dest) { + if (ConstantArray *I = dyn_cast<ConstantArray>(C)) { + for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) + Dest.push_back(I->getOperand(i)); + return; + } + + if (ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(C)) { + for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) + Dest.push_back(CDS->getElementAsConstant(i)); + return; + } + + ConstantAggregateZero *CAZ = cast<ConstantAggregateZero>(C); + Dest.append(cast<ArrayType>(C->getType())->getNumElements(), + CAZ->getSequentialElement()); +} + void ModuleLinker::linkAppendingVarInit(const AppendingVarInfo &AVI) { // Merge the initializer. SmallVector<Constant*, 16> Elements; - if (ConstantArray *I = dyn_cast<ConstantArray>(AVI.DstInit)) { - for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) - Elements.push_back(I->getOperand(i)); - } else { - assert(isa<ConstantAggregateZero>(AVI.DstInit)); - ArrayType *DstAT = cast<ArrayType>(AVI.DstInit->getType()); - Type *EltTy = DstAT->getElementType(); - Elements.append(DstAT->getNumElements(), Constant::getNullValue(EltTy)); - } + getArrayElements(AVI.DstInit, Elements); Constant *SrcInit = MapValue(AVI.SrcInit, ValueMap, RF_None, &TypeMap); - if (const ConstantArray *I = dyn_cast<ConstantArray>(SrcInit)) { - for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) - Elements.push_back(I->getOperand(i)); - } else { - assert(isa<ConstantAggregateZero>(SrcInit)); - ArrayType *SrcAT = cast<ArrayType>(SrcInit->getType()); - Type *EltTy = SrcAT->getElementType(); - Elements.append(SrcAT->getNumElements(), Constant::getNullValue(EltTy)); - } + getArrayElements(SrcInit, Elements); + ArrayType *NewType = cast<ArrayType>(AVI.NewGV->getType()->getElementType()); AVI.NewGV->setInitializer(ConstantArray::get(NewType, Elements)); } |