62 lines
2.0 KiB
C++
62 lines
2.0 KiB
C++
//===------- SEHFrameSupport.h - JITLink seh-frame utils --------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// SEHFrame utils for JITLink.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_EXECUTIONENGINE_JITLINK_SEHFRAMESUPPORT_H
|
|
#define LLVM_EXECUTIONENGINE_JITLINK_SEHFRAMESUPPORT_H
|
|
|
|
#include "llvm/ADT/Triple.h"
|
|
#include "llvm/ExecutionEngine/JITLink/JITLink.h"
|
|
#include "llvm/ExecutionEngine/JITSymbol.h"
|
|
#include "llvm/Support/Error.h"
|
|
|
|
namespace llvm {
|
|
namespace jitlink {
|
|
/// This pass adds keep-alive edge from SEH frame sections
|
|
/// to the parent function content block.
|
|
class SEHFrameKeepAlivePass {
|
|
public:
|
|
SEHFrameKeepAlivePass(StringRef SEHFrameSectionName)
|
|
: SEHFrameSectionName(SEHFrameSectionName) {}
|
|
|
|
Error operator()(LinkGraph &G) {
|
|
auto *S = G.findSectionByName(SEHFrameSectionName);
|
|
if (!S)
|
|
return Error::success();
|
|
|
|
// Simply consider every block pointed by seh frame block as parants.
|
|
// This adds some unnecessary keep-alive edges to unwind info blocks,
|
|
// (xdata) but these blocks are usually dead by default, so they wouldn't
|
|
// count for the fate of seh frame block.
|
|
for (auto *B : S->blocks()) {
|
|
auto &DummySymbol = G.addAnonymousSymbol(*B, 0, 0, false, false);
|
|
DenseSet<Block *> Children;
|
|
for (auto &E : B->edges()) {
|
|
auto &Sym = E.getTarget();
|
|
if (!Sym.isDefined())
|
|
continue;
|
|
Children.insert(&Sym.getBlock());
|
|
}
|
|
for (auto *Child : Children)
|
|
Child->addEdge(Edge(Edge::KeepAlive, 0, DummySymbol, 0));
|
|
}
|
|
return Error::success();
|
|
}
|
|
|
|
private:
|
|
StringRef SEHFrameSectionName;
|
|
};
|
|
|
|
} // end namespace jitlink
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_EXECUTIONENGINE_JITLINK_SEHFRAMESUPPORT_H
|