mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-02-01 04:23:14 +01:00
[svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
This commit is contained in:
101
gen/dvalue.cpp
Normal file
101
gen/dvalue.cpp
Normal file
@@ -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;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
Reference in New Issue
Block a user