diff options
| author | Reid Kleckner <reid@kleckner.net> | 2014-07-25 21:39:46 +0000 | 
|---|---|---|
| committer | Reid Kleckner <reid@kleckner.net> | 2014-07-25 21:39:46 +0000 | 
| commit | 19819446eb29883725e579167243b30df4eb46c0 (patch) | |
| tree | 2c8d59d799e30651da6b194e6c369eb32aa7bf37 /clang/lib/CodeGen | |
| parent | a822d94f577ce495704a781999b5ce1d259f80dc (diff) | |
| download | bcm5719-llvm-19819446eb29883725e579167243b30df4eb46c0.tar.gz bcm5719-llvm-19819446eb29883725e579167243b30df4eb46c0.zip  | |
MS ABI: Don't push destructor cleanups for aggregate parameters in thunks
The target method of the thunk will perform the cleanup.  This can't be
tested in 32-bit x86 yet because passing something by value would create
an inalloca, and we refuse to generate broken code for that.
llvm-svn: 213976
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/CGDecl.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGVTables.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 20 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.h | 4 | 
4 files changed, 18 insertions, 11 deletions
diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp index 91f80419304..b42a44342c4 100644 --- a/clang/lib/CodeGen/CGDecl.cpp +++ b/clang/lib/CodeGen/CGDecl.cpp @@ -1656,7 +1656,9 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg,      DeclPtr = Arg->getType() == IRTy ? Arg : Builder.CreateBitCast(Arg, IRTy,                                                                     D.getName());      // Push a destructor cleanup for this parameter if the ABI requires it. -    if (!IsScalar && +    // Don't push a cleanup in a thunk for a method that will also emit a +    // cleanup. +    if (!IsScalar && !CurFuncIsThunk &&          getTarget().getCXXABI().areArgsDestroyedLeftToRightInCallee()) {        const CXXRecordDecl *RD = Ty->getAsCXXRecordDecl();        if (RD && RD->hasNonTrivialDestructor()) diff --git a/clang/lib/CodeGen/CGVTables.cpp b/clang/lib/CodeGen/CGVTables.cpp index 0df2c43d11b..c53e7ed33d4 100644 --- a/clang/lib/CodeGen/CGVTables.cpp +++ b/clang/lib/CodeGen/CGVTables.cpp @@ -194,6 +194,7 @@ void CodeGenFunction::StartThunk(llvm::Function *Fn, GlobalDecl GD,                                   const CGFunctionInfo &FnInfo) {    assert(!CurGD.getDecl() && "CurGD was already set!");    CurGD = GD; +  CurFuncIsThunk = true;    // Build FunctionArgs.    const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 5ca3a78bb4f..67eae450e8c 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -38,16 +38,16 @@ CodeGenFunction::CodeGenFunction(CodeGenModule &cgm, bool suppressNewContext)        Builder(cgm.getModule().getContext(), llvm::ConstantFolder(),                CGBuilderInserterTy(this)),        CapturedStmtInfo(nullptr), SanOpts(&CGM.getLangOpts().Sanitize), -      IsSanitizerScope(false), AutoreleaseResult(false), BlockInfo(nullptr), -      BlockPointer(nullptr), LambdaThisCaptureField(nullptr), -      NormalCleanupDest(nullptr), NextCleanupDestIndex(1), -      FirstBlockInfo(nullptr), EHResumeBlock(nullptr), ExceptionSlot(nullptr), -      EHSelectorSlot(nullptr), DebugInfo(CGM.getModuleDebugInfo()), -      DisableDebugInfo(false), DidCallStackSave(false), IndirectBranch(nullptr), -      PGO(cgm), SwitchInsn(nullptr), SwitchWeights(nullptr), -      CaseRangeBlock(nullptr), UnreachableBlock(nullptr), NumReturnExprs(0), -      NumSimpleReturnExprs(0), CXXABIThisDecl(nullptr), -      CXXABIThisValue(nullptr), CXXThisValue(nullptr), +      IsSanitizerScope(false), CurFuncIsThunk(false), AutoreleaseResult(false), +      BlockInfo(nullptr), BlockPointer(nullptr), +      LambdaThisCaptureField(nullptr), NormalCleanupDest(nullptr), +      NextCleanupDestIndex(1), FirstBlockInfo(nullptr), EHResumeBlock(nullptr), +      ExceptionSlot(nullptr), EHSelectorSlot(nullptr), +      DebugInfo(CGM.getModuleDebugInfo()), DisableDebugInfo(false), +      DidCallStackSave(false), IndirectBranch(nullptr), PGO(cgm), +      SwitchInsn(nullptr), SwitchWeights(nullptr), CaseRangeBlock(nullptr), +      UnreachableBlock(nullptr), NumReturnExprs(0), NumSimpleReturnExprs(0), +      CXXABIThisDecl(nullptr), CXXABIThisValue(nullptr), CXXThisValue(nullptr),        CXXDefaultInitExprThis(nullptr), CXXStructorImplicitParamDecl(nullptr),        CXXStructorImplicitParamValue(nullptr), OutermostConditional(nullptr),        CurLexicalScope(nullptr), TerminateLandingPad(nullptr), diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 335a8910e82..ccf7651fdcc 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -258,6 +258,10 @@ public:      ~SanitizerScope();    }; +  /// In C++, whether we are code generating a thunk.  This controls whether we +  /// should emit cleanups. +  bool CurFuncIsThunk; +    /// In ARC, whether we should autorelease the return value.    bool AutoreleaseResult;  | 

