[PATCH] [-cxx-abi microsoft] Emit thunks for pointers to virtual member functions

Reid Kleckner rnk at google.com
Thu Nov 14 10:40:57 PST 2013


  LGTM


================
Comment at: lib/CodeGen/MicrosoftCXXABI.cpp:1434
@@ +1433,3 @@
+      FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy);
+    } else if (CGM.getMicrosoftVTableContext()
+                   .getMethodVFTableLocation(MD)
----------------
Timur Iskhodzhanov wrote:
> how about
> 
>   } else {
>     ... &ML = CGM.getMicrosoftVTableContext().getMethodVFTableLocation(MD);
>     if (ML.VBase) {
>        ...
>     } else {
>        ...
>     }
>   }
> 
> ?
+1

================
Comment at: lib/CodeGen/MicrosoftCXXABI.cpp:988-991
@@ +987,6 @@
+  llvm::Function *ThunkFn =
+      llvm::Function::Create(ThunkTy, llvm::Function::ExternalLinkage,
+                             ThunkName.str(), &CGM.getModule());
+  assert(ThunkFn->getName() == ThunkName && "name was uniqued!");
+  ThunkFn->setLinkage(llvm::GlobalValue::LinkOnceODRLinkage);
+  CGM.SetLLVMFunctionAttributes(MD, FnInfo, ThunkFn);
----------------
Can you create the function with linkonce_odr instead of setting it later?

Also, I think if the class type has internal linkage we need to make the thunk internal, or the thunk name could collide with a thunk from a different TU.  I don't think the language allows you to compare them, but internal is always stronger than linkonce_odr for optimizers, so it's good to apply it when possible.

IMO the right thing is:

  llvm::GlobalValue::LinkageType L = MD->isExternallyVisible()
                                         ? llvm::GlobalValue::LinkOnceODRLinkage
                                         : llvm::GlobalValue::InternalLinkage;



http://llvm-reviews.chandlerc.com/D2104



More information about the cfe-commits mailing list