aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/lld/MachO/UnwindInfoSection.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/lld/MachO/UnwindInfoSection.h')
-rw-r--r--contrib/llvm-project/lld/MachO/UnwindInfoSection.h79
1 files changed, 79 insertions, 0 deletions
diff --git a/contrib/llvm-project/lld/MachO/UnwindInfoSection.h b/contrib/llvm-project/lld/MachO/UnwindInfoSection.h
new file mode 100644
index 000000000000..2285cf930d83
--- /dev/null
+++ b/contrib/llvm-project/lld/MachO/UnwindInfoSection.h
@@ -0,0 +1,79 @@
+//===- UnwindInfoSection.h ------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLD_MACHO_UNWIND_INFO_H
+#define LLD_MACHO_UNWIND_INFO_H
+
+#include "MergedOutputSection.h"
+#include "SyntheticSections.h"
+
+#include "mach-o/compact_unwind_encoding.h"
+#include "llvm/ADT/DenseMap.h"
+
+#include <vector>
+
+// In 2020, we mostly care about 64-bit targets: x86_64 and arm64
+struct CompactUnwindEntry64 {
+ uint64_t functionAddress;
+ uint32_t functionLength;
+ compact_unwind_encoding_t encoding;
+ uint64_t personality;
+ uint64_t lsda;
+};
+
+// FIXME(gkm): someday we might care about 32-bit targets: x86 & arm
+struct CompactUnwindEntry32 {
+ uint32_t functionAddress;
+ uint32_t functionLength;
+ compact_unwind_encoding_t encoding;
+ uint32_t personality;
+ uint32_t lsda;
+};
+
+namespace lld {
+namespace macho {
+
+class UnwindInfoSection : public SyntheticSection {
+public:
+ UnwindInfoSection();
+ uint64_t getSize() const override { return unwindInfoSize; }
+ bool isNeeded() const override;
+ void finalize() override;
+ void writeTo(uint8_t *buf) const override;
+ void setCompactUnwindSection(MergedOutputSection *cuSection) {
+ compactUnwindSection = cuSection;
+ }
+
+ using EncodingMap = llvm::DenseMap<compact_unwind_encoding_t, size_t>;
+
+ struct SecondLevelPage {
+ uint32_t kind;
+ size_t entryIndex;
+ size_t entryCount;
+ size_t byteCount;
+ std::vector<compact_unwind_encoding_t> localEncodings;
+ EncodingMap localEncodingIndexes;
+ };
+
+private:
+ std::vector<std::pair<compact_unwind_encoding_t, size_t>> commonEncodings;
+ EncodingMap commonEncodingIndexes;
+ std::vector<uint32_t> personalities;
+ std::vector<unwind_info_section_header_lsda_index_entry> lsdaEntries;
+ std::vector<CompactUnwindEntry64> cuVector;
+ std::vector<const CompactUnwindEntry64 *> cuPtrVector;
+ std::vector<SecondLevelPage> secondLevelPages;
+ MergedOutputSection *compactUnwindSection = nullptr;
+ uint64_t level2PagesOffset = 0;
+ uint64_t unwindInfoSize = 0;
+};
+
+} // namespace macho
+} // namespace lld
+
+#endif