1//===-- MachOUtils.h - Mach-o specific helpers for dsymutil --------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8#ifndef LLVM_TOOLS_DSYMUTIL_MACHOUTILS_H
9#define LLVM_TOOLS_DSYMUTIL_MACHOUTILS_H
10
11#include "llvm/ADT/StringRef.h"
12#include "llvm/Support/FileSystem.h"
13#include "llvm/Support/VirtualFileSystem.h"
14
15#include <string>
16
17namespace llvm {
18class MCStreamer;
19class raw_fd_ostream;
20namespace dsymutil {
21class DebugMap;
22struct LinkOptions;
23namespace MachOUtils {
24
25struct ArchAndFile {
26 std::string Arch;
27 std::string Path;
28 int FD = -1;
29
30 llvm::Error createTempFile();
31 llvm::StringRef getPath() const;
32 int getFD() const;
33
34 ArchAndFile(StringRef Arch) : Arch(std::string(Arch)) {}
35 ArchAndFile(ArchAndFile &&A) = default;
36 ArchAndFile &operator=(ArchAndFile &&A) = default;
37 ~ArchAndFile();
38};
39
40struct DwarfRelocationApplicationInfo {
41 // The position in the stream that should be patched, starting from the
42 // Dwarf's segment file address.
43 uint64_t AddressFromDwarfStart;
44 int32_t Value;
45 // If we should subtract the Dwarf segment's VM address from value before
46 // writing it.
47 bool ShouldSubtractDwarfVM;
48
49 DwarfRelocationApplicationInfo(uint64_t AddressFromDwarfVM, uint32_t Value,
50 bool ShouldSubtractDwarfVM)
51 : AddressFromDwarfStart(AddressFromDwarfVM), Value(Value),
52 ShouldSubtractDwarfVM(ShouldSubtractDwarfVM) {}
53};
54
55bool generateUniversalBinary(SmallVectorImpl<ArchAndFile> &ArchFiles,
56 StringRef OutputFileName, const LinkOptions &,
57 StringRef SDKPath, bool Fat64 = false);
58bool generateDsymCompanion(
59 llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS, const DebugMap &DM,
60 MCStreamer &MS, raw_fd_ostream &OutFile,
61 const std::vector<MachOUtils::DwarfRelocationApplicationInfo>
62 &RelocationsToApply);
63
64std::string getArchName(StringRef Arch);
65} // namespace MachOUtils
66} // namespace dsymutil
67} // namespace llvm
68#endif // LLVM_TOOLS_DSYMUTIL_MACHOUTILS_H
69