changeset 1434:5d0c043ff131

Remove code duplication for vtable loads and improve instruction naming to make bitcode with virtual calls easier to read.
author Frits van Bommel <fvbommel wxs.nl>
date Sat, 30 May 2009 13:04:49 +0200
parents f79971a45bee
children 59c527d44303
files gen/classes.cpp gen/classes.h gen/toir.cpp
diffstat 3 files changed, 12 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/gen/classes.cpp	Sat May 30 12:58:04 2009 +0200
+++ b/gen/classes.cpp	Sat May 30 13:04:49 2009 +0200
@@ -514,7 +514,7 @@
 
 //////////////////////////////////////////////////////////////////////////////////////////
 
-LLValue* DtoVirtualFunctionPointer(DValue* inst, FuncDeclaration* fdecl)
+LLValue* DtoVirtualFunctionPointer(DValue* inst, FuncDeclaration* fdecl, char* name)
 {
     // sanity checks
     assert(fdecl->isVirtual());
@@ -533,7 +533,9 @@
     // load vtbl ptr
     funcval = DtoLoad(funcval);
     // index vtbl
-    funcval = DtoGEPi(funcval, 0, fdecl->vtblIndex, fdecl->toChars());
+    std::string vtblname = name;
+    vtblname.append("@vtbl");
+    funcval = DtoGEPi(funcval, 0, fdecl->vtblIndex, vtblname.c_str());
     // load funcptr
     funcval = DtoAlignedLoad(funcval);
 
@@ -542,6 +544,10 @@
 
     // cast to final funcptr type
     funcval = DtoBitCast(funcval, getPtrToType(DtoType(fdecl->type)));
+
+    // postpone naming until after casting to get the name in call instructions
+    funcval->setName(name);
+
     if (Logger::enabled())
         Logger::cout() << "funcval casted: " << *funcval << '\n';
 
--- a/gen/classes.h	Sat May 30 12:58:04 2009 +0200
+++ b/gen/classes.h	Sat May 30 13:04:49 2009 +0200
@@ -32,6 +32,6 @@
 
 LLValue* DtoIndexClass(LLValue* src, ClassDeclaration* sd, VarDeclaration* vd);
 
-LLValue* DtoVirtualFunctionPointer(DValue* inst, FuncDeclaration* fdecl);
+LLValue* DtoVirtualFunctionPointer(DValue* inst, FuncDeclaration* fdecl, char* name);
 
 #endif
--- a/gen/toir.cpp	Sat May 30 12:58:04 2009 +0200
+++ b/gen/toir.cpp	Sat May 30 13:04:49 2009 +0200
@@ -1134,22 +1134,8 @@
             assert(funcval);
         }
         else {
-            assert(fdecl->vtblIndex > 0);
-            assert(e1type->ty == Tclass);
-
-            LLValue* zero = DtoConstUint(0);
-            size_t vtblidx = fdecl->vtblIndex;
-            if (Logger::enabled())
-                Logger::cout() << "vthis: " << *vthis << '\n';
-            funcval = DtoGEP(vthis, zero, zero);
-            funcval = DtoLoad(funcval);
-            Logger::println("vtblidx = %lu", vtblidx);
-            funcval = DtoGEP(funcval, zero, DtoConstUint(vtblidx), toChars());
-            funcval = DtoLoad(funcval);
-
-            funcval = DtoBitCast(funcval, getPtrToType(DtoType(fdecl->type)));
-            if (Logger::enabled())
-                Logger::cout() << "funcval casted: " << *funcval << '\n';
+            DImValue vthis3(e1type, vthis);
+            funcval = DtoVirtualFunctionPointer(&vthis3, fdecl, toChars());
         }
 
         return new DFuncValue(fdecl, funcval, vthis2);
@@ -2031,7 +2017,7 @@
 
     LLValue* castfptr;
     if (func->isVirtual() && !func->isFinal())
-        castfptr = DtoVirtualFunctionPointer(u, func);
+        castfptr = DtoVirtualFunctionPointer(u, func, toChars());
     else if (func->isAbstract())
         assert(0 && "TODO delegate to abstract method");
     else if (func->toParent()->isInterfaceDeclaration())