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;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////////////