llvm::Attribute::AlwaysInline);
// Disable inlining inside SEH __try blocks.
- if (IsSEHTryScope)
+ if (isSEHTryScope())
Attrs =
Attrs.addAttribute(getLLVMContext(), llvm::AttributeSet::FunctionIndex,
llvm::Attribute::NoInline);
#include "clang/AST/StmtObjC.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/Intrinsics.h"
-#include "llvm/Support/SaveAndRestore.h"
using namespace clang;
using namespace CodeGen;
EnterSEHTryStmt(S, FI);
{
JumpDest TryExit = getJumpDestInCurrentScope("__try.__leave");
- SEHTryEpilogueStack.push_back(&TryExit);
- // Disable inlining inside SEH __try scopes.
- SaveAndRestore<bool> Saver(IsSEHTryScope, true);
+ SEHTryEpilogueStack.push_back(&TryExit);
EmitStmt(S.getTryBlock());
+ SEHTryEpilogueStack.pop_back();
if (!TryExit.getBlock()->use_empty())
EmitBlock(TryExit.getBlock(), /*IsFinished=*/true);
else
delete TryExit.getBlock();
- SEHTryEpilogueStack.pop_back();
}
ExitSEHTryStmt(S, FI);
}
CurFn(nullptr), CapturedStmtInfo(nullptr),
SanOpts(CGM.getLangOpts().Sanitize), IsSanitizerScope(false),
CurFuncIsThunk(false), AutoreleaseResult(false), SawAsmBlock(false),
- IsSEHTryScope(false), BlockInfo(nullptr), BlockPointer(nullptr),
+ BlockInfo(nullptr), BlockPointer(nullptr),
LambdaThisCaptureField(nullptr), NormalCleanupDest(nullptr),
NextCleanupDestIndex(1), FirstBlockInfo(nullptr), EHResumeBlock(nullptr),
ExceptionSlot(nullptr), EHSelectorSlot(nullptr),
/// potentially set the return value.
bool SawAsmBlock;
- /// Codegen is currently inside an SEH try block.
- bool IsSEHTryScope;
-
const CodeGen::CGBlockInfo *BlockInfo;
llvm::Value *BlockPointer;
llvm::BasicBlock *ResumeBB;
};
+ /// Returns true inside SEH __try blocks.
+ bool isSEHTryScope() const { return !SEHTryEpilogueStack.empty(); }
+
/// pushFullExprCleanup - Push a cleanup to be run at the end of the
/// current full-expression. Safe against the possibility that
/// we're currently inside a conditionally-evaluated expression.