EHFrameSupport.h revision 360784
1//===--------- EHFrameSupport.h - JITLink eh-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// EHFrame registration support for JITLink.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORT_H
14#define LLVM_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORT_H
15
16#include "llvm/ADT/Triple.h"
17#include "llvm/ExecutionEngine/JITLink/JITLink.h"
18#include "llvm/ExecutionEngine/JITSymbol.h"
19#include "llvm/Support/Error.h"
20
21namespace llvm {
22namespace jitlink {
23
24/// Registers all FDEs in the given eh-frame section with the current process.
25Error registerEHFrameSection(const void *EHFrameSectionAddr,
26                             size_t EHFrameSectionSize);
27
28/// Deregisters all FDEs in the given eh-frame section with the current process.
29Error deregisterEHFrameSection(const void *EHFrameSectionAddr,
30                               size_t EHFrameSectionSize);
31
32/// Supports registration/deregistration of EH-frames in a target process.
33class EHFrameRegistrar {
34public:
35  virtual ~EHFrameRegistrar();
36  virtual Error registerEHFrames(JITTargetAddress EHFrameSectionAddr,
37                                 size_t EHFrameSectionSize) = 0;
38  virtual Error deregisterEHFrames(JITTargetAddress EHFrameSectionAddr,
39                                   size_t EHFrameSectionSize) = 0;
40};
41
42/// Registers / Deregisters EH-frames in the current process.
43class InProcessEHFrameRegistrar final : public EHFrameRegistrar {
44public:
45  /// Get a reference to the InProcessEHFrameRegistrar singleton.
46  static InProcessEHFrameRegistrar &getInstance();
47
48  InProcessEHFrameRegistrar(const InProcessEHFrameRegistrar &) = delete;
49  InProcessEHFrameRegistrar &
50  operator=(const InProcessEHFrameRegistrar &) = delete;
51
52  InProcessEHFrameRegistrar(InProcessEHFrameRegistrar &&) = delete;
53  InProcessEHFrameRegistrar &operator=(InProcessEHFrameRegistrar &&) = delete;
54
55  Error registerEHFrames(JITTargetAddress EHFrameSectionAddr,
56                         size_t EHFrameSectionSize) override {
57    return registerEHFrameSection(
58        jitTargetAddressToPointer<void *>(EHFrameSectionAddr),
59        EHFrameSectionSize);
60  }
61
62  Error deregisterEHFrames(JITTargetAddress EHFrameSectionAddr,
63                           size_t EHFrameSectionSize) override {
64    return deregisterEHFrameSection(
65        jitTargetAddressToPointer<void *>(EHFrameSectionAddr),
66        EHFrameSectionSize);
67  }
68
69private:
70  InProcessEHFrameRegistrar();
71};
72
73using StoreFrameRangeFunction =
74  std::function<void(JITTargetAddress EHFrameSectionAddr,
75                     size_t EHFrameSectionSize)>;
76
77/// Creates a pass that records the address and size of the EH frame section.
78/// If no eh-frame section is found then the address and size will both be given
79/// as zero.
80///
81/// Authors of JITLinkContexts can use this function to register a post-fixup
82/// pass that records the range of the eh-frame section. This range can
83/// be used after finalization to register and deregister the frame.
84LinkGraphPassFunction
85createEHFrameRecorderPass(const Triple &TT,
86                          StoreFrameRangeFunction StoreFrameRange);
87
88} // end namespace jitlink
89} // end namespace llvm
90
91#endif // LLVM_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORT_H
92