blob: 85b1b803c5d9a9b1522b159b7cbcdf9f09d46f6d [file] [log] [blame]
//===----- JITLink_EHFrameSupport.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_JITLINK_EHFRAMESUPPORTIMPL_H
#define LLVM_LIB_EXECUTIONENGINE_JITLINK_JITLINK_EHFRAMESUPPORTIMPL_H
#include "llvm/ExecutionEngine/JITLink/JITLink_EHFrameSupport.h"
#include "llvm/ExecutionEngine/JITLink/JITLink.h"
#include "llvm/Support/BinaryStreamReader.h"
namespace llvm {
namespace jitlink {
/// A generic parser for eh-frame sections.
///
/// Adds atoms representing CIE and FDE entries, using the given FDE-to-CIE and
/// FDEToTarget relocation kinds.
class EHFrameParser {
public:
EHFrameParser(AtomGraph &G, Section &EHFrameSection, StringRef EHFrameContent,
JITTargetAddress EHFrameAddress, Edge::Kind FDEToCIERelocKind,
Edge::Kind FDEToTargetRelocKind);
Error atomize();
private:
struct AugmentationInfo {
bool AugmentationDataPresent = false;
bool EHDataFieldPresent = false;
uint8_t Fields[4] = {0x0, 0x0, 0x0, 0x0};
};
Expected<AugmentationInfo> parseAugmentationString();
Expected<JITTargetAddress> readAbsolutePointer();
Error processCIE();
Error processFDE(JITTargetAddress CIEPointerAddress, uint32_t CIEPointer);
AtomGraph &G;
Section &EHFrameSection;
StringRef EHFrameContent;
JITTargetAddress EHFrameAddress;
BinaryStreamReader EHFrameReader;
DefinedAtom *CurRecordAtom = nullptr;
DefinedAtom *MostRecentCIE = nullptr;
bool LSDAFieldPresent = false;
Edge::Kind FDEToCIERelocKind;
Edge::Kind FDEToTargetRelocKind;
};
Error addEHFrame(AtomGraph &G, Section &EHFrameSection,
StringRef EHFrameContent, JITTargetAddress EHFrameAddress,
Edge::Kind FDEToCIERelocKind, Edge::Kind FDEToTargetRelocKind);
} // end namespace jitlink
} // end namespace llvm
#endif // LLVM_LIB_EXECUTIONENGINE_JITLINK_JITLINK_EHFRAMESUPPORTIMPL_H