Home | History | Annotate | Download | only in CodeGen
      1 //===--- MicrosoftCXXABI.cpp - Emit LLVM Code from ASTs for a Module ------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This provides C++ code generation targeting the Microsoft Visual C++ ABI.
     11 // The class in this file generates structures that follow the Microsoft
     12 // Visual C++ ABI, which is actually not very well documented at all outside
     13 // of Microsoft.
     14 //
     15 //===----------------------------------------------------------------------===//
     16 
     17 #include "CGCXXABI.h"
     18 #include "CodeGenModule.h"
     19 #include "clang/AST/Decl.h"
     20 #include "clang/AST/DeclCXX.h"
     21 
     22 using namespace clang;
     23 using namespace CodeGen;
     24 
     25 namespace {
     26 
     27 class MicrosoftCXXABI : public CGCXXABI {
     28 public:
     29   MicrosoftCXXABI(CodeGenModule &CGM) : CGCXXABI(CGM) {}
     30 
     31   void BuildConstructorSignature(const CXXConstructorDecl *Ctor,
     32                                  CXXCtorType Type,
     33                                  CanQualType &ResTy,
     34                                  SmallVectorImpl<CanQualType> &ArgTys) {
     35     // 'this' is already in place
     36     // TODO: 'for base' flag
     37   }
     38 
     39   void BuildDestructorSignature(const CXXDestructorDecl *Ctor,
     40                                 CXXDtorType Type,
     41                                 CanQualType &ResTy,
     42                                 SmallVectorImpl<CanQualType> &ArgTys) {
     43     // 'this' is already in place
     44     // TODO: 'for base' flag
     45   }
     46 
     47   void BuildInstanceFunctionParams(CodeGenFunction &CGF,
     48                                    QualType &ResTy,
     49                                    FunctionArgList &Params) {
     50     BuildThisParam(CGF, Params);
     51     // TODO: 'for base' flag
     52   }
     53 
     54   void EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
     55     EmitThisParam(CGF);
     56     // TODO: 'for base' flag
     57   }
     58 
     59   // ==== Notes on array cookies =========
     60   //
     61   // MSVC seems to only use cookies when the class has a destructor; a
     62   // two-argument usual array deallocation function isn't sufficient.
     63   //
     64   // For example, this code prints "100" and "1":
     65   //   struct A {
     66   //     char x;
     67   //     void *operator new[](size_t sz) {
     68   //       printf("%u\n", sz);
     69   //       return malloc(sz);
     70   //     }
     71   //     void operator delete[](void *p, size_t sz) {
     72   //       printf("%u\n", sz);
     73   //       free(p);
     74   //     }
     75   //   };
     76   //   int main() {
     77   //     A *p = new A[100];
     78   //     delete[] p;
     79   //   }
     80   // Whereas it prints "104" and "104" if you give A a destructor.
     81   void ReadArrayCookie(CodeGenFunction &CGF, llvm::Value *Ptr,
     82                        const CXXDeleteExpr *expr,
     83                        QualType ElementType, llvm::Value *&NumElements,
     84                        llvm::Value *&AllocPtr, CharUnits &CookieSize) {
     85     CGF.CGM.ErrorUnsupported(expr, "don't know how to handle array cookies "
     86                                    "in the Microsoft C++ ABI");
     87   }
     88 };
     89 
     90 }
     91 
     92 CGCXXABI *clang::CodeGen::CreateMicrosoftCXXABI(CodeGenModule &CGM) {
     93   return new MicrosoftCXXABI(CGM);
     94 }
     95 
     96