1//===- Config.h -------------------------------------------------*- C++ -*-===//
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
9#ifndef LLD_MACHO_CONFIG_H
10#define LLD_MACHO_CONFIG_H
11
12#include "llvm/ADT/DenseMap.h"
13#include "llvm/ADT/StringRef.h"
14#include "llvm/BinaryFormat/MachO.h"
15#include "llvm/TextAPI/MachO/Architecture.h"
16
17#include <vector>
18
19namespace lld {
20namespace macho {
21
22class Symbol;
23struct SymbolPriorityEntry;
24
25struct Configuration {
26  Symbol *entry;
27  bool hasReexports = false;
28  llvm::StringRef installName;
29  llvm::StringRef outputFile;
30  llvm::MachO::Architecture arch;
31  llvm::MachO::HeaderFileType outputType;
32  std::vector<llvm::StringRef> librarySearchPaths;
33  // TODO: use the framework search paths
34  std::vector<llvm::StringRef> frameworkSearchPaths;
35  llvm::DenseMap<llvm::StringRef, SymbolPriorityEntry> priorities;
36};
37
38// The symbol with the highest priority should be ordered first in the output
39// section (modulo input section contiguity constraints). Using priority
40// (highest first) instead of order (lowest first) has the convenient property
41// that the default-constructed zero priority -- for symbols/sections without a
42// user-defined order -- naturally ends up putting them at the end of the
43// output.
44struct SymbolPriorityEntry {
45  // The priority given to a matching symbol, regardless of which object file
46  // it originated from.
47  size_t anyObjectFile = 0;
48  // The priority given to a matching symbol from a particular object file.
49  llvm::DenseMap<llvm::StringRef, size_t> objectFiles;
50};
51
52extern Configuration *config;
53
54} // namespace macho
55} // namespace lld
56
57#endif
58