blob: d679edef7ea6f1bbc8361a7ae6327905d9beb7d1 [file] [log] [blame]
Lang Hames1233c152019-04-22 03:03:09 +00001//===------- EHFrameSupportImpl.h - JITLink eh-frame utils ------*- C++ -*-===//
Lang Hames11c8dfa52019-04-20 17:10:34 +00002//
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
Lang Hames1233c152019-04-22 03:03:09 +000013#ifndef LLVM_LIB_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORTIMPL_H
14#define LLVM_LIB_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORTIMPL_H
Lang Hames11c8dfa52019-04-20 17:10:34 +000015
Lang Hames1233c152019-04-22 03:03:09 +000016#include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h"
Lang Hames11c8dfa52019-04-20 17:10:34 +000017
18#include "llvm/ExecutionEngine/JITLink/JITLink.h"
19#include "llvm/Support/BinaryStreamReader.h"
20
21namespace llvm {
22namespace 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.
28class EHFrameParser {
29public:
30 EHFrameParser(AtomGraph &G, Section &EHFrameSection, StringRef EHFrameContent,
31 JITTargetAddress EHFrameAddress, Edge::Kind FDEToCIERelocKind,
32 Edge::Kind FDEToTargetRelocKind);
33 Error atomize();
34
35private:
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
Lang Hamesb1ba4d82019-04-24 15:15:55 +000047 struct CIEInformation {
48 CIEInformation() = default;
49 CIEInformation(DefinedAtom &CIEAtom) : CIEAtom(&CIEAtom) {}
50 DefinedAtom *CIEAtom = nullptr;
51 bool FDEsHaveLSDAField = false;
52 };
53
Lang Hames11c8dfa52019-04-20 17:10:34 +000054 AtomGraph &G;
55 Section &EHFrameSection;
56 StringRef EHFrameContent;
57 JITTargetAddress EHFrameAddress;
58 BinaryStreamReader EHFrameReader;
59 DefinedAtom *CurRecordAtom = nullptr;
Lang Hamesb1ba4d82019-04-24 15:15:55 +000060 DenseMap<JITTargetAddress, CIEInformation> CIEInfos;
Lang Hames11c8dfa52019-04-20 17:10:34 +000061 Edge::Kind FDEToCIERelocKind;
62 Edge::Kind FDEToTargetRelocKind;
63};
64
65Error 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
Lang Hames1233c152019-04-22 03:03:09 +000072#endif // LLVM_LIB_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORTIMPL_H