]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/llvm/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm-project / llvm / lib / ExecutionEngine / JITLink / EHFrameSupportImpl.h
1 //===------- EHFrameSupportImpl.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_LIB_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORTIMPL_H
14 #define LLVM_LIB_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORTIMPL_H
15
16 #include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h"
17
18 #include "llvm/ExecutionEngine/JITLink/JITLink.h"
19 #include "llvm/Support/BinaryStreamReader.h"
20
21 namespace llvm {
22 namespace jitlink {
23
24 /// A generic parser for eh-frame sections.
25 ///
26 /// Adds atoms representing CIE and FDE entries, using the given FDE-to-CIE and
27 /// FDEToTarget relocation kinds.
28 class EHFrameParser {
29 public:
30   EHFrameParser(AtomGraph &G, Section &EHFrameSection, StringRef EHFrameContent,
31                 JITTargetAddress EHFrameAddress, Edge::Kind FDEToCIERelocKind,
32                 Edge::Kind FDEToTargetRelocKind);
33   Error atomize();
34
35 private:
36   struct AugmentationInfo {
37     bool AugmentationDataPresent = false;
38     bool EHDataFieldPresent = false;
39     uint8_t Fields[4] = {0x0, 0x0, 0x0, 0x0};
40   };
41
42   Expected<AugmentationInfo> parseAugmentationString();
43   Expected<JITTargetAddress> readAbsolutePointer();
44   Error processCIE();
45   Error processFDE(JITTargetAddress CIEPointerAddress, uint32_t CIEPointer);
46
47   struct CIEInformation {
48     CIEInformation() = default;
49     CIEInformation(DefinedAtom &CIEAtom) : CIEAtom(&CIEAtom) {}
50     DefinedAtom *CIEAtom = nullptr;
51     bool FDEsHaveLSDAField = false;
52   };
53
54   AtomGraph &G;
55   Section &EHFrameSection;
56   StringRef EHFrameContent;
57   JITTargetAddress EHFrameAddress;
58   BinaryStreamReader EHFrameReader;
59   DefinedAtom *CurRecordAtom = nullptr;
60   DenseMap<JITTargetAddress, CIEInformation> CIEInfos;
61   Edge::Kind FDEToCIERelocKind;
62   Edge::Kind FDEToTargetRelocKind;
63 };
64
65 Error addEHFrame(AtomGraph &G, Section &EHFrameSection,
66                  StringRef EHFrameContent, JITTargetAddress EHFrameAddress,
67                  Edge::Kind FDEToCIERelocKind, Edge::Kind FDEToTargetRelocKind);
68
69 } // end namespace jitlink
70 } // end namespace llvm
71
72 #endif // LLVM_LIB_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORTIMPL_H