Files
ldc/gen/elem.c
Tomas Lindquist Olsen 10db08076c [svn r44] Lots of bug fixes.
New array literal support
New array ~= operator support (for single element)
New with statement support
More...
2007-10-19 07:43:21 +02:00

67 lines
1.4 KiB
C

#include <iostream>
#include "gen/llvm.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;
isthis = false;
vardecl = 0;
funcdecl = 0;
}
llvm::Value* elem::getValue()
{
assert(val || mem);
switch(type)
{
case NONE:
assert(0 && "type == NONE");
break;
case VAR:
case REF:
case ARRAYLEN:
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 gIR->ir->CreateLoad(mem, "tmp");
}
}
case VAL:
case NUL:
case FUNC:
case CONST:
case SLICE:
return val ? val : mem;
}
assert(0 && "type == invalid value");
return 0;
}