12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- //===--- MicrosoftCXXABI.cpp - Emit LLVM Code from ASTs for a Module ------===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- //
- // This provides C++ code generation targeting the Microsoft Visual C++ ABI.
- // The class in this file generates structures that follow the Microsoft
- // Visual C++ ABI, which is actually not very well documented at all outside
- // of Microsoft.
- //
- //===----------------------------------------------------------------------===//
- #include "CGCXXABI.h"
- #include "CodeGenModule.h"
- #include "clang/AST/Decl.h"
- #include "clang/AST/DeclCXX.h"
- using namespace clang;
- using namespace CodeGen;
- namespace {
- class MicrosoftCXXABI : public CGCXXABI {
- public:
- MicrosoftCXXABI(CodeGenModule &CGM) : CGCXXABI(CGM) {}
- void BuildConstructorSignature(const CXXConstructorDecl *Ctor,
- CXXCtorType Type,
- CanQualType &ResTy,
- SmallVectorImpl<CanQualType> &ArgTys) {
- // 'this' is already in place
- // TODO: 'for base' flag
- }
- void BuildDestructorSignature(const CXXDestructorDecl *Ctor,
- CXXDtorType Type,
- CanQualType &ResTy,
- SmallVectorImpl<CanQualType> &ArgTys) {
- // 'this' is already in place
- // TODO: 'for base' flag
- }
- void BuildInstanceFunctionParams(CodeGenFunction &CGF,
- QualType &ResTy,
- FunctionArgList &Params) {
- BuildThisParam(CGF, Params);
- // TODO: 'for base' flag
- }
- void EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
- EmitThisParam(CGF);
- // TODO: 'for base' flag
- }
- // ==== Notes on array cookies =========
- //
- // MSVC seems to only use cookies when the class has a destructor; a
- // two-argument usual array deallocation function isn't sufficient.
- //
- // For example, this code prints "100" and "1":
- // struct A {
- // char x;
- // void *operator new[](size_t sz) {
- // printf("%u\n", sz);
- // return malloc(sz);
- // }
- // void operator delete[](void *p, size_t sz) {
- // printf("%u\n", sz);
- // free(p);
- // }
- // };
- // int main() {
- // A *p = new A[100];
- // delete[] p;
- // }
- // Whereas it prints "104" and "104" if you give A a destructor.
- };
- }
- CGCXXABI *clang::CodeGen::CreateMicrosoftCXXABI(CodeGenModule &CGM) {
- return new MicrosoftCXXABI(CGM);
- }
|