blob: 6f9f68ad8382c50708d1239fc34fdef24acbaec6 [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
Lang Hames4e920e52019-10-04 03:55:26 +000024/// A generic binary parser for eh-frame sections.
Lang Hames11c8dfa52019-04-20 17:10:34 +000025///
Lang Hames4e920e52019-10-04 03:55:26 +000026/// Adds blocks and symbols representing CIE and FDE entries to a JITLink graph.
27///
28/// This parser assumes that the user has already verified that the EH-frame's
29/// address range does not overlap any other section/symbol, so that generated
30/// CIE/FDE records do not overlap other sections/symbols.
31class EHFrameBinaryParser {
Lang Hames11c8dfa52019-04-20 17:10:34 +000032public:
Lang Hames4e920e52019-10-04 03:55:26 +000033 EHFrameBinaryParser(JITTargetAddress EHFrameAddress, StringRef EHFrameContent,
34 unsigned PointerSize, support::endianness Endianness);
35 virtual ~EHFrameBinaryParser() {}
36
37 Error addToGraph();
Lang Hames11c8dfa52019-04-20 17:10:34 +000038
39private:
Lang Hames4e920e52019-10-04 03:55:26 +000040 virtual void anchor();
41 virtual Symbol *getSymbolAtAddress(JITTargetAddress Addr) = 0;
42 virtual Symbol &createCIERecord(JITTargetAddress RecordAddr,
43 StringRef RecordContent) = 0;
44 virtual Expected<Symbol &>
45 createFDERecord(JITTargetAddress RecordAddr, StringRef RecordContent,
46 Symbol &CIE, size_t CIEOffset, Symbol &Func,
47 size_t FuncOffset, Symbol *LSDA, size_t LSDAOffset) = 0;
48
Lang Hames11c8dfa52019-04-20 17:10:34 +000049 struct AugmentationInfo {
50 bool AugmentationDataPresent = false;
51 bool EHDataFieldPresent = false;
52 uint8_t Fields[4] = {0x0, 0x0, 0x0, 0x0};
53 };
54
55 Expected<AugmentationInfo> parseAugmentationString();
56 Expected<JITTargetAddress> readAbsolutePointer();
Lang Hames4e920e52019-10-04 03:55:26 +000057 Error processCIE(size_t RecordOffset, size_t RecordLength);
58 Error processFDE(size_t RecordOffset, size_t RecordLength,
59 JITTargetAddress CIEPointerOffset, uint32_t CIEPointer);
Lang Hames11c8dfa52019-04-20 17:10:34 +000060
Lang Hamesb1ba4d82019-04-24 15:15:55 +000061 struct CIEInformation {
62 CIEInformation() = default;
Lang Hames4e920e52019-10-04 03:55:26 +000063 CIEInformation(Symbol &CIESymbol) : CIESymbol(&CIESymbol) {}
64 Symbol *CIESymbol = nullptr;
Lang Hamesb1ba4d82019-04-24 15:15:55 +000065 bool FDEsHaveLSDAField = false;
66 };
67
Lang Hames11c8dfa52019-04-20 17:10:34 +000068 JITTargetAddress EHFrameAddress;
Lang Hames4e920e52019-10-04 03:55:26 +000069 StringRef EHFrameContent;
70 unsigned PointerSize;
Lang Hames11c8dfa52019-04-20 17:10:34 +000071 BinaryStreamReader EHFrameReader;
Lang Hamesb1ba4d82019-04-24 15:15:55 +000072 DenseMap<JITTargetAddress, CIEInformation> CIEInfos;
Lang Hames11c8dfa52019-04-20 17:10:34 +000073};
74
Lang Hames11c8dfa52019-04-20 17:10:34 +000075} // end namespace jitlink
76} // end namespace llvm
77
Lang Hames1233c152019-04-22 03:03:09 +000078#endif // LLVM_LIB_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORTIMPL_H