forked from OSchip/llvm-project
The exception handling intrinsics return values,
so must be lowered to a value, not nothing at all. Subtle point: I made eh_selector return 0 and eh_typeid_for return 1. This means that only cleanups (destructors) will be run as the exception unwinds [if eh_typeid_for returned 0 then it would be as if the first catch always matched, and the corresponding handler would be run], which is probably want you want in the CBE. llvm-svn: 37947
This commit is contained in:
parent
71ed4aaa31
commit
9d97420473
|
@ -706,9 +706,17 @@ void IntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
|
|||
case Intrinsic::dbg_region_end:
|
||||
case Intrinsic::dbg_func_start:
|
||||
case Intrinsic::dbg_declare:
|
||||
break; // Simply strip out debugging intrinsics
|
||||
|
||||
case Intrinsic::eh_exception:
|
||||
case Intrinsic::eh_selector:
|
||||
break; // Simply strip out debugging and eh intrinsics
|
||||
CI->replaceAllUsesWith(Constant::getNullValue(CI->getType()));
|
||||
break;
|
||||
|
||||
case Intrinsic::eh_typeid_for:
|
||||
// Return something different to eh_selector.
|
||||
CI->replaceAllUsesWith(ConstantInt::get(CI->getType(), 1));
|
||||
break;
|
||||
|
||||
case Intrinsic::var_annotation:
|
||||
break; // Strip out annotate intrinsic
|
||||
|
|
|
@ -2716,7 +2716,8 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
|
|||
unsigned TypeID = MMI->getTypeIDFor(GV);
|
||||
setValue(&I, DAG.getConstant(TypeID, MVT::i32));
|
||||
} else {
|
||||
setValue(&I, DAG.getConstant(0, MVT::i32));
|
||||
// Return something different to eh_selector.
|
||||
setValue(&I, DAG.getConstant(1, MVT::i32));
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue