mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-03 19:32:35 +00:00
SEH: Emit the constant filter 1 as a catch-all
Minor optimization of code like __try { ... } __except(1) { ... }. llvm-svn: 226766
This commit is contained in:
parent
f1f4bc2176
commit
2a2e156318
@ -1839,6 +1839,18 @@ void CodeGenFunction::EnterSEHTryStmt(const SEHTryStmt &S) {
|
||||
SEHExceptStmt *Except = S.getExceptHandler();
|
||||
assert(Except);
|
||||
EHCatchScope *CatchScope = EHStack.pushCatch(1);
|
||||
|
||||
// If the filter is known to evaluate to 1, then we can use the clause "catch
|
||||
// i8* null".
|
||||
llvm::Constant *C =
|
||||
CGM.EmitConstantExpr(Except->getFilterExpr(), getContext().IntTy, this);
|
||||
if (C && C->isOneValue()) {
|
||||
CatchScope->setCatchAllHandler(0, createBasicBlock("__except"));
|
||||
return;
|
||||
}
|
||||
|
||||
// In general, we have to emit an outlined filter function. Use the function
|
||||
// in place of the RTTI typeinfo global that C++ EH uses.
|
||||
CodeGenFunction FilterCGF(CGM, /*suppressNewContext=*/true);
|
||||
llvm::Function *FilterFunc =
|
||||
FilterCGF.GenerateSEHFilterFunction(*this, *Except);
|
||||
|
@ -26,13 +26,11 @@ int safe_div(int numerator, int denominator, int *res) {
|
||||
//
|
||||
// CHECK: [[lpad]]
|
||||
// CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*)
|
||||
// CHECK: %[[sel:[^ ]*]] = load i32*
|
||||
// CHECK: %[[filt_id:[^ ]*]] = call i32 @llvm.eh.typeid.for(i8* bitcast (i32 (i8*, i8*)* @"\01?filt$0@0@safe_div@@" to i8*))
|
||||
// CHECK: %[[matches:[^ ]*]] = icmp eq i32 %[[sel]], %[[filt_id]]
|
||||
// CHECK: br i1 %[[matches]], label %[[except_bb:[^ ]*]], label %{{.*}}
|
||||
//
|
||||
// CHECK: [[except_bb]]
|
||||
// CHECK: store i32 -42, i32* %[[success:[^ ]*]]
|
||||
// CHECK-NEXT: catch i8* null
|
||||
// CHECK-NOT: br i1
|
||||
// CHECK: br label %[[except:[^ ]*]]
|
||||
// CHECK: [[except]]
|
||||
// CHECK-NEXT: store i32 -42, i32* %[[success:[^ ]*]]
|
||||
//
|
||||
// CHECK: %[[res:[^ ]*]] = load i32* %[[success]]
|
||||
// CHECK: ret i32 %[[res]]
|
||||
|
Loading…
Reference in New Issue
Block a user