Permalink
Browse files

Remove code duplication for vtable loads and improve instruction nami…

…ng to make

bitcode with virtual calls easier to read.
  • Loading branch information...
1 parent a05ed9a commit da593c99dc01b393ab082baadce0e6de34df49ac Frits van Bommel committed May 30, 2009
Showing with 12 additions and 20 deletions.
  1. +8 −2 gen/classes.cpp
  2. +1 −1 gen/classes.h
  3. +3 −17 gen/toir.cpp
View
@@ -514,7 +514,7 @@ LLValue* DtoIndexClass(LLValue* src, ClassDeclaration* cd, VarDeclaration* vd)
//////////////////////////////////////////////////////////////////////////////////////////
-LLValue* DtoVirtualFunctionPointer(DValue* inst, FuncDeclaration* fdecl)
+LLValue* DtoVirtualFunctionPointer(DValue* inst, FuncDeclaration* fdecl, char* name)
{
// sanity checks
assert(fdecl->isVirtual());
@@ -533,7 +533,9 @@ LLValue* DtoVirtualFunctionPointer(DValue* inst, FuncDeclaration* fdecl)
// 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 @@ LLValue* DtoVirtualFunctionPointer(DValue* inst, FuncDeclaration* fdecl)
// 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';
View
@@ -32,6 +32,6 @@ DValue* DtoDynamicCastInterface(DValue* val, Type* to);
LLValue* DtoIndexClass(LLValue* src, ClassDeclaration* sd, VarDeclaration* vd);
-LLValue* DtoVirtualFunctionPointer(DValue* inst, FuncDeclaration* fdecl);
+LLValue* DtoVirtualFunctionPointer(DValue* inst, FuncDeclaration* fdecl, char* name);
#endif
View
@@ -1134,22 +1134,8 @@ DValue* DotVarExp::toElem(IRState* p)
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 @@ DValue* DelegateExp::toElem(IRState* p)
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())

0 comments on commit da593c9

Please sign in to comment.