diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2014-11-24 09:15:30 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2014-11-24 09:15:30 +0000 |
commit | 9f4dbff6669c8037f3b036bcf580d14f1a4f12a5 (patch) | |
tree | 47df2c12b57214af6c31e47404b005675b8b7ffc /lib/AST/ItaniumCXXABI.cpp | |
parent | f73d5f23a889b93d89ddef61ac0995df40286bb8 (diff) | |
download | src-9f4dbff6669c8037f3b036bcf580d14f1a4f12a5.tar.gz src-9f4dbff6669c8037f3b036bcf580d14f1a4f12a5.zip |
Vendor import of clang RELEASE_350/final tag r216957 (effectively, 3.5.0 release):vendor/clang/clang-release_350-r216957
Notes
Notes:
svn path=/vendor/clang/dist/; revision=274958
svn path=/vendor/clang/clang-release_350-r216957/; revision=274959; tag=vendor/clang/clang-release_350-r216957
Diffstat (limited to 'lib/AST/ItaniumCXXABI.cpp')
-rw-r--r-- | lib/AST/ItaniumCXXABI.cpp | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/lib/AST/ItaniumCXXABI.cpp b/lib/AST/ItaniumCXXABI.cpp index 578466028ce8..b5f8c0f4bc87 100644 --- a/lib/AST/ItaniumCXXABI.cpp +++ b/lib/AST/ItaniumCXXABI.cpp @@ -33,12 +33,17 @@ namespace { /// literals within a particular context. class ItaniumNumberingContext : public MangleNumberingContext { llvm::DenseMap<IdentifierInfo*, unsigned> VarManglingNumbers; + llvm::DenseMap<IdentifierInfo*, unsigned> TagManglingNumbers; public: /// Variable decls are numbered by identifier. - virtual unsigned getManglingNumber(const VarDecl *VD) { + unsigned getManglingNumber(const VarDecl *VD, unsigned) override { return ++VarManglingNumbers[VD->getIdentifier()]; } + + unsigned getManglingNumber(const TagDecl *TD, unsigned) override { + return ++TagManglingNumbers[TD->getIdentifier()]; + } }; class ItaniumCXXABI : public CXXABI { @@ -48,7 +53,7 @@ public: ItaniumCXXABI(ASTContext &Ctx) : Context(Ctx) { } std::pair<uint64_t, unsigned> - getMemberPointerWidthAndAlign(const MemberPointerType *MPT) const { + getMemberPointerWidthAndAlign(const MemberPointerType *MPT) const override { const TargetInfo &Target = Context.getTargetInfo(); TargetInfo::IntType PtrDiff = Target.getPtrDiffType(0); uint64_t Width = Target.getTypeWidth(PtrDiff); @@ -58,13 +63,17 @@ public: return std::make_pair(Width, Align); } - CallingConv getDefaultMethodCallConv(bool isVariadic) const { + CallingConv getDefaultMethodCallConv(bool isVariadic) const override { + const llvm::Triple &T = Context.getTargetInfo().getTriple(); + if (!isVariadic && T.isWindowsGNUEnvironment() && + T.getArch() == llvm::Triple::x86) + return CC_X86ThisCall; return CC_C; } // We cheat and just check that the class has a vtable pointer, and that it's // only big enough to have a vtable pointer and nothing more (or less). - bool isNearlyEmpty(const CXXRecordDecl *RD) const { + bool isNearlyEmpty(const CXXRecordDecl *RD) const override { // Check that the class has a vtable pointer. if (!RD->isDynamicClass()) @@ -76,21 +85,12 @@ public: return Layout.getNonVirtualSize() == PointerSize; } - virtual MangleNumberingContext *createMangleNumberingContext() const { + MangleNumberingContext *createMangleNumberingContext() const override { return new ItaniumNumberingContext(); } }; - -class ARMCXXABI : public ItaniumCXXABI { -public: - ARMCXXABI(ASTContext &Ctx) : ItaniumCXXABI(Ctx) { } -}; } CXXABI *clang::CreateItaniumCXXABI(ASTContext &Ctx) { return new ItaniumCXXABI(Ctx); } - -CXXABI *clang::CreateARMCXXABI(ASTContext &Ctx) { - return new ARMCXXABI(Ctx); -} |