diff gen/tollvm.c @ 8:5e69b77a5c51 trunk

[svn r12] fixed accessing aggregate fields of aggregates removed some useless branches for successive scopes ala {}{}{}
author lindquist
date Thu, 27 Sep 2007 06:03:06 +0200
parents 35d93ce68cf4
children dafae18f9c08
line wrap: on
line diff
--- a/gen/tollvm.c	Wed Sep 26 19:17:54 2007 +0200
+++ b/gen/tollvm.c	Thu Sep 27 06:03:06 2007 +0200
@@ -460,7 +460,11 @@
         VarDeclaration* vd = (VarDeclaration*)si->vars.data[i];
         assert(vd);
         Logger::println("vars[%d] = %s", i, vd->toChars());
-        unsigned idx = si->ad->offsetToIndex(vd->offset);
+
+        std::vector<unsigned> idxs;
+        si->ad->offsetToIndex(vd->offset, idxs);
+        assert(idxs.size() == 1);
+        unsigned idx = idxs[0];
 
         llvm::Constant* v = 0;
 
@@ -819,3 +823,17 @@
     v[1] = i1;
     return new llvm::GetElementPtrInst(ptr, v.begin(), v.end(), var, bb);
 }
+
+llvm::Value* LLVM_DtoGEP(llvm::Value* ptr, const std::vector<unsigned>& src, const std::string& var, llvm::BasicBlock* bb)
+{
+    size_t n = src.size();
+    std::vector<llvm::Value*> dst(n);
+    Logger::cout() << "indices:";
+    for (size_t i=0; i<n; ++i)
+    {
+        Logger::cout() << ' ' << i;
+        dst[i] = llvm::ConstantInt::get(llvm::Type::Int32Ty, src[i], false);
+    }
+    Logger::cout() << '\n';
+    return new llvm::GetElementPtrInst(ptr, dst.begin(), dst.end(), var, bb);
+}