Files
ldc/gen/dvalue.cpp
Tomas Lindquist Olsen daad516579 Removed the 'needsstorage' thing from Dsymbol. Arguments are not always given storage when applicable. This is not longer treat specially
in this regard. Code for accessing nested variables and contexts rewritten. Probably more. Fairly well tested.
2008-08-04 02:59:34 +02:00

91 lines
2.0 KiB
C++

#include "gen/llvm.h"
#include "gen/tollvm.h"
#include "gen/irstate.h"
#include "gen/logger.h"
#include "gen/dvalue.h"
#include "declaration.h"
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
DVarValue::DVarValue(Type* t, VarDeclaration* vd, LLValue* llvmValue, bool lvalue)
{
var = vd;
val = llvmValue;
rval = 0;
lval = lvalue;
type = t;
}
DVarValue::DVarValue(Type* t, LLValue* lv, LLValue* rv)
{
var = 0;
val = lv;
rval = rv;
lval = true;
type = t;
}
DVarValue::DVarValue(Type* t, LLValue* llvmValue, bool lvalue)
{
var = 0;
val = llvmValue;
rval = 0;
lval = lvalue;
type = t;
}
LLValue* DVarValue::getLVal()
{
assert(val && lval);
return val;
}
LLValue* DVarValue::getRVal()
{
assert(rval || val);
if (DtoIsPassedByRef(type)) {
if (rval) return rval;
return val;
}
else {
if (rval) return rval;
//Logger::cout() << "val: " << *val << '\n';
if (!isField() && DtoCanLoad(val)) {
return DtoLoad(val);
}
return val;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
DFuncValue::DFuncValue(FuncDeclaration* fd, LLValue* v, LLValue* vt)
{
func = fd;
type = func->type;
val = v;
vthis = vt;
}
LLValue* DFuncValue::getRVal()
{
assert(val);
return val;
}
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
LLValue* DConstValue::getRVal()
{
assert(c);
return c;
}
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////