Mercurial > projects > ldc
diff gen/dvalue.cpp @ 88:058d3925950e trunk
[svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
author | lindquist |
---|---|
date | Tue, 06 Nov 2007 10:03:14 +0100 |
parents | |
children | ce7ed8f59b99 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gen/dvalue.cpp Tue Nov 06 10:03:14 2007 +0100 @@ -0,0 +1,101 @@ +#include "gen/llvm.h" + +#include "declaration.h" + +#include "gen/tollvm.h" +#include "gen/irstate.h" +#include "gen/logger.h" +#include "gen/dvalue.h" + +///////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////// + +DVarValue::DVarValue(VarDeclaration* vd, llvm::Value* llvmValue, bool lvalue) +{ + var = vd; + val = llvmValue; + rval = 0; + lval = lvalue; + type = var->type; +} + +DVarValue::DVarValue(Type* t, llvm::Value* lv, llvm::Value* rv) +{ + var = 0; + val = lv; + rval = rv; + lval = true; + type = t; +} + +DVarValue::DVarValue(Type* t, llvm::Value* llvmValue, bool lvalue) +{ + var = 0; + val = llvmValue; + rval = 0; + lval = lvalue; + type = t; +} + +llvm::Value* DVarValue::getLVal() +{ + assert(val && lval); + return val; +} + +llvm::Value* 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 (llvm::isa<llvm::Argument>(val)) { + if (var && (var->isRef() || var->isOut())) + return DtoLoad(val); + } + else if (!isField() && DtoCanLoad(val)) { + return DtoLoad(val); + } + return val; + } +} + +///////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////// + +DFuncValue::DFuncValue(FuncDeclaration* fd, llvm::Value* v, llvm::Value* vt) +{ + func = fd; + type = func->type; + val = v; + vthis = vt; + cc = (unsigned)-1; +} + +llvm::Value* DFuncValue::getLVal() +{ + assert(0); + return 0; +} + +llvm::Value* DFuncValue::getRVal() +{ + assert(val); + return val; +} + +///////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////// + +llvm::Value* DConstValue::getRVal() +{ + assert(c); + return c; +} + +///////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////