Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===--- DarwinSDKInfo.h - SDK Information parser for darwin ----*- 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 LLVM_CLANG_BASIC_DARWINSDKINFO_H
10
#define LLVM_CLANG_BASIC_DARWINSDKINFO_H
11
 
12
#include "clang/Basic/LLVM.h"
13
#include "llvm/ADT/DenseMap.h"
14
#include "llvm/ADT/Triple.h"
15
#include "llvm/Support/Error.h"
16
#include "llvm/Support/VersionTuple.h"
17
#include "llvm/Support/VirtualFileSystem.h"
18
#include <optional>
19
 
20
namespace llvm {
21
namespace json {
22
class Object;
23
} // end namespace json
24
} // end namespace llvm
25
 
26
namespace clang {
27
 
28
/// The information about the darwin SDK that was used during this compilation.
29
class DarwinSDKInfo {
30
public:
31
  /// A value that describes two os-environment pairs that can be used as a key
32
  /// to the version map in the SDK.
33
  struct OSEnvPair {
34
  public:
35
    using StorageType = uint64_t;
36
 
37
    constexpr OSEnvPair(llvm::Triple::OSType FromOS,
38
                        llvm::Triple::EnvironmentType FromEnv,
39
                        llvm::Triple::OSType ToOS,
40
                        llvm::Triple::EnvironmentType ToEnv)
41
        : Value(((StorageType(FromOS) * StorageType(llvm::Triple::LastOSType) +
42
                  StorageType(FromEnv))
43
                 << 32ull) |
44
                (StorageType(ToOS) * StorageType(llvm::Triple::LastOSType) +
45
                 StorageType(ToEnv))) {}
46
 
47
    /// Returns the os-environment mapping pair that's used to represent the
48
    /// macOS -> Mac Catalyst version mapping.
49
    static inline constexpr OSEnvPair macOStoMacCatalystPair() {
50
      return OSEnvPair(llvm::Triple::MacOSX, llvm::Triple::UnknownEnvironment,
51
                       llvm::Triple::IOS, llvm::Triple::MacABI);
52
    }
53
 
54
    /// Returns the os-environment mapping pair that's used to represent the
55
    /// Mac Catalyst -> macOS version mapping.
56
    static inline constexpr OSEnvPair macCatalystToMacOSPair() {
57
      return OSEnvPair(llvm::Triple::IOS, llvm::Triple::MacABI,
58
                       llvm::Triple::MacOSX, llvm::Triple::UnknownEnvironment);
59
    }
60
 
61
    /// Returns the os-environment mapping pair that's used to represent the
62
    /// iOS -> watchOS version mapping.
63
    static inline constexpr OSEnvPair iOStoWatchOSPair() {
64
      return OSEnvPair(llvm::Triple::IOS, llvm::Triple::UnknownEnvironment,
65
                       llvm::Triple::WatchOS, llvm::Triple::UnknownEnvironment);
66
    }
67
 
68
    /// Returns the os-environment mapping pair that's used to represent the
69
    /// iOS -> tvOS version mapping.
70
    static inline constexpr OSEnvPair iOStoTvOSPair() {
71
      return OSEnvPair(llvm::Triple::IOS, llvm::Triple::UnknownEnvironment,
72
                       llvm::Triple::TvOS, llvm::Triple::UnknownEnvironment);
73
    }
74
 
75
  private:
76
    StorageType Value;
77
 
78
    friend class DarwinSDKInfo;
79
  };
80
 
81
  /// Represents a version mapping that maps from a version of one target to a
82
  /// version of a related target.
83
  ///
84
  /// e.g. "macOS_iOSMac":{"10.15":"13.1"} is an example of a macOS -> Mac
85
  /// Catalyst version map.
86
  class RelatedTargetVersionMapping {
87
  public:
88
    RelatedTargetVersionMapping(
89
        VersionTuple MinimumKeyVersion, VersionTuple MaximumKeyVersion,
90
        VersionTuple MinimumValue, VersionTuple MaximumValue,
91
        llvm::DenseMap<VersionTuple, VersionTuple> Mapping)
92
        : MinimumKeyVersion(MinimumKeyVersion),
93
          MaximumKeyVersion(MaximumKeyVersion), MinimumValue(MinimumValue),
94
          MaximumValue(MaximumValue), Mapping(Mapping) {
95
      assert(!this->Mapping.empty() && "unexpected empty mapping");
96
    }
97
 
98
    /// Returns the value with the lowest version in the mapping.
99
    const VersionTuple &getMinimumValue() const { return MinimumValue; }
100
 
101
    /// Returns the mapped key, or the appropriate Minimum / MaximumValue if
102
    /// they key is outside of the mapping bounds. If they key isn't mapped, but
103
    /// within the minimum and maximum bounds, std::nullopt is returned.
104
    std::optional<VersionTuple>
105
    map(const VersionTuple &Key, const VersionTuple &MinimumValue,
106
        std::optional<VersionTuple> MaximumValue) const;
107
 
108
    static std::optional<RelatedTargetVersionMapping>
109
    parseJSON(const llvm::json::Object &Obj,
110
              VersionTuple MaximumDeploymentTarget);
111
 
112
  private:
113
    VersionTuple MinimumKeyVersion;
114
    VersionTuple MaximumKeyVersion;
115
    VersionTuple MinimumValue;
116
    VersionTuple MaximumValue;
117
    llvm::DenseMap<VersionTuple, VersionTuple> Mapping;
118
  };
119
 
120
  DarwinSDKInfo(
121
      VersionTuple Version, VersionTuple MaximumDeploymentTarget,
122
      llvm::DenseMap<OSEnvPair::StorageType,
123
                     std::optional<RelatedTargetVersionMapping>>
124
          VersionMappings =
125
              llvm::DenseMap<OSEnvPair::StorageType,
126
                             std::optional<RelatedTargetVersionMapping>>())
127
      : Version(Version), MaximumDeploymentTarget(MaximumDeploymentTarget),
128
        VersionMappings(std::move(VersionMappings)) {}
129
 
130
  const llvm::VersionTuple &getVersion() const { return Version; }
131
 
132
  // Returns the optional, target-specific version mapping that maps from one
133
  // target to another target.
134
  //
135
  // This mapping is constructed from an appropriate mapping in the SDKSettings,
136
  // for instance, when building for Mac Catalyst, the mapping would contain the
137
  // "macOS_iOSMac" mapping as it maps the macOS versions to the Mac Catalyst
138
  // versions.
139
  //
140
  // This mapping does not exist when the target doesn't have an appropriate
141
  // related version mapping, or when there was an error reading the mapping
142
  // from the SDKSettings, or when it's missing in the SDKSettings.
143
  const RelatedTargetVersionMapping *getVersionMapping(OSEnvPair Kind) const {
144
    auto Mapping = VersionMappings.find(Kind.Value);
145
    if (Mapping == VersionMappings.end())
146
      return nullptr;
147
    return Mapping->getSecond() ? &*Mapping->getSecond() : nullptr;
148
  }
149
 
150
  static std::optional<DarwinSDKInfo>
151
  parseDarwinSDKSettingsJSON(const llvm::json::Object *Obj);
152
 
153
private:
154
  VersionTuple Version;
155
  VersionTuple MaximumDeploymentTarget;
156
  // Need to wrap the value in an optional here as the value has to be default
157
  // constructible, and std::unique_ptr doesn't like DarwinSDKInfo being
158
  // Optional as Optional is trying to copy it in emplace.
159
  llvm::DenseMap<OSEnvPair::StorageType,
160
                 std::optional<RelatedTargetVersionMapping>>
161
      VersionMappings;
162
};
163
 
164
/// Parse the SDK information from the SDKSettings.json file.
165
///
166
/// \returns an error if the SDKSettings.json file is invalid, std::nullopt if
167
/// the SDK has no SDKSettings.json, or a valid \c DarwinSDKInfo otherwise.
168
Expected<std::optional<DarwinSDKInfo>>
169
parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath);
170
 
171
} // end namespace clang
172
 
173
#endif // LLVM_CLANG_BASIC_DARWINSDKINFO_H