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 73