mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-17 13:23:14 +01:00
Automated merge with http://hg.dsource.org/projects/llvmdc
This commit is contained in:
10
gen/aa.cpp
10
gen/aa.cpp
@@ -66,17 +66,19 @@ static LLValue* to_keyti(DValue* key)
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DValue* DtoAAIndex(Loc& loc, Type* type, DValue* aa, DValue* key)
|
||||
DValue* DtoAAIndex(Loc& loc, Type* type, DValue* aa, DValue* key, bool lvalue)
|
||||
{
|
||||
// call:
|
||||
// extern(C) void* _aaGet(AA* aa, TypeInfo keyti, void* pkey, size_t valuesize)
|
||||
// extern(C) void* _aaGet(AA* aa, TypeInfo keyti, size_t valuesize, void* pkey)
|
||||
// or
|
||||
// extern(C) void* _aaGetRvalue(AA aa, TypeInfo keyti, size_t valuesize, void* pkey)
|
||||
|
||||
// first get the runtime function
|
||||
llvm::Function* func = LLVM_D_GetRuntimeFunction(gIR->module, "_aaGet");
|
||||
llvm::Function* func = LLVM_D_GetRuntimeFunction(gIR->module, lvalue?"_aaGet":"_aaGetRvalue");
|
||||
const llvm::FunctionType* funcTy = func->getFunctionType();
|
||||
|
||||
// aa param
|
||||
LLValue* aaval = aa->getLVal();
|
||||
LLValue* aaval = lvalue ? aa->getLVal() : aa->getRVal();
|
||||
aaval = DtoBitCast(aaval, funcTy->getParamType(0));
|
||||
|
||||
// keyti param
|
||||
|
||||
2
gen/aa.h
2
gen/aa.h
@@ -1,7 +1,7 @@
|
||||
#ifndef LLVMDC_GEN_AA_H
|
||||
#define LLVMDC_GEN_AA_H
|
||||
|
||||
DValue* DtoAAIndex(Loc& loc, Type* type, DValue* aa, DValue* key);
|
||||
DValue* DtoAAIndex(Loc& loc, Type* type, DValue* aa, DValue* key, bool lvalue);
|
||||
DValue* DtoAAIn(Loc& loc, Type* type, DValue* aa, DValue* key);
|
||||
void DtoAARemove(Loc& loc, DValue* aa, DValue* key);
|
||||
|
||||
|
||||
@@ -595,8 +595,10 @@ void DtoDefineFunc(FuncDeclaration* fd)
|
||||
VarDeclaration* vd = argsym->isVarDeclaration();
|
||||
assert(vd);
|
||||
|
||||
bool refoutlazy = vd->storage_class & (STCref | STCout | STClazy);
|
||||
|
||||
// FIXME: llvm seems to want an alloca/byval for debug info
|
||||
if (!vd->needsStorage || vd->nestedref || vd->isRef() || vd->isOut())
|
||||
if (!vd->needsStorage || vd->nestedref || refoutlazy)
|
||||
{
|
||||
Logger::println("skipping arg storage for (%s) %s ", vd->loc.toChars(), vd->toChars());
|
||||
continue;
|
||||
|
||||
@@ -1045,7 +1045,7 @@ DValue* IndexExp::toElem(IRState* p)
|
||||
arrptr = DtoGEP1(arrptr,r->getRVal());
|
||||
}
|
||||
else if (e1type->ty == Taarray) {
|
||||
return DtoAAIndex(loc, type, l, r);
|
||||
return DtoAAIndex(loc, type, l, r, modifiable);
|
||||
}
|
||||
else {
|
||||
Logger::println("invalid index exp! e1type: %s", e1type->toChars());
|
||||
@@ -2266,7 +2266,7 @@ DValue* AssocArrayLiteralExp::toElem(IRState* p)
|
||||
|
||||
// index
|
||||
DValue* key = ekey->toElem(p);
|
||||
DValue* mem = DtoAAIndex(loc, vtype, aa, key);
|
||||
DValue* mem = DtoAAIndex(loc, vtype, aa, key, true);
|
||||
|
||||
// store
|
||||
DValue* val = eval->toElem(p);
|
||||
|
||||
Reference in New Issue
Block a user