view gen/elem.c @ 11:d3ee9efe20e2 trunk

[svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing. * Now 50/51 tests compile. * Added a simple runalltests.d scripts that should be run with 'gdmd -run runalltests.d' - LLVMDC will not compile it yet.
author lindquist
date Tue, 02 Oct 2007 05:10:18 +0200
parents e116aa1488e6
children 37a4fdab33fc
line wrap: on
line source

#include <iostream>

#include "llvm/Instructions.h"

#include "gen/elem.h"
#include "gen/irstate.h"
#include "gen/logger.h"

//////////////////////////////////////////////////////////////////////////////////////////

elem::elem()
{
    mem = 0;
    val = 0;
    arg = 0;

    type = NONE;
    inplace = false;
    field = false;
    callconv = (unsigned)-1;

    vardecl = 0;
    funcdecl = 0;
}

llvm::Value* elem::getValue()
{
    assert(val || mem);
    switch(type)
    {
    case NONE:
        assert(0 && "type == NONE");
        break;

    case VAR:
    case REF: {
        if (val) {
            return val;
        }
        else {
            if (!llvm::isa<llvm::PointerType>(mem->getType()))
            {
                Logger::cout() << "unexpected type: " << *mem->getType() << '\n';
                assert(0);
            }
            const llvm::PointerType* pt = llvm::cast<llvm::PointerType>(mem->getType());
            if (!pt->getElementType()->isFirstClassType()) {
                return mem;
            }
            else {
                return new llvm::LoadInst(mem, "tmp", gIR->scopebb());
            }
        }
    }

    case VAL:
    case NUL:
    case FUNC:
    case CONST:
    case SLICE:
        return val ? val : mem;
    }
    assert(0 && "type == invalid value");
    return 0;
}