The strippable Swift reflection sections contain subtractor relocations that need to be applied. There are two situations we need to support. 1) Both symbols used in the relocation come from the .o file (for example, one symbol lives in __swift5_fieldmd and the second in __swift5_reflstr). 2) One symbol comes from th .o file and the second from the main binary (for example, __swift5_fieldmd and __swift5_typeref). Differential Revision: https://reviews.llvm.org/D120574
69 lines
2.2 KiB
C++
69 lines
2.2 KiB
C++
//===-- MachOUtils.h - Mach-o specific helpers for dsymutil --------------===//
|
|
//
|
|
// 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 LLVM_TOOLS_DSYMUTIL_MACHOUTILS_H
|
|
#define LLVM_TOOLS_DSYMUTIL_MACHOUTILS_H
|
|
|
|
#include "SymbolMap.h"
|
|
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Support/FileSystem.h"
|
|
#include "llvm/Support/VirtualFileSystem.h"
|
|
|
|
#include <string>
|
|
|
|
namespace llvm {
|
|
class MCStreamer;
|
|
class raw_fd_ostream;
|
|
namespace dsymutil {
|
|
class DebugMap;
|
|
struct LinkOptions;
|
|
namespace MachOUtils {
|
|
|
|
struct ArchAndFile {
|
|
std::string Arch;
|
|
std::unique_ptr<llvm::sys::fs::TempFile> File;
|
|
|
|
llvm::Error createTempFile();
|
|
llvm::StringRef path() const;
|
|
|
|
ArchAndFile(StringRef Arch) : Arch(std::string(Arch)) {}
|
|
ArchAndFile(ArchAndFile &&A) = default;
|
|
ArchAndFile &operator=(ArchAndFile &&A) = default;
|
|
~ArchAndFile();
|
|
};
|
|
|
|
struct DwarfRelocationApplicationInfo {
|
|
// The position in the stream that should be patched, starting from the
|
|
// Dwarf's segment file address.
|
|
uint64_t AddressFromDwarfStart;
|
|
int32_t Value;
|
|
// If we should subtract the Dwarf segment's VM address from value before
|
|
// writing it.
|
|
bool ShouldSubtractDwarfVM;
|
|
|
|
DwarfRelocationApplicationInfo(uint64_t AddressFromDwarfVM, uint32_t Value,
|
|
bool ShouldSubtractDwarfVM)
|
|
: AddressFromDwarfStart(AddressFromDwarfVM), Value(Value),
|
|
ShouldSubtractDwarfVM(ShouldSubtractDwarfVM) {}
|
|
};
|
|
|
|
bool generateUniversalBinary(SmallVectorImpl<ArchAndFile> &ArchFiles,
|
|
StringRef OutputFileName, const LinkOptions &,
|
|
StringRef SDKPath);
|
|
bool generateDsymCompanion(
|
|
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS, const DebugMap &DM,
|
|
SymbolMapTranslator &Translator, MCStreamer &MS, raw_fd_ostream &OutFile,
|
|
const std::vector<MachOUtils::DwarfRelocationApplicationInfo>
|
|
&RelocationsToApply);
|
|
|
|
std::string getArchName(StringRef Arch);
|
|
} // namespace MachOUtils
|
|
} // namespace dsymutil
|
|
} // namespace llvm
|
|
#endif // LLVM_TOOLS_DSYMUTIL_MACHOUTILS_H
|