Files
ldc/gen/elem.c
Tomas Lindquist Olsen 3db5b9bb98 [svn r38] * resizing dynamic arrays support
* throw is replaced with assert(0)
* catch is ignored
* better foreach support
* various bugfixes
2007-10-09 02:50:00 +02:00

67 lines
1.4 KiB
C

#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;
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 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;
}