changeset 123:7f9a0a58394b trunk

[svn r127] Updated the lphobos build scripts a little. Created a new rebuild profile. Removed some potentially very long logging lines. Added support for inner classes.
author lindquist
date Wed, 28 Nov 2007 03:01:51 +0100
parents 36ab367572df
children a939ec89fc72
files gen/classes.cpp gen/functions.cpp gen/statements.cpp gen/toir.cpp llvmdc-posix llvmdc-posix-internal llvmdc.kdevelop.filelist lphobos/build.sh test/innerclass1.d
diffstat 9 files changed, 158 insertions(+), 120 deletions(-) [+]
line wrap: on
line diff
--- a/gen/classes.cpp	Tue Nov 27 09:19:07 2007 +0100
+++ b/gen/classes.cpp	Wed Nov 28 03:01:51 2007 +0100
@@ -131,12 +131,8 @@
     else
         *ts->llvmType = structtype;
 
-    if (cd->isNested()) {
-        assert(0 && "nested classes not implemented");
-    }
-    else {
-        gIR->module->addTypeName(cd->mangle(), ts->llvmType->get());
-    }
+    // name the type
+    gIR->module->addTypeName(cd->mangle(), ts->llvmType->get());
 
     // build interface info type
     std::vector<const llvm::Type*> infoTypes;
@@ -231,8 +227,8 @@
     gIR->classes.push_back(cd);
 
     bool needs_definition = false;
-    if (cd->parent->isModule()) {
-        needs_definition = (cd->getModule() == gIR->dmodule);
+    if (cd->getModule() == gIR->dmodule) {
+        needs_definition = true;
     }
 
     // interface vtables are emitted by the class implementing them
@@ -319,7 +315,7 @@
     DtoDeclareClassInfo(cd);
 
     // typeinfo
-    if (cd->parent->isModule() && cd->getModule() == gIR->dmodule)
+    if (needs_definition)
         cd->type->getTypeInfo(NULL);
 }
 
@@ -520,8 +516,7 @@
     assert(cd->type->ty == Tclass);
     TypeClass* ts = (TypeClass*)cd->type;
 
-    bool def = false;
-    if (cd->parent->isModule() && cd->getModule() == gIR->dmodule) {
+    if (cd->getModule() == gIR->dmodule) {
         // interfaces don't have initializers
         if (!cd->isInterfaceDeclaration()) {
             cd->llvmInit->setInitializer(cd->llvmConstInit);
@@ -542,11 +537,10 @@
                 irstruct->interfaceInfos->setInitializer(arrInit);
             }
         }
-        def = true;
+
+        // generate classinfo
+        DtoDefineClassInfo(cd);
     }
-
-    // generate classinfo
-    if (def) DtoDefineClassInfo(cd);
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
@@ -752,7 +746,7 @@
     llvm::Constant* c = isaConstant(vd->type->vtinfo->llvmValue);
 
     const llvm::Type* tiTy = llvm::PointerType::get(Type::typeinfo->type->llvmType->get());
-    Logger::cout() << "tiTy = " << *tiTy << '\n';
+    //Logger::cout() << "tiTy = " << *tiTy << '\n';
 
     types.push_back(tiTy);
     inits.push_back(llvm::ConstantExpr::getBitCast(c, tiTy));
--- a/gen/functions.cpp	Tue Nov 27 09:19:07 2007 +0100
+++ b/gen/functions.cpp	Wed Nov 28 03:01:51 2007 +0100
@@ -60,7 +60,7 @@
     std::vector<const llvm::Type*> paramvec;
 
     if (retinptr) {
-        Logger::cout() << "returning through pointer parameter: " << *rettype << '\n';
+        //Logger::cout() << "returning through pointer parameter: " << *rettype << '\n';
         paramvec.push_back(rettype);
     }
 
