//===------- EHFrameSupportImpl.h - JITLink eh-frame utils ------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // EHFrame registration support for JITLink. // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORTIMPL_H #define LLVM_LIB_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORTIMPL_H #include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h" #include "llvm/ExecutionEngine/JITLink/JITLink.h" #include "llvm/Support/BinaryStreamReader.h" namespace llvm { namespace jitlink { /// A generic binary parser for eh-frame sections. /// /// Adds blocks and symbols representing CIE and FDE entries to a JITLink graph. /// /// This parser assumes that the user has already verified that the EH-frame's /// address range does not overlap any other section/symbol, so that generated /// CIE/FDE records do not overlap other sections/symbols. class EHFrameBinaryParser { public: EHFrameBinaryParser(JITTargetAddress EHFrameAddress, StringRef EHFrameContent, unsigned PointerSize, support::endianness Endianness); virtual ~EHFrameBinaryParser() {} Error addToGraph(); private: virtual void anchor(); virtual Symbol *getSymbolAtAddress(JITTargetAddress Addr) = 0; virtual Symbol &createCIERecord(JITTargetAddress RecordAddr, StringRef RecordContent) = 0; virtual Expected createFDERecord(JITTargetAddress RecordAddr, StringRef RecordContent, Symbol &CIE, size_t CIEOffset, Symbol &Func, size_t FuncOffset, Symbol *LSDA, size_t LSDAOffset) = 0; struct AugmentationInfo { bool AugmentationDataPresent = false; bool EHDataFieldPresent = false; uint8_t Fields[4] = {0x0, 0x0, 0x0, 0x0}; }; Expected parseAugmentationString(); Expected readAbsolutePointer(); Error processCIE(size_t RecordOffset, size_t RecordLength); Error processFDE(size_t RecordOffset, size_t RecordLength, JITTargetAddress CIEPointerOffset, uint32_t CIEPointer); struct CIEInformation { CIEInformation() = default; CIEInformation(Symbol &CIESymbol) : CIESymbol(&CIESymbol) {} Symbol *CIESymbol = nullptr; bool FDEsHaveLSDAField = false; }; JITTargetAddress EHFrameAddress; StringRef EHFrameContent; unsigned PointerSize; BinaryStreamReader EHFrameReader; DenseMap CIEInfos; }; } // end namespace jitlink } // end namespace llvm #endif // LLVM_LIB_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORTIMPL_H