forked from OSchip/llvm-project
[DFSan] Handle landingpad inst explicitly as zero shadow.
Before this change, DFSan was relying fallback cases when getting origin address. Differential Revision: https://reviews.llvm.org/D104266
This commit is contained in:
parent
4f194d0db7
commit
af93157625
|
@ -721,6 +721,7 @@ public:
|
||||||
void visitBitCastInst(BitCastInst &BCI);
|
void visitBitCastInst(BitCastInst &BCI);
|
||||||
void visitCastInst(CastInst &CI);
|
void visitCastInst(CastInst &CI);
|
||||||
void visitCmpInst(CmpInst &CI);
|
void visitCmpInst(CmpInst &CI);
|
||||||
|
void visitLandingPadInst(LandingPadInst &LPI);
|
||||||
void visitGetElementPtrInst(GetElementPtrInst &GEPI);
|
void visitGetElementPtrInst(GetElementPtrInst &GEPI);
|
||||||
void visitLoadInst(LoadInst &LI);
|
void visitLoadInst(LoadInst &LI);
|
||||||
void visitStoreInst(StoreInst &SI);
|
void visitStoreInst(StoreInst &SI);
|
||||||
|
@ -2561,6 +2562,22 @@ void DFSanVisitor::visitCmpInst(CmpInst &CI) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DFSanVisitor::visitLandingPadInst(LandingPadInst &LPI) {
|
||||||
|
// We do not need to track data through LandingPadInst.
|
||||||
|
//
|
||||||
|
// For the C++ exceptions, if a value is thrown, this value will be stored
|
||||||
|
// in a memory location provided by __cxa_allocate_exception(...) (on the
|
||||||
|
// throw side) or __cxa_begin_catch(...) (on the catch side).
|
||||||
|
// This memory will have a shadow, so with the loads and stores we will be
|
||||||
|
// able to propagate labels on data thrown through exceptions, without any
|
||||||
|
// special handling of the LandingPadInst.
|
||||||
|
//
|
||||||
|
// The second element in the pair result of the LandingPadInst is a
|
||||||
|
// register value, but it is for a type ID and should never be tainted.
|
||||||
|
DFSF.setShadow(&LPI, DFSF.DFS.getZeroShadow(&LPI));
|
||||||
|
DFSF.setOrigin(&LPI, DFSF.DFS.ZeroOrigin);
|
||||||
|
}
|
||||||
|
|
||||||
void DFSanVisitor::visitGetElementPtrInst(GetElementPtrInst &GEPI) {
|
void DFSanVisitor::visitGetElementPtrInst(GetElementPtrInst &GEPI) {
|
||||||
if (ClCombineOffsetLabelsOnGEP) {
|
if (ClCombineOffsetLabelsOnGEP) {
|
||||||
visitInstOperands(GEPI);
|
visitInstOperands(GEPI);
|
||||||
|
|
|
@ -48,7 +48,7 @@ lpad:
|
||||||
catch i8* null
|
catch i8* null
|
||||||
%1 = extractvalue { i8*, i32 } %0, 0
|
%1 = extractvalue { i8*, i32 } %0, 0
|
||||||
|
|
||||||
; CHECK: store {{.*}} @__dfsan_arg_tls
|
; CHECK: store i8 0,{{.*}} @__dfsan_arg_tls
|
||||||
; CHECK: call {{.*}} @"dfs$__cxa_begin_catch"
|
; CHECK: call {{.*}} @"dfs$__cxa_begin_catch"
|
||||||
; CHECK: load {{.*}} @__dfsan_retval_tls
|
; CHECK: load {{.*}} @__dfsan_retval_tls
|
||||||
%2 = tail call i8* @__cxa_begin_catch(i8* %1)
|
%2 = tail call i8* @__cxa_begin_catch(i8* %1)
|
||||||
|
|
Loading…
Reference in New Issue