[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:
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user