mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-19 14:23:13 +01:00
Merge pull request #494 from ldc-developers/unnamed-addr
unnamed_addr for immutable array literals
This commit is contained in:
@@ -473,6 +473,7 @@ void initializeArrayLiteral(IRState* p, ArrayLiteralExp* ale, LLValue* dstMem)
|
||||
constarr,
|
||||
".arrayliteral"
|
||||
);
|
||||
gvar->setUnnamedAddr(true);
|
||||
DtoMemCpy(dstMem, gvar, DtoConstSize_t(getTypePaddedSize(constarr->getType())));
|
||||
}
|
||||
}
|
||||
|
||||
17
gen/toir.cpp
17
gen/toir.cpp
@@ -2945,21 +2945,20 @@ LLConstant* ArrayLiteralExp::toConstElem(IRState* p)
|
||||
if (!dyn)
|
||||
return initval;
|
||||
|
||||
// we need to put the initializer in a global, and so we have a pointer to the array
|
||||
// Important: don't make the global constant, since this const initializer might
|
||||
// be used as an initializer for a static T[] - where modifying contents is allowed.
|
||||
LLConstant* globalstore = new LLGlobalVariable(*gIR->module,
|
||||
initval->getType(), false, LLGlobalValue::InternalLinkage, initval,
|
||||
bool canBeConst = type->isConst() || type->isImmutable();
|
||||
llvm::GlobalVariable* gvar = new llvm::GlobalVariable(*gIR->module,
|
||||
initval->getType(), canBeConst, llvm::GlobalValue::InternalLinkage, initval,
|
||||
".dynarrayStorage");
|
||||
globalstore = DtoBitCast(globalstore, getPtrToType(arrtype));
|
||||
gvar->setUnnamedAddr(canBeConst);
|
||||
llvm::Constant* store = DtoBitCast(gvar, getPtrToType(arrtype));
|
||||
|
||||
if (bt->ty == Tpointer)
|
||||
// we need to return pointer to the static array.
|
||||
return globalstore;
|
||||
return store;
|
||||
|
||||
// build a constant dynamic array reference with the .ptr field pointing into globalstore
|
||||
// build a constant dynamic array reference with the .ptr field pointing into store
|
||||
LLConstant* idxs[2] = { DtoConstUint(0), DtoConstUint(0) };
|
||||
LLConstant* globalstorePtr = llvm::ConstantExpr::getGetElementPtr(globalstore, idxs, true);
|
||||
LLConstant* globalstorePtr = llvm::ConstantExpr::getGetElementPtr(store, idxs, true);
|
||||
|
||||
return DtoConstSlice(DtoConstSize_t(elements->dim), globalstorePtr);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user