LLVM 19.0.0git
SEHFrameSupport.h
Go to the documentation of this file.
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/ADT/SetVector.h"
19#include "llvm/Support/Error.h"
21
22namespace llvm {
23namespace jitlink {
24/// This pass adds keep-alive edge from SEH frame sections
25/// to the parent function content block.
27public:
28 SEHFrameKeepAlivePass(StringRef SEHFrameSectionName)
29 : SEHFrameSectionName(SEHFrameSectionName) {}
30
32 auto *S = G.findSectionByName(SEHFrameSectionName);
33 if (!S)
34 return Error::success();
35
36 // Simply consider every block pointed by seh frame block as parants.
37 // This adds some unnecessary keep-alive edges to unwind info blocks,
38 // (xdata) but these blocks are usually dead by default, so they wouldn't
39 // count for the fate of seh frame block.
40 for (auto *B : S->blocks()) {
41 auto &DummySymbol = G.addAnonymousSymbol(*B, 0, 0, false, false);
42 SetVector<Block *> Children;
43 for (auto &E : B->edges()) {
44 auto &Sym = E.getTarget();
45 if (!Sym.isDefined())
46 continue;
47 Children.insert(&Sym.getBlock());
48 }
49 for (auto *Child : Children)
50 Child->addEdge(Edge(Edge::KeepAlive, 0, DummySymbol, 0));
51 }
52 return Error::success();
53 }
54
55private:
56 StringRef SEHFrameSectionName;
57};
58
59} // end namespace jitlink
60} // end namespace llvm
61
62#endif // LLVM_EXECUTIONENGINE_JITLINK_SEHFRAMESUPPORT_H
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
Symbol * Sym
Definition: ELF_riscv.cpp:479
#define G(x, y, z)
Definition: MD5.cpp:56
This file implements a set that has insertion order iteration characteristics.
Lightweight error class with error context and mandatory checking.
Definition: Error.h:160
static ErrorSuccess success()
Create a success value.
Definition: Error.h:337
A vector that has set insertion semantics.
Definition: SetVector.h:57
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18