mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
4c563335f4
Frame Descriptor Entries (FDEs) have a pointer back to a Common Information Entry (CIE) that describes how the rest FDE should be parsed. JITLink had been assuming that FDEs always referred to the most recent CIE encountered, but the spec allows them to point back to any previously encountered CIE. This patch fixes JITLink to look up the correct CIE for the FDE. The testcase is a MachO binary with an FDE that refers to a CIE that is not the one immediately proceeding it (the layout can be viewed wit 'dwarfdump --eh-frame <testcase>'. This test case had to be a binary as llvm-mc now sorts FDEs (as of r356216) to ensure FDEs *do* point to the most recent CIE. llvm-svn: 359105
73 lines
2.4 KiB
C++
73 lines
2.4 KiB
C++
//===------- 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 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);
|
|
|
|
struct CIEInformation {
|
|
CIEInformation() = default;
|
|
CIEInformation(DefinedAtom &CIEAtom) : CIEAtom(&CIEAtom) {}
|
|
DefinedAtom *CIEAtom = nullptr;
|
|
bool FDEsHaveLSDAField = false;
|
|
};
|
|
|
|
AtomGraph &G;
|
|
Section &EHFrameSection;
|
|
StringRef EHFrameContent;
|
|
JITTargetAddress EHFrameAddress;
|
|
BinaryStreamReader EHFrameReader;
|
|
DefinedAtom *CurRecordAtom = nullptr;
|
|
DenseMap<JITTargetAddress, CIEInformation> CIEInfos;
|
|
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_EHFRAMESUPPORTIMPL_H
|