diff gen/toir.cpp @ 96:ce7ed8f59b99 trunk

[svn r100] Moved test/ray.d to demos/ray.d. Cleanups.
author lindquist
date Mon, 12 Nov 2007 07:58:44 +0100
parents 61615fa85940
children c4e161556a21
line wrap: on
line diff
--- a/gen/toir.cpp	Mon Nov 12 06:43:33 2007 +0100
+++ b/gen/toir.cpp	Mon Nov 12 07:58:44 2007 +0100
@@ -16,13 +16,11 @@
 
 #include "total.h"
 #include "init.h"
-#include "symbol.h"
 #include "mtype.h"
 #include "hdrgen.h"
 #include "port.h"
 
 #include "gen/irstate.h"
-#include "gen/elem.h"
 #include "gen/logger.h"
 #include "gen/tollvm.h"
 #include "gen/runtime.h"
@@ -249,7 +247,7 @@
     Logger::print("IntegerExp::toConstElem: %s | %s\n", toChars(), type->toChars());
     LOG_SCOPE;
     const llvm::Type* t = DtoType(type);
-    if (llvm::isa<llvm::PointerType>(t)) {
+    if (isaPointer(t)) {
         Logger::println("pointer");
         llvm::Constant* i = llvm::ConstantInt::get(DtoSize_t(),(uint64_t)value,false);
         return llvm::ConstantExpr::getIntToPtr(i, t);
@@ -305,7 +303,7 @@
     LOG_SCOPE;
     const llvm::Type* t = DtoType(type);
     if (type->ty == Tarray) {
-        assert(llvm::isa<llvm::StructType>(t));
+        assert(isaStruct(t));
         return llvm::ConstantAggregateZero::get(t);
     }
     else {
@@ -752,11 +750,11 @@
 
     /*
     llvm::Value* left = l->getValue();
-    if (llvm::isa<llvm::PointerType>(left->getType()))
+    if (isaPointer(left->getType()))
         left = new llvm::PtrToIntInst(left,DtoSize_t(),"tmp",p->scopebb());
 
     llvm::Value* right = r->getValue();
-    if (llvm::isa<llvm::PointerType>(right->getType()))
+    if (isaPointer(right->getType()))
         right = new llvm::PtrToIntInst(right,DtoSize_t(),"tmp",p->scopebb());
 
     e->val = llvm::BinaryOperator::createSub(left,right,"tmp",p->scopebb());
@@ -765,7 +763,7 @@
     const llvm::Type* totype = DtoType(type);
     if (e->val->getType() != totype) {
         assert(0);
-        assert(llvm::isa<llvm::PointerType>(e->val->getType()));
+        assert(isaPointer(e->val->getType()));
         assert(llvm::isa<llvm::IntegerType>(totype));
         e->val = new llvm::IntToPtrInst(e->val,totype,"tmp",p->scopebb());
     }
@@ -1104,6 +1102,10 @@
             const llvm::Type* llt = DtoType(type);
             if (DtoIsPassedByRef(t))
                 llt = llvm::PointerType::get(llt);
+            // TODO
+            if (strcmp(global.params.llvmArch, "x86") != 0) {
+                warning("va_arg for C variadic functions is broken for anything but x86");
+            }
             return new DImValue(type, p->ir->CreateVAArg(expelem->getLVal(),llt,"tmp"));
         }
         else if (fndecl->llvmInternal == LLVMalloca) {
@@ -1136,10 +1138,10 @@
         llfnty = llvm::cast<llvm::FunctionType>(funcval->getType());
     }
     // pointer to something
-    else if (llvm::isa<llvm::PointerType>(funcval->getType())) {
+    else if (isaPointer(funcval->getType())) {
         // pointer to function pointer - I think this not really supposed to happen, but does :/
         // seems like sometimes we get a func* other times a func**
-        if (llvm::isa<llvm::PointerType>(funcval->getType()->getContainedType(0))) {
+        if (isaPointer(funcval->getType()->getContainedType(0))) {
             funcval = new llvm::LoadInst(funcval,"tmp",p->scopebb());
         }
         // function pointer
@@ -1148,7 +1150,7 @@
             llfnty = llvm::cast<llvm::FunctionType>(funcval->getType()->getContainedType(0));
         }
         // struct pointer - delegate
-        else if (llvm::isa<llvm::StructType>(funcval->getType()->getContainedType(0))) {
+        else if (isaStruct(funcval->getType()->getContainedType(0))) {
             funcval = DtoGEP(funcval,zero,one,"tmp",p->scopebb());
             funcval = new llvm::LoadInst(funcval,"tmp",p->scopebb());
             const llvm::Type* ty = funcval->getType()->getContainedType(0);
@@ -1178,7 +1180,7 @@
         if (topexp && topexp->e2 == this) {
             assert(topexp->v);
             llvm::Value* tlv = topexp->v->getLVal();
-            assert(llvm::isa<llvm::StructType>(tlv->getType()->getContainedType(0)));
+            assert(isaStruct(tlv->getType()->getContainedType(0)));
             llargs[j] = tlv;
             if (DtoIsPassedByRef(tf->next)) {
                 isInPlace = true;
@@ -1262,7 +1264,7 @@
             for (unsigned i=0; i<vtype->getNumElements(); ++i)
                 p->ir->CreateStore(vvalues[i], DtoGEPi(mem,0,i,"tmp"));
 
-            //llvm::Constant* typeinfoparam = llvm::ConstantPointerNull::get(llvm::cast<llvm::PointerType>(llfnty->getParamType(j)));
+            //llvm::Constant* typeinfoparam = llvm::ConstantPointerNull::get(isaPointer(llfnty->getParamType(j)));
             assert(Type::typeinfo->llvmInitZ);
             const llvm::Type* typeinfotype = llvm::PointerType::get(Type::typeinfo->llvmInitZ->getType());
             Logger::cout() << "typeinfo ptr type: " << *typeinfotype << '\n';
@@ -1448,8 +1450,8 @@
                 llvm::Value* uval = u->getRVal();
                 if (fromtype->ty == Tsarray) {
                     Logger::cout() << "uvalTy = " << *uval->getType() << '\n';
-                    assert(llvm::isa<llvm::PointerType>(uval->getType()));
-                    const llvm::ArrayType* arrty = llvm::cast<llvm::ArrayType>(uval->getType()->getContainedType(0));
+                    assert(isaPointer(uval->getType()));
+                    const llvm::ArrayType* arrty = isaArray(uval->getType()->getContainedType(0));
                     rval2 = llvm::ConstantInt::get(DtoSize_t(), arrty->getNumElements(), false);
                     rval2 = DtoArrayCastLength(rval2, ety, ptrty->getContainedType(0));
                     rval = new llvm::BitCastInst(uval, ptrty, "tmp", p->scopebb());
@@ -2479,7 +2481,7 @@
     else {
         llvm::ICmpInst::Predicate pred = (op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE;
         if (t1->ty == Tpointer && v->isNull() && l->getType() != r->getType()) {
-            r = llvm::ConstantPointerNull::get(llvm::cast<llvm::PointerType>(l->getType()));
+            r = llvm::ConstantPointerNull::get(isaPointer(l->getType()));
         }
         Logger::cout() << "l = " << *l << " r = " << *r << '\n';
         eval = new llvm::ICmpInst(pred, l, r, "tmp", p->scopebb());
@@ -2660,7 +2662,7 @@
     }
 
     llvm::Value* context = DtoGEPi(lval,0,0,"tmp",p->scopebb());
-    const llvm::PointerType* pty = llvm::cast<llvm::PointerType>(context->getType()->getContainedType(0));
+    const llvm::PointerType* pty = isaPointer(context->getType()->getContainedType(0));
     llvm::Value* llvmNested = p->func().decl->llvmNested;
     if (llvmNested == NULL) {
         llvm::Value* nullcontext = llvm::ConstantPointerNull::get(pty);
@@ -2709,8 +2711,8 @@
             mem = p->topexp()->v->getLVal();
         }
         assert(mem);
-        if (!llvm::isa<llvm::PointerType>(mem->getType()) ||
-            !llvm::isa<llvm::ArrayType>(mem->getType()->getContainedType(0)))
+        if (!isaPointer(mem->getType()) ||
+            !isaArray(mem->getType()->getContainedType(0)))
         {
             assert(ty->ty == Tarray);
             // we need to give this array literal storage
@@ -2748,8 +2750,8 @@
 
     const llvm::Type* t = DtoType(type);
     Logger::cout() << "array literal has llvm type: " << *t << '\n';
-    assert(llvm::isa<llvm::ArrayType>(t));
-    const llvm::ArrayType* arrtype = llvm::cast<llvm::ArrayType>(t);
+    assert(isaArray(t));
+    const llvm::ArrayType* arrtype = isaArray(t);
 
     assert(arrtype->getNumElements() == elements->dim);
     std::vector<llvm::Constant*> vals(elements->dim, NULL);
@@ -2851,7 +2853,7 @@
 
     assert(DtoDType(type)->ty == Tstruct);
     const llvm::Type* t = DtoType(type);
-    const llvm::StructType* st = llvm::cast<llvm::StructType>(t);
+    const llvm::StructType* st = isaStruct(t);
     return llvm::ConstantStruct::get(st,vals);
 }
 
@@ -3130,7 +3132,7 @@
 int AsmStatement::comeFrom()
 {
     assert(0);
-    return FALSE;
+    return 0;
 }
 
 void