[compiler-rt] [llvm] [Asan] Add "funclet" OpBundle to generated runtime calls if required by EH personality (PR #82533)
Reid Kleckner via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 21 13:10:55 PST 2024
================
@@ -642,6 +643,70 @@ static uint64_t GetCtorAndDtorPriority(Triple &TargetTriple) {
}
namespace {
+/// Helper RAII class to keep track of the inserted asan runtime calls during a
+/// pass on a single Function. Upon end of scope, detects and applies the
+/// required funclet OpBundle.
+class RuntimeCallInserter {
+ Function *OwnerFn = nullptr;
+ bool TrackInsertedCalls = false;
+ std::vector<CallInst *> InsertedCalls;
+
+public:
+ RuntimeCallInserter(Function &Fn) : OwnerFn(&Fn) {
+ if (Fn.hasPersonalityFn()) {
+ auto Personality = classifyEHPersonality(Fn.getPersonalityFn());
+ if (isScopedEHPersonality(Personality))
+ TrackInsertedCalls = true;
+ }
+ }
+
+ ~RuntimeCallInserter() {
+ if (!TrackInsertedCalls || InsertedCalls.empty())
+ return;
+
+ DenseMap<BasicBlock *, ColorVector> BlockColors = colorEHFunclets(*OwnerFn);
+ for (CallInst *CI : InsertedCalls) {
+ BasicBlock *BB = CI->getParent();
+ assert(BB && "Instruction doesn't belong to a BasicBlock");
+ assert(BB->getParent() == OwnerFn &&
+ "Instruction doesn't belong to the expected Function!");
+
+ ColorVector &Colors = BlockColors[BB];
+ // funclet opbundles are only valid in monochromatic BBs.
+ // Note that unreachable BBs are seen as colorless by colorEHFunclets()
+ // and will be DCE'ed later.
+ if (Colors.size() != 1) {
+ OwnerFn->getContext().emitError(
----------------
rnk wrote:
Seems like a reasonable strategy. It's a little janky, but probably less user hostile than the current emergent behavior.
https://github.com/llvm/llvm-project/pull/82533
More information about the llvm-commits
mailing list