summaryrefslogtreecommitdiff
path: root/lld/MachO
diff options
context:
space:
mode:
authorKeith Smiley <keithbsmiley@gmail.com>2023-03-03 12:08:33 -0800
committerKeith Smiley <keithbsmiley@gmail.com>2023-03-03 13:47:01 -0800
commit6578e0d1d0e435ab91b44bb2d40aea913044a65b (patch)
tree90e47ef676a09d42c596855e3d410d6efd32cdf2 /lld/MachO
parent96e39fdbb90b26191fc79b6226f299e3c10e559b (diff)
downloadllvm-6578e0d1d0e435ab91b44bb2d40aea913044a65b.tar.gz
[lld-macho] Remove duplicate minimum version info
At some point PlatformInfo's Target changed types to a type that also has minimum deployment target info. This caused ambiguity if you tried to get the target triple from the Target, as the actual minimum version info was being stored separately. This bulk of this change is changing the parsing of these values to support this. Differential Revision: https://reviews.llvm.org/D145263
Diffstat (limited to 'lld/MachO')
-rw-r--r--lld/MachO/Config.h1
-rw-r--r--lld/MachO/Driver.cpp51
-rw-r--r--lld/MachO/InputFiles.cpp19
-rw-r--r--lld/MachO/SyntheticSections.cpp2
-rw-r--r--lld/MachO/Writer.cpp8
5 files changed, 40 insertions, 41 deletions
diff --git a/lld/MachO/Config.h b/lld/MachO/Config.h
index af46303f1ae2..328aea49d77c 100644
--- a/lld/MachO/Config.h
+++ b/lld/MachO/Config.h
@@ -42,7 +42,6 @@ using SegmentRenameMap = llvm::DenseMap<llvm::StringRef, llvm::StringRef>;
struct PlatformInfo {
llvm::MachO::Target target;
- llvm::VersionTuple minimum;
llvm::VersionTuple sdk;
};
diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp
index 121fa851041c..0f2326b305b1 100644
--- a/lld/MachO/Driver.cpp
+++ b/lld/MachO/Driver.cpp
@@ -682,8 +682,9 @@ static PlatformVersion parsePlatformVersion(const Arg *arg) {
return platformVersion;
}
-// Has the side-effect of setting Config::platformInfo.
-static PlatformType parsePlatformVersions(const ArgList &args) {
+// Has the side-effect of setting Config::platformInfo and
+// potentially Config::secondaryPlatformInfo.
+static void setPlatformVersions(StringRef archName, const ArgList &args) {
std::map<PlatformType, PlatformVersion> platformVersions;
const PlatformVersion *lastVersionInfo = nullptr;
for (const Arg *arg : args.filtered(OPT_platform_version)) {
@@ -699,11 +700,11 @@ static PlatformType parsePlatformVersions(const ArgList &args) {
if (platformVersions.empty()) {
error("must specify -platform_version");
- return PLATFORM_UNKNOWN;
+ return;
}
if (platformVersions.size() > 2) {
error("must specify -platform_version at most twice");
- return PLATFORM_UNKNOWN;
+ return;
}
if (platformVersions.size() == 2) {
bool isZipperedCatalyst = platformVersions.count(PLATFORM_MACOS) &&
@@ -715,21 +716,23 @@ static PlatformType parsePlatformVersions(const ArgList &args) {
} else if (config->outputType != MH_DYLIB &&
config->outputType != MH_BUNDLE) {
error("writing zippered outputs only valid for -dylib and -bundle");
- } else {
- config->platformInfo.minimum = platformVersions[PLATFORM_MACOS].minimum;
- config->platformInfo.sdk = platformVersions[PLATFORM_MACOS].sdk;
- config->secondaryPlatformInfo = PlatformInfo{};
- config->secondaryPlatformInfo->minimum =
- platformVersions[PLATFORM_MACCATALYST].minimum;
- config->secondaryPlatformInfo->sdk =
- platformVersions[PLATFORM_MACCATALYST].sdk;
}
- return PLATFORM_MACOS;
+
+ config->platformInfo = {
+ MachO::Target(getArchitectureFromName(archName), PLATFORM_MACOS,
+ platformVersions[PLATFORM_MACOS].minimum),
+ platformVersions[PLATFORM_MACOS].sdk};
+ config->secondaryPlatformInfo = {
+ MachO::Target(getArchitectureFromName(archName), PLATFORM_MACCATALYST,
+ platformVersions[PLATFORM_MACCATALYST].minimum),
+ platformVersions[PLATFORM_MACCATALYST].sdk};
+ return;
}
- config->platformInfo.minimum = lastVersionInfo->minimum;
- config->platformInfo.sdk = lastVersionInfo->sdk;
- return lastVersionInfo->platform;
+ config->platformInfo = {MachO::Target(getArchitectureFromName(archName),
+ lastVersionInfo->platform,
+ lastVersionInfo->minimum),
+ lastVersionInfo->sdk};
}
// Has the side-effect of setting Config::target.
@@ -740,14 +743,7 @@ static TargetInfo *createTargetInfo(InputArgList &args) {
return nullptr;
}
- PlatformType platform = parsePlatformVersions(args);
- config->platformInfo.target =
- MachO::Target(getArchitectureFromName(archName), platform);
- if (config->secondaryPlatformInfo) {
- config->secondaryPlatformInfo->target =
- MachO::Target(getArchitectureFromName(archName), PLATFORM_MACCATALYST);
- }
-
+ setPlatformVersions(archName, args);
auto [cpuType, cpuSubtype] = getCPUTypeFromArchitecture(config->arch());
switch (cpuType) {
case CPU_TYPE_X86_64:
@@ -987,7 +983,7 @@ static bool dataConstDefault(const InputArgList &args) {
auto it = llvm::find_if(minVersion,
[&](const auto &p) { return p.first == platform; });
if (it != minVersion.end())
- if (config->platformInfo.minimum < it->second)
+ if (config->platformInfo.target.MinDeployment < it->second)
return false;
switch (config->outputType) {
@@ -1025,13 +1021,14 @@ static bool shouldEmitChainedFixups(const InputArgList &args) {
PlatformType platform = removeSimulator(config->platformInfo.target.Platform);
auto it = llvm::find_if(minVersion,
[&](const auto &p) { return p.first == platform; });
- if (it != minVersion.end() && it->second > config->platformInfo.minimum) {
+ if (it != minVersion.end() &&
+ it->second > config->platformInfo.target.MinDeployment) {
if (!isRequested)
return false;
warn("-fixup_chains requires " + getPlatformName(config->platform()) + " " +
it->second.getAsString() + ", which is newer than target minimum of " +
- config->platformInfo.minimum.getAsString());
+ config->platformInfo.target.MinDeployment.getAsString());
}
if (!is_contained({AK_x86_64, AK_x86_64h, AK_arm64}, config->arch())) {
diff --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp
index e1289103faf7..ed0d98a2ecec 100644
--- a/lld/MachO/InputFiles.cpp
+++ b/lld/MachO/InputFiles.cpp
@@ -124,7 +124,7 @@ static std::vector<PlatformInfo> getPlatformInfos(const InputFile *input) {
for (auto *cmd : findCommands<build_version_command>(hdr, LC_BUILD_VERSION)) {
PlatformInfo info;
info.target.Platform = static_cast<PlatformType>(cmd->platform);
- info.minimum = decodeVersion(cmd->minos);
+ info.target.MinDeployment = decodeVersion(cmd->minos);
platformInfos.emplace_back(std::move(info));
}
for (auto *cmd : findCommands<version_min_command>(
@@ -145,7 +145,7 @@ static std::vector<PlatformInfo> getPlatformInfos(const InputFile *input) {
info.target.Platform = PLATFORM_WATCHOS;
break;
}
- info.minimum = decodeVersion(cmd->version);
+ info.target.MinDeployment = decodeVersion(cmd->version);
platformInfos.emplace_back(std::move(info));
}
@@ -176,10 +176,11 @@ static bool checkCompatibility(const InputFile *input) {
return false;
}
- if (it->minimum > config->platformInfo.minimum)
- warn(toString(input) + " has version " + it->minimum.getAsString() +
+ if (it->target.MinDeployment > config->platformInfo.target.MinDeployment)
+ warn(toString(input) + " has version " +
+ it->target.MinDeployment.getAsString() +
", which is newer than target minimum of " +
- config->platformInfo.minimum.getAsString());
+ config->platformInfo.target.MinDeployment.getAsString());
return true;
}
@@ -2017,8 +2018,8 @@ void DylibFile::handleLDPreviousSymbol(StringRef name, StringRef originalName) {
originalName + "' ignored");
return;
}
- if (config->platformInfo.minimum < start ||
- config->platformInfo.minimum >= end)
+ if (config->platformInfo.target.MinDeployment < start ||
+ config->platformInfo.target.MinDeployment >= end)
return;
// Initialized to compatibilityVersion for the symbolName branch below.
@@ -2069,7 +2070,7 @@ void DylibFile::handleLDInstallNameSymbol(StringRef name,
if (!condition.consume_front("os") || version.tryParse(condition))
warn(toString(this) + ": failed to parse os version, symbol '" +
originalName + "' ignored");
- else if (version == config->platformInfo.minimum)
+ else if (version == config->platformInfo.target.MinDeployment)
this->installName = saver().save(installName);
}
@@ -2087,7 +2088,7 @@ void DylibFile::handleLDHideSymbol(StringRef name, StringRef originalName) {
"` ignored.");
return;
}
- shouldHide = versionTup == config->platformInfo.minimum;
+ shouldHide = versionTup == config->platformInfo.target.MinDeployment;
} else {
symbolName = name;
}
diff --git a/lld/MachO/SyntheticSections.cpp b/lld/MachO/SyntheticSections.cpp
index 8cde77d8968b..ca681eb9c90a 100644
--- a/lld/MachO/SyntheticSections.cpp
+++ b/lld/MachO/SyntheticSections.cpp
@@ -105,7 +105,7 @@ static uint32_t cpuSubtype() {
if (config->outputType == MH_EXECUTE && !config->staticLink &&
target->cpuSubtype == CPU_SUBTYPE_X86_64_ALL &&
config->platform() == PLATFORM_MACOS &&
- config->platformInfo.minimum >= VersionTuple(10, 5))
+ config->platformInfo.target.MinDeployment >= VersionTuple(10, 5))
subtype |= CPU_SUBTYPE_LIB64;
return subtype;
diff --git a/lld/MachO/Writer.cpp b/lld/MachO/Writer.cpp
index a09920687c55..28c01d39764a 100644
--- a/lld/MachO/Writer.cpp
+++ b/lld/MachO/Writer.cpp
@@ -465,7 +465,7 @@ public:
break;
}
c->cmdsize = getSize();
- c->version = encodeVersion(platformInfo.minimum);
+ c->version = encodeVersion(platformInfo.target.MinDeployment);
c->sdk = encodeVersion(platformInfo.sdk);
}
@@ -490,7 +490,7 @@ public:
c->cmdsize = getSize();
c->platform = static_cast<uint32_t>(platformInfo.target.Platform);
- c->minos = encodeVersion(platformInfo.minimum);
+ c->minos = encodeVersion(platformInfo.target.MinDeployment);
c->sdk = encodeVersion(platformInfo.sdk);
c->ntools = ntools;
@@ -764,7 +764,9 @@ static bool useLCBuildVersion(const PlatformInfo &platformInfo) {
auto it = llvm::find_if(minVersion, [&](const auto &p) {
return p.first == platformInfo.target.Platform;
});
- return it == minVersion.end() ? true : platformInfo.minimum >= it->second;
+ return it == minVersion.end()
+ ? true
+ : platformInfo.target.MinDeployment >= it->second;
}
template <class LP> void Writer::createLoadCommands() {