1//===------- SEHFrameSupport.h - JITLink seh-frame utils --------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// SEHFrame utils for JITLink.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_EXECUTIONENGINE_JITLINK_SEHFRAMESUPPORT_H
14#define LLVM_EXECUTIONENGINE_JITLINK_SEHFRAMESUPPORT_H
15
16#include "llvm/ExecutionEngine/JITLink/JITLink.h"
17#include "llvm/ExecutionEngine/JITSymbol.h"
18#include "llvm/Support/Error.h"
19#include "llvm/TargetParser/Triple.h"
20
21namespace llvm {
22namespace jitlink {
23/// This pass adds keep-alive edge from SEH frame sections
24/// to the parent function content block.
25class SEHFrameKeepAlivePass {
26public:
27  SEHFrameKeepAlivePass(StringRef SEHFrameSectionName)
28      : SEHFrameSectionName(SEHFrameSectionName) {}
29
30  Error operator()(LinkGraph &G) {
31    auto *S = G.findSectionByName(SEHFrameSectionName);
32    if (!S)
33      return Error::success();
34
35    // Simply consider every block pointed by seh frame block as parants.
36    // This adds some unnecessary keep-alive edges to unwind info blocks,
37    // (xdata) but these blocks are usually dead by default, so they wouldn't
38    // count for the fate of seh frame block.
39    for (auto *B : S->blocks()) {
40      auto &DummySymbol = G.addAnonymousSymbol(*B, 0, 0, false, false);
41      DenseSet<Block *> Children;
42      for (auto &E : B->edges()) {
43        auto &Sym = E.getTarget();
44        if (!Sym.isDefined())
45          continue;
46        Children.insert(&Sym.getBlock());
47      }
48      for (auto *Child : Children)
49        Child->addEdge(Edge(Edge::KeepAlive, 0, DummySymbol, 0));
50    }
51    return Error::success();
52  }
53
54private:
55  StringRef SEHFrameSectionName;
56};
57
58} // end namespace jitlink
59} // end namespace llvm
60
61#endif // LLVM_EXECUTIONENGINE_JITLINK_SEHFRAMESUPPORT_H
62