Mercurial > projects > ldc
view gen/elem.cpp @ 94:61615fa85940 trunk
[svn r98] Added support for std.c.stdlib.alloca via pragma(LLVM_internal, "alloca").
Added support for array .sort and .reverse properties.
Fixed some bugs with pointer arithmetic.
Disabled some DMD AST optimizations that was messing things up, destroying valuable information.
Added a KDevelop project file, this is what I use for coding LLVMDC now :)
Other minor stuff.
author | lindquist |
---|---|
date | Mon, 12 Nov 2007 06:32:46 +0100 |
parents | fd32135dca3e |
children |
line wrap: on
line source
/* #include <iostream> #include "gen/llvm.h" #include "gen/elem.h" #include "gen/irstate.h" #include "gen/logger.h" #include "gen/dvalue.h" ////////////////////////////////////////////////////////////////////////////////////////// elem::elem(Expression* e) { exp = e; mem = 0; val = 0; arg = 0; type = NONE; inplace = false; field = false; callconv = (unsigned)-1; isthis = false; istypeinfo = false; temp = false; vardecl = 0; funcdecl = 0; dvalue = 0; } elem::~elem() { delete dvalue; } llvm::Value* elem::getValue() { if (dvalue && !dvalue->isSlice()) { Logger::println("HAS DVALUE"); return dvalue->getRVal(); } 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; } */