--- a/gen/statements.cpp	Tue Nov 27 09:19:07 2007 +0100
+++ b/gen/statements.cpp	Wed Nov 28 03:01:51 2007 +0100
@@ -192,7 +192,7 @@
 
 void ScopeStatement::toIR(IRState* p)
 {
-    Logger::println("ScopeStatement::toIR(): %s", toChars());
+    Logger::println("ScopeStatement::toIR()");
     LOG_SCOPE;
 
     llvm::BasicBlock* oldend = p->scopeend();
--- a/gen/toir.cpp	Tue Nov 27 09:19:07 2007 +0100
+++ b/gen/toir.cpp	Wed Nov 28 03:01:51 2007 +0100
@@ -1264,7 +1264,7 @@
     Type* t = DtoDType(type);
     Type* e1type = DtoDType(e1->type);
 
-    Logger::print("e1type=%s\n", e1type->toChars());
+    //Logger::print("e1type=%s\n", e1type->toChars());
 
     if (VarDeclaration* vd = var->isVarDeclaration()) {
         llvm::Value* arrptr;
@@ -1282,13 +1282,13 @@
             std::vector<unsigned> vdoffsets(1,0);
             tc->sym->offsetToIndex(vd->type, vd->offset, vdoffsets);
             llvm::Value* src = l->getRVal();
-            Logger::cout() << "src: " << *src << '\n';
+            //Logger::cout() << "src: " << *src << '\n';
             arrptr = DtoGEP(src,vdoffsets,"tmp",p->scopebb());
         }
         else
             assert(0);
 
-        Logger::cout() << "mem: " << *arrptr << '\n';
+        //Logger::cout() << "mem: " << *arrptr << '\n';
         return new DVarValue(vd, arrptr, true);
     }
     else if (FuncDeclaration* fdecl = var->isFuncDeclaration())
@@ -1314,7 +1314,7 @@
 
             llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false);
             llvm::Value* vtblidx = llvm::ConstantInt::get(llvm::Type::Int32Ty, (size_t)fdecl->vtblIndex, false);
-            Logger::cout() << "vthis: " << *vthis << '\n';
+            //Logger::cout() << "vthis: " << *vthis << '\n';
             funcval = DtoGEP(vthis, zero, zero, "tmp", p->scopebb());
             funcval = new llvm::LoadInst(funcval,"tmp",p->scopebb());
             funcval = DtoGEP(funcval, zero, vtblidx, toChars(), p->scopebb());
@@ -1332,7 +1332,7 @@
         return new DFuncValue(fdecl, funcval, vthis2);
     }
     else {
-        printf("unknown: %s\n", var->toChars());
+        printf("unsupported dotvarexp: %s\n", var->toChars());
     }
 
     assert(0);
@@ -1756,10 +1756,9 @@
     Logger::print("NewExp::toElem: %s | %s\n", toChars(), type->toChars());
     LOG_SCOPE;
 
-    assert(!thisexp);
-    assert(!newargs);
+    assert(!newargs && "arguments to new not yet supported");
     assert(newtype);
-    assert(!allocator);
+    assert(!allocator && "custom allocators not yet supported");
 
     Type* ntype = DtoDType(newtype);
 
