summaryrefslogtreecommitdiff
path: root/lib/Linker
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2012-01-24 13:41:11 +0000
committerChris Lattner <sabre@nondot.org>2012-01-24 13:41:11 +0000
commit1ee0ecf84a07693c3a517ba030fac8ac1f9f3fbc (patch)
treece6fb6a15a49539b812ba49d0aec84154fbe1aae /lib/Linker
parent53fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401 (diff)
downloadllvm-1ee0ecf84a07693c3a517ba030fac8ac1f9f3fbc.tar.gz
llvm-1ee0ecf84a07693c3a517ba030fac8ac1f9f3fbc.tar.bz2
llvm-1ee0ecf84a07693c3a517ba030fac8ac1f9f3fbc.tar.xz
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.cpp39
1 files changed, 21 insertions, 18 deletions
diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp
index 46a76a2599..563aed5daa 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));
}