diff gen/arrays.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 058d3925950e
children ce7ed8f59b99
line wrap: on
line diff
--- a/gen/arrays.cpp	Thu Nov 08 19:21:05 2007 +0100
+++ b/gen/arrays.cpp	Mon Nov 12 06:32:46 2007 +0100
@@ -21,14 +21,6 @@
     const llvm::Type* at = DtoType(t->next);
     const llvm::Type* arrty;
 
-    /*if (t->ty == Tsarray) {
-        TypeSArray* tsa = (TypeSArray*)t;
-        assert(tsa->dim->type->isintegral());
-        arrty = llvm::ArrayType::get(at,tsa->dim->toUInteger());
-    }
-    else {
-        arrty = llvm::ArrayType::get(at,0);
-    }*/
     if (at == llvm::Type::VoidTy) {
         at = llvm::Type::Int8Ty;
     }
@@ -648,12 +640,17 @@
 //////////////////////////////////////////////////////////////////////////////////////////
 llvm::Value* DtoArrayCastLength(llvm::Value* len, const llvm::Type* elemty, const llvm::Type* newelemty)
 {
-    llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_array_cast_len");
-    assert(fn);
+    size_t esz = gTargetData->getTypeSize(elemty);
+    size_t nsz = gTargetData->getTypeSize(newelemty);
+    if (esz == nsz)
+        return len;
+
     std::vector<llvm::Value*> args;
     args.push_back(len);
-    args.push_back(llvm::ConstantInt::get(DtoSize_t(), gTargetData->getTypeSize(elemty), false));
-    args.push_back(llvm::ConstantInt::get(DtoSize_t(), gTargetData->getTypeSize(newelemty), false));
+    args.push_back(llvm::ConstantInt::get(DtoSize_t(), esz, false));
+    args.push_back(llvm::ConstantInt::get(DtoSize_t(), nsz, false));
+
+    llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_array_cast_len");
     return new llvm::CallInst(fn, args.begin(), args.end(), "tmp", gIR->scopebb());
 }
 
@@ -722,7 +719,9 @@
         return DtoLoad(DtoGEPi(v->getRVal(), 0,0, "tmp"));
     }
     else if (t->ty == Tsarray) {
-        const llvm::ArrayType* t = llvm::cast<llvm::ArrayType>(v->getLVal()->getType());
+        llvm::Value* rv = v->getRVal();
+        Logger::cout() << "casting: " << *rv << '\n';
+        const llvm::ArrayType* t = llvm::cast<llvm::ArrayType>(rv->getType()->getContainedType(0));
         return DtoConstSize_t(t->getNumElements());
     }
     assert(0);