@@ -1809,7 +1808,16 @@
 
     if (ntype->ty == Tclass) {
         // first apply the static initializer
-        DtoInitClass((TypeClass*)ntype, emem);
+        TypeClass* tc = (TypeClass*)ntype;
+        DtoInitClass(tc, emem);
+
+        // set the this var for nested classes
+        if (thisexp) {
+            DValue* thisval = thisexp->toElem(p);
+            size_t idx = 2;
+            idx += tc->sym->llvmIRStruct->interfaces.size();
+            DtoStore(thisval->getRVal(), DtoGEPi(emem,0,idx,"tmp"));
+        }
 
         // then call constructor
         if (arguments) {
--- a/llvmdc-posix	Tue Nov 27 09:19:07 2007 +0100
+++ b/llvmdc-posix	Wed Nov 28 03:01:51 2007 +0100
@@ -1,77 +1,2 @@
-#profile=phobos
-
-compiler=llvmdc
-inifile=llvmdc.conf
-
-exeext=
-objext=bc
-
-
-version=LLVM
-noversion=DigitalMars
-noversion=GNU
-testversion=linux
-testversion=Unix
-version=Posix
-testversion=Windows
-testversion=Win32
-testversion=Win64
-testversion=X86
-testversion=PPC
-testversion=X86_64
-testversion=PPC64
-testversion=D_InlineAsm
-testvestion=D_InlineAsm_X86
-testversion=D_InlineAsm_PPC
-testversion=D_InlineAsm_X86_64
-testversion=D_InlineAsm_PPC64
-testversion=LittleEndian
-testversion=BigEndian
-testversion=LLVM64
-
-
-[compile]
-cmd=llvmdc -version=Posix -c $i
-
-flag=$i
-incdir=-I$i
-libdir=-L-L$i
-optimize=-O5
-version=-version=$i
-
-
-[link]
-oneatatime=yes
-cmd=llvmdc $i -of$o
-
-libdir=-L-L$i
-lib=-L-l$i
-flag=-L$i
-
-
-[liblink]
-safe=yes
-oneatatime=yes
-cmd=llvm-link -f -o=$o $i
-
-libdir=
-lib=
-flag=
-
-
-[postliblink]
-cmd=
-
-
-[shliblink]
-shlibs=no
-oneatatime=yes
-cmd=llvm-link $i | llc -filetype=dynlib -f -o=$o
-
-libdir=
-lib=
-flag=
-
-
-[dyliblink]
-dylibs=no
+profile=phobos
+profile=llvmdc-posix-internal
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/llvmdc-posix-internal	Wed Nov 28 03:01:51 2007 +0100
@@ -0,0 +1,78 @@
+# this profile is used to build the runtime and phobos
+# don't use it for normal code or you will get linktime conflicts
+
+compiler=llvmdc
+inifile=llvmdc.conf
+
+exeext=
+objext=bc
+
+
+version=LLVM
+noversion=DigitalMars
+noversion=GNU
+testversion=linux
+testversion=Unix
+version=Posix
+testversion=Windows
+testversion=Win32
+testversion=Win64
+testversion=X86
+testversion=PPC
+testversion=X86_64
+testversion=PPC64
+testversion=D_InlineAsm
+testvestion=D_InlineAsm_X86
+testversion=D_InlineAsm_PPC
+testversion=D_InlineAsm_X86_64
+testversion=D_InlineAsm_PPC64
+testversion=LittleEndian
+testversion=BigEndian
+testversion=LLVM64
+
+
+[compile]
+cmd=llvmdc -version=Posix -c $i
+
+flag=$i
+incdir=-I$i
+libdir=-L-L$i
+optimize=-O5
+version=-version=$i
+
+
+[link]
+oneatatime=yes
+cmd=llvmdc $i -of$o
+
+libdir=-L-L$i
+lib=-L-l$i
+flag=-L$i
+
+
+[liblink]
+safe=yes
+oneatatime=yes
+cmd=llvm-link -f -o=$o $i
+
+libdir=
+lib=
+flag=
+
+
+[postliblink]
+cmd=
+
+
+[shliblink]
+shlibs=no
+oneatatime=yes
+cmd=llvm-link $i | llc -filetype=dynlib -f -o=$o
+
+libdir=
+lib=
+flag=
+
+
+[dyliblink]
+dylibs=no
--- a/llvmdc.kdevelop.filelist	Tue Nov 27 09:19:07 2007 +0100
+++ b/llvmdc.kdevelop.filelist	Wed Nov 28 03:01:51 2007 +0100
@@ -385,6 +385,7 @@
 test/imports2.d
 test/imports_1of2.d
 test/imports_2of2.d
+test/innerclass1.d
 test/interface1.d
 test/interface2.d
 test/interface3.d
--- a/lphobos/build.sh	Tue Nov 27 09:19:07 2007 +0100
+++ b/lphobos/build.sh	Wed Nov 28 03:01:51 2007 +0100
@@ -5,60 +5,63 @@
 rm -f obj/*.bc
 rm -f ../lib/*.bc
 
+LLVMDCFLAGS="-c -odobj"
+REBUILDFLAGS="-dc=llvmdc-posix-internal -c -oqobj"
+
 echo "compiling contract runtime"
 llvmdc internal/contract.d -c -of../lib/llvmdcore.bc -noruntime || exit 1
 
 echo "compiling common runtime"
 rebuild internal/arrays.d \
         internal/mem.d \
-        -c -oqobj -dc=llvmdc-posix || exit 1
+        $REBUILDFLAGS || exit 1
 
 echo "compiling module init backend"
 llvm-as -f -o=obj/moduleinit_backend.bc internal/moduleinit_backend.ll || exit 1
 llvm-link -f -o=../lib/llvmdcore.bc `ls obj/internal.*.bc` ../lib/llvmdcore.bc obj/moduleinit_backend.bc || exit 1
 
 echo "compiling typeinfo 1"
-rebuild typeinfos1.d -c -oqobj -dc=llvmdc-posix || exit 1
+rebuild typeinfos1.d $REBUILDFLAGS || exit 1
 llvm-link -f -o=../lib/llvmdcore.bc `ls obj/typeinfo1.*.bc` ../lib/llvmdcore.bc || exit 1
 
 echo "compiling typeinfo 2"
-rebuild typeinfos2.d -c -oqobj -dc=llvmdc-posix || exit 1
+rebuild typeinfos2.d $REBUILDFLAGS || exit 1
 llvm-link -f -o=../lib/llvmdcore.bc `ls obj/typeinfo2.*.bc` ../lib/llvmdcore.bc || exit 1
 
 echo "compiling object/interface casting runtime support"
-llvmdc internal/cast.d -c -odobj || exit 1
+llvmdc internal/cast.d $LLVMDCFLAGS || exit 1
 llvm-link -f -o=../lib/llvmdcore.bc obj/cast.bc ../lib/llvmdcore.bc || exit 1
 
 echo "compiling string foreach/switch runtime support"
-llvmdc internal/aApply.d -c -odobj || exit 1
-llvmdc internal/aApplyR.d -c -odobj || exit 1
-llvmdc internal/switch.d -c -odobj || exit 1
+llvmdc internal/aApply.d $LLVMDCFLAGS || exit 1
+llvmdc internal/aApplyR.d $LLVMDCFLAGS || exit 1
+llvmdc internal/switch.d $LLVMDCFLAGS || exit 1
 llvm-link -f -o=../lib/llvmdcore.bc obj/aApply.bc obj/aApplyR.bc obj/switch.bc ../lib/llvmdcore.bc || exit 1
 
 echo "compiling array runtime support"
-llvmdc internal/qsort2.d -c -odobj || exit 1
+llvmdc internal/qsort2.d $LLVMDCFLAGS || exit 1
 llvm-link -f -o=../lib/llvmdcore.bc obj/qsort2.bc ../lib/llvmdcore.bc || exit 1
-llvmdc internal/adi.d -c -odobj || exit 1
+llvmdc internal/adi.d $LLVMDCFLAGS || exit 1
 llvm-link -f -o=../lib/llvmdcore.bc obj/adi.bc ../lib/llvmdcore.bc || exit 1
-llvmdc internal/aaA.d -c -odobj || exit 1
+llvmdc internal/aaA.d $LLVMDCFLAGS || exit 1
 llvm-link -f -o=../lib/llvmdcore.bc obj/aaA.bc ../lib/llvmdcore.bc || exit 1
 
 echo "compiling object implementation"
-llvmdc internal/objectimpl.d -c -odobj || exit 1
+llvmdc internal/objectimpl.d $LLVMDCFLAGS || exit 1
 llvm-link -f -o=../lib/llvmdcore.bc obj/objectimpl.bc ../lib/llvmdcore.bc || exit 1
 
 echo "compiling llvm runtime support"
-rebuild llvmsupport.d -c -oqobj -dc=llvmdc-posix || exit 1
+rebuild llvmsupport.d $REBUILDFLAGS || exit 1
 llvm-link -f -o=../lib/llvmdcore.bc `ls obj/llvm.*.bc` ../lib/llvmdcore.bc || exit 1
 
 echo "compiling garbage collector"
-llvmdc gc/gclinux.d -c -odobj || exit 1
-llvmdc gc/gcstub.d -c -odobj -Igc || exit 1
-llvmdc gc/gcbits.d -c -odobj -Igc || exit 1
+llvmdc gc/gclinux.d $LLVMDCFLAGS || exit 1
+llvmdc gc/gcstub.d $LLVMDCFLAGS -Igc || exit 1
+llvmdc gc/gcbits.d $LLVMDCFLAGS -Igc || exit 1
 llvm-link -f -o=../lib/llvmdcore.bc obj/gclinux.bc obj/gcstub.bc obj/gcbits.bc ../lib/llvmdcore.bc || exit 1
 
 echo "compiling phobos"
-rebuild phobos.d -c -oqobj -dc=llvmdc-posix || exit 1
+rebuild phobos.d $REBUILDFLAGS || exit 1
 llvm-link -f -o=../lib/llvmdcore.bc `ls obj/std.*.bc` ../lib/llvmdcore.bc || exit 1
 
 echo "optimizing"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/innerclass1.d	Wed Nov 28 03:01:51 2007 +0100
@@ -0,0 +1,29 @@
+module innerclass1;
+
+class Outer
+{
+    int i;
+    class Inner
+    {
+        int func()
+        {
+            return i;
+        }
+    }
+}
+
+void main()
+{
+    Outer o = new Outer;
+    {
+        o.i = 42;
+        {
+            auto i = o.new Inner;
+            {
+                int x = i.func();
+                assert(x == 42);
+            }
+        }
+    }
+    printf("SUCCESS\n");
+}