[TextAPI] Support more constructors for PackedVersions

TBD files now record minimum deplyoment versions and tapi interfaces
with apple system linker by a packed version encoding. Support mapping
between that and `VersionTuple`s.
This commit is contained in:
Cyndy Ishida
2023-09-07 10:26:31 -07:00
parent e9ed1aa9cd
commit f9fe6032cd
3 changed files with 23 additions and 3 deletions

View File

@@ -13,6 +13,7 @@
#ifndef LLVM_TEXTAPI_PACKEDVERSION_H
#define LLVM_TEXTAPI_PACKEDVERSION_H
#include "llvm/Support/VersionTuple.h"
#include <cstdint>
#include <string>
#include <utility>
@@ -28,10 +29,19 @@ class PackedVersion {
public:
constexpr PackedVersion() = default;
explicit constexpr PackedVersion(uint32_t RawVersion) : Version(RawVersion) {}
constexpr PackedVersion(uint32_t RawVersion) : Version(RawVersion) {}
PackedVersion(unsigned Major, unsigned Minor, unsigned Subminor)
: Version((Major << 16) | ((Minor & 0xff) << 8) | (Subminor & 0xff)) {}
PackedVersion(VersionTuple VT) {
unsigned Minor = 0, Subminor = 0;
if (auto VTMinor = VT.getMinor())
Minor = *VTMinor;
if (auto VTSub = VT.getSubminor())
Subminor = *VTSub;
*this = PackedVersion(VT.getMajor(), Minor, Subminor);
}
bool empty() const { return Version == 0; }
/// Retrieve the major version number.

View File

@@ -28,7 +28,7 @@ bool PackedVersion::parse32(StringRef Str) {
SmallVector<StringRef, 3> Parts;
SplitString(Str, Parts, ".");
if (Parts.size() > 3)
if (Parts.size() > 3 || Parts.empty())
return false;
unsigned long long Num;
@@ -63,7 +63,7 @@ std::pair<bool, bool> PackedVersion::parse64(StringRef Str) {
SmallVector<StringRef, 5> Parts;
SplitString(Str, Parts, ".");
if (Parts.size() > 5)
if (Parts.size() > 5 || Parts.empty())
return std::make_pair(false, Truncated);
unsigned long long Num;

View File

@@ -197,8 +197,18 @@ TEST(TBDv5, ReadFile) {
Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 0, 0)),
Target(AK_arm64, PLATFORM_MACCATALYST, VersionTuple(14, 0)),
};
std::set<Target> FileTargets{File->targets().begin(), File->targets().end()};
EXPECT_EQ(mapToPlatformSet(AllTargets), File->getPlatforms());
EXPECT_EQ(mapToArchitectureSet(AllTargets), File->getArchitectures());
EXPECT_EQ(FileTargets.size(), AllTargets.size());
for (const auto &Targ : AllTargets) {
auto FileTarg = FileTargets.find(Targ);
EXPECT_FALSE(FileTarg == FileTargets.end());
EXPECT_EQ(*FileTarg, Targ);
PackedVersion MD = Targ.MinDeployment;
PackedVersion FileMD = FileTarg->MinDeployment;
EXPECT_EQ(MD, FileMD);
}
EXPECT_EQ(PackedVersion(1, 2, 0), File->getCurrentVersion());
EXPECT_EQ(PackedVersion(1, 1, 0), File->getCompatibilityVersion());