forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[tsan] Add support for C++ exceptions into TSan (call __tsan_func_exi…
…t during unwinding), LLVM part This adds support for TSan C++ exception handling, where we need to add extra calls to __tsan_func_exit when a function is exitted via exception mechanisms. Otherwise the shadow stack gets corrupted (leaked). This patch moves and enhances the existing implementation of EscapeEnumerator that finds all possible function exit points, and adds extra EH cleanup blocks where needed. Differential Revision: https://reviews.llvm.org/D26177 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286893 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
1 parent
4da3d72
commit d84b0f9
Showing
14 changed files
with
322 additions
and
187 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
//===-- EscapeEnumerator.h --------------------------------------*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// Defines a helper class that enumerates all possible exits from a function, | ||
// including exception handling. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_TRANSFORMS_UTILS_ESCAPEENUMERATOR_H | ||
#define LLVM_TRANSFORMS_UTILS_ESCAPEENUMERATOR_H | ||
|
||
#include "llvm/IR/IRBuilder.h" | ||
#include "llvm/IR/Function.h" | ||
|
||
namespace llvm { | ||
|
||
/// EscapeEnumerator - This is a little algorithm to find all escape points | ||
/// from a function so that "finally"-style code can be inserted. In addition | ||
/// to finding the existing return and unwind instructions, it also (if | ||
/// necessary) transforms any call instructions into invokes and sends them to | ||
/// a landing pad. | ||
class EscapeEnumerator { | ||
Function &F; | ||
const char *CleanupBBName; | ||
|
||
Function::iterator StateBB, StateE; | ||
IRBuilder<> Builder; | ||
bool Done; | ||
bool HandleExceptions; | ||
|
||
public: | ||
EscapeEnumerator(Function &F, const char *N = "cleanup", | ||
bool HandleExceptions = true) | ||
: F(F), CleanupBBName(N), StateBB(F.begin()), StateE(F.end()), | ||
Builder(F.getContext()), Done(false), | ||
HandleExceptions(HandleExceptions) {} | ||
|
||
IRBuilder<> *Next(); | ||
}; | ||
|
||
} | ||
|
||
#endif // LLVM_TRANSFORMS_UTILS_ESCAPEENUMERATOR_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.