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