xref: /llvm-project/llvm/tools/dsymutil/MachOUtils.h (revision 32a6e9d66945c28a9cae476b6d2eb803ca2ab098)
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 
17 namespace llvm {
18 class MCStreamer;
19 class raw_fd_ostream;
20 namespace dsymutil {
21 class DebugMap;
22 struct LinkOptions;
23 namespace MachOUtils {
24 
25 struct 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 
ArchAndFileArchAndFile34   ArchAndFile(StringRef Arch) : Arch(std::string(Arch)) {}
35   ArchAndFile(ArchAndFile &&A) = default;
36   ArchAndFile &operator=(ArchAndFile &&A) = default;
37   ~ArchAndFile();
38 };
39 
40 struct 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 
DwarfRelocationApplicationInfoDwarfRelocationApplicationInfo49   DwarfRelocationApplicationInfo(uint64_t AddressFromDwarfVM, uint32_t Value,
50                                  bool ShouldSubtractDwarfVM)
51       : AddressFromDwarfStart(AddressFromDwarfVM), Value(Value),
52         ShouldSubtractDwarfVM(ShouldSubtractDwarfVM) {}
53 };
54 
55 bool generateUniversalBinary(SmallVectorImpl<ArchAndFile> &ArchFiles,
56                              StringRef OutputFileName, const LinkOptions &,
57                              StringRef SDKPath, bool Fat64 = false);
58 bool 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 
64 std::string getArchName(StringRef Arch);
65 } // namespace MachOUtils
66 } // namespace dsymutil
67 } // namespace llvm
68 #endif // LLVM_TOOLS_DSYMUTIL_MACHOUTILS_H
69