]> granicus.if.org Git - clang/commitdiff
Add support for thunking dtors. Oh why does this make my head hurt?
authorMike Stump <mrs@apple.com>
Thu, 3 Dec 2009 03:47:56 +0000 (03:47 +0000)
committerMike Stump <mrs@apple.com>
Thu, 3 Dec 2009 03:47:56 +0000 (03:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90409 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCXX.cpp
lib/CodeGen/CGVtable.cpp
lib/CodeGen/CodeGenFunction.h
lib/CodeGen/CodeGenModule.h

index a575dbc463056beafaa1903c4f228a83c10e4f8f..2fa13eb12d043b0652fc7e37632328be7ecefcbc 100644 (file)
@@ -829,10 +829,10 @@ const char *CodeGenModule::getMangledCXXDtorName(const CXXDestructorDecl *D,
 }
 
 llvm::Constant *
-CodeGenFunction::GenerateThunk(llvm::Function *Fn, const CXXMethodDecl *MD,
+CodeGenFunction::GenerateThunk(llvm::Function *Fn, const GlobalDecl &GD,
                                bool Extern, 
                                const ThunkAdjustment &ThisAdjustment) {
-  return GenerateCovariantThunk(Fn, MD, Extern, 
+  return GenerateCovariantThunk(Fn, GD, Extern,
                                 CovariantThunkAdjustment(ThisAdjustment,
                                                          ThunkAdjustment()));
 }
@@ -875,8 +875,10 @@ CodeGenFunction::DynamicTypeAdjust(llvm::Value *V,
 
 llvm::Constant *
 CodeGenFunction::GenerateCovariantThunk(llvm::Function *Fn,
-                                   const CXXMethodDecl *MD, bool Extern,
+                                   const GlobalDecl &GD, bool Extern,
                                    const CovariantThunkAdjustment &Adjustment) {
+  
+  const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
   QualType ResultType = MD->getType()->getAs<FunctionType>()->getResultType();
 
   FunctionArgList Args;
@@ -906,7 +908,12 @@ CodeGenFunction::GenerateCovariantThunk(llvm::Function *Fn,
   const llvm::Type *Ty =
     CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD),
                                    FPT->isVariadic());
-  llvm::Value *Callee = CGM.GetAddrOfFunction(MD, Ty);
+  llvm::Value *Callee;
+  if (const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(MD))
+    Callee = CGM.GetAddrOfCXXDestructor(Dtor, GD.getDtorType());
+  else
+    Callee = CGM.GetAddrOfFunction(MD, Ty);
+
   CallArgList CallArgs;
 
   bool ShouldAdjustReturnPointer = true;
@@ -922,7 +929,7 @@ CodeGenFunction::GenerateCovariantThunk(llvm::Function *Fn,
         CovariantThunkAdjustment(ThunkAdjustment(),
                                  Adjustment.ReturnAdjustment);
       
-      Callee = CGM.BuildCovariantThunk(MD, Extern, ReturnAdjustment);
+      Callee = CGM.BuildCovariantThunk(GD, Extern, ReturnAdjustment);
       
       Callee = Builder.CreateBitCast(Callee, OrigTy);
       ShouldAdjustReturnPointer = false;
@@ -983,11 +990,15 @@ CodeGenFunction::GenerateCovariantThunk(llvm::Function *Fn,
 }
 
 llvm::Constant *
-CodeGenModule::BuildThunk(const CXXMethodDecl *MD, bool Extern,
+CodeGenModule::BuildThunk(const GlobalDecl &GD, bool Extern,
                           const ThunkAdjustment &ThisAdjustment) {
-  
+  const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
   llvm::SmallString<256> OutName;
-  getMangleContext().mangleThunk(MD, ThisAdjustment, OutName);
+  if (const CXXDestructorDecl *D = dyn_cast<CXXDestructorDecl>(MD)) {
+    getMangleContext().mangleCXXDtorThunk(D, GD.getDtorType(), ThisAdjustment,
+                                          OutName);
+  } else 
+    getMangleContext().mangleThunk(MD, ThisAdjustment, OutName);
   
   llvm::GlobalVariable::LinkageTypes linktype;
   linktype = llvm::GlobalValue::WeakAnyLinkage;
@@ -1001,14 +1012,15 @@ CodeGenModule::BuildThunk(const CXXMethodDecl *MD, bool Extern,
 
   llvm::Function *Fn = llvm::Function::Create(FTy, linktype, OutName.str(),
                                               &getModule());
-  CodeGenFunction(*this).GenerateThunk(Fn, MD, Extern, ThisAdjustment);
+  CodeGenFunction(*this).GenerateThunk(Fn, GD, Extern, ThisAdjustment);
   llvm::Constant *m = llvm::ConstantExpr::getBitCast(Fn, Ptr8Ty);
   return m;
 }
 
 llvm::Constant *
-CodeGenModule::BuildCovariantThunk(const CXXMethodDecl *MD, bool Extern,
+CodeGenModule::BuildCovariantThunk(const GlobalDecl &GD, bool Extern,
                                    const CovariantThunkAdjustment &Adjustment) {
+  const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
   llvm::SmallString<256> OutName;
   getMangleContext().mangleCovariantThunk(MD, Adjustment, OutName);
   llvm::GlobalVariable::LinkageTypes linktype;
index 007960e9983f36f8f27689ea38f7e225e59889a1..aefe4cc08821bfdb7e68bb5a498e18e561e565ea 100644 (file)
@@ -303,7 +303,7 @@ public:
 
       assert(Index == VtableBuilder::Index[GD] && "Thunk index mismatch!");
              
-      submethods[Index] = CGM.BuildThunk(MD, Extern, Thunk.Adjustment);
+      submethods[Index] = CGM.BuildThunk(GD, Extern, Thunk.Adjustment);
     }
     Thunks.clear();
 
index a7d28e544ea8b396c2e24b43addae42c6e6750ba..43c968bb1334ddad51e3923f4384b35cea495751 100644 (file)
@@ -452,11 +452,11 @@ public:
                                  const ThunkAdjustment &Adjustment);
 
   /// GenerateThunk - Generate a thunk for the given method
-  llvm::Constant *GenerateThunk(llvm::Function *Fn, const CXXMethodDecl *MD,
+  llvm::Constant *GenerateThunk(llvm::Function *Fn, const GlobalDecl &GD,
                                 bool Extern, 
                                 const ThunkAdjustment &ThisAdjustment);
   llvm::Constant *
-  GenerateCovariantThunk(llvm::Function *Fn, const CXXMethodDecl *MD, 
+  GenerateCovariantThunk(llvm::Function *Fn, const GlobalDecl &GD, 
                          bool Extern,
                          const CovariantThunkAdjustment &Adjustment);
 
index 974657091765547350db8029b40f121032a5b392..dbe9c95bf9d29526d4887a7c1c5971c2b76b1491 100644 (file)
@@ -234,12 +234,12 @@ public:
   llvm::Constant *GenerateRTTI(QualType Ty);
   
   /// BuildThunk - Build a thunk for the given method.
-  llvm::Constant *BuildThunk(const CXXMethodDecl *MD, bool Extern, 
+  llvm::Constant *BuildThunk(const GlobalDecl &GD, bool Extern, 
                              const ThunkAdjustment &ThisAdjustment);
 
   /// BuildCoVariantThunk - Build a thunk for the given method
   llvm::Constant *
-  BuildCovariantThunk(const CXXMethodDecl *MD, bool Extern,
+  BuildCovariantThunk(const GlobalDecl &GD, bool Extern,
                       const CovariantThunkAdjustment &Adjustment);
 
   typedef std::pair<const CXXRecordDecl *, uint64_t> CtorVtable_t;