Skip to content

Commit b3f80ad

Browse files
committed
[TextAPI] Capture new properties from TBD to InterfaceFile
* Deployment Versions for targets * Run Search Paths * Text vs Data Segment attributes to symbols Reviewed By: pete Differential Revision: https://reviews.llvm.org/D144158 (cherry picked from commit b70d87b)
1 parent 8853562 commit b3f80ad

File tree

10 files changed

+163
-59
lines changed

10 files changed

+163
-59
lines changed

llvm/include/llvm/TextAPI/InterfaceFile.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,18 @@ class InterfaceFile {
348348
return Documents;
349349
}
350350

351+
/// Set the runpath search paths.
352+
/// \param InputTarget The target applicable to runpath search path.
353+
/// \param RPath The name of runpath.
354+
void addRPath(const Target &InputTarget, StringRef RPath);
355+
356+
/// Get the list of runpath search paths.
357+
///
358+
/// \return Returns a list of the rpaths per target.
359+
const std::vector<std::pair<Target, std::string>> &rpaths() const {
360+
return RPaths;
361+
}
362+
351363
/// Add a symbol to the symbols list or extend an existing one.
352364
void addSymbol(SymbolKind Kind, StringRef Name, const TargetList &Targets,
353365
SymbolFlags Flags = SymbolFlags::None);
@@ -435,6 +447,7 @@ class InterfaceFile {
435447
std::vector<InterfaceFileRef> ReexportedLibraries;
436448
std::vector<std::shared_ptr<InterfaceFile>> Documents;
437449
std::vector<std::pair<Target, std::string>> UUIDs;
450+
std::vector<std::pair<Target, std::string>> RPaths;
438451
SymbolMapType Symbols;
439452
InterfaceFile *Parent = nullptr;
440453
};

llvm/include/llvm/TextAPI/Symbol.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,13 @@ enum class SymbolFlags : uint8_t {
4040
/// Rexported
4141
Rexported = 1U << 4,
4242

43-
LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/Rexported),
43+
/// Data Segment
44+
Data = 1U << 5,
45+
46+
/// Text Segment
47+
Text = 1U << 6,
48+
49+
LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/Text),
4450
};
4551

4652
// clang-format on
@@ -93,6 +99,14 @@ class Symbol {
9399
return (Flags & SymbolFlags::Rexported) == SymbolFlags::Rexported;
94100
}
95101

102+
bool isData() const {
103+
return (Flags & SymbolFlags::Data) == SymbolFlags::Data;
104+
}
105+
106+
bool isText() const {
107+
return (Flags & SymbolFlags::Text) == SymbolFlags::Text;
108+
}
109+
96110
using const_target_iterator = TargetList::const_iterator;
97111
using const_target_range = llvm::iterator_range<const_target_iterator>;
98112
const_target_range targets() const { return {Targets}; }

llvm/include/llvm/TextAPI/Target.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
#define LLVM_TEXTAPI_TARGET_H
1111

1212
#include "llvm/Support/Error.h"
13+
#include "llvm/Support/VersionTuple.h"
14+
#include "llvm/TargetParser/Triple.h"
1315
#include "llvm/TextAPI/Architecture.h"
1416
#include "llvm/TextAPI/ArchitectureSet.h"
1517
#include "llvm/TextAPI/Platform.h"
@@ -26,17 +28,20 @@ namespace MachO {
2628
class Target {
2729
public:
2830
Target() = default;
29-
Target(Architecture Arch, PlatformType Platform)
30-
: Arch(Arch), Platform(Platform) {}
31+
Target(Architecture Arch, PlatformType Platform,
32+
VersionTuple MinDeployment = {})
33+
: Arch(Arch), Platform(Platform), MinDeployment(MinDeployment) {}
3134
explicit Target(const llvm::Triple &Triple)
32-
: Arch(mapToArchitecture(Triple)), Platform(mapToPlatformType(Triple)) {}
35+
: Arch(mapToArchitecture(Triple)), Platform(mapToPlatformType(Triple)),
36+
MinDeployment(Triple.getOSVersion()) {}
3337

3438
static llvm::Expected<Target> create(StringRef Target);
3539

3640
operator std::string() const;
3741

3842
Architecture Arch;
3943
PlatformType Platform;
44+
VersionTuple MinDeployment;
4045
};
4146

4247
inline bool operator==(const Target &LHS, const Target &RHS) {

llvm/lib/TextAPI/InterfaceFile.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,19 @@ void InterfaceFile::addParentUmbrella(const Target &Target_, StringRef Parent) {
7171
ParentUmbrellas.emplace(Iter, Target_, std::string(Parent));
7272
}
7373

74+
void InterfaceFile::addRPath(const Target &InputTarget, StringRef RPath) {
75+
auto Iter = lower_bound(RPaths, InputTarget,
76+
[](const std::pair<Target, std::string> &LHS,
77+
Target RHS) { return LHS.first < RHS; });
78+
79+
if ((Iter != RPaths.end()) && !(InputTarget < Iter->first)) {
80+
Iter->second = std::string(RPath);
81+
return;
82+
}
83+
84+
RPaths.emplace(Iter, InputTarget, std::string(RPath));
85+
}
86+
7487
void InterfaceFile::addUUID(const Target &Target_, StringRef UUID) {
7588
auto Iter = lower_bound(UUIDs, Target_,
7689
[](const std::pair<Target, std::string> &LHS,

llvm/lib/TextAPI/Target.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@ Expected<Target> Target::create(StringRef TargetValue) {
4646
}
4747

4848
Target::operator std::string() const {
49-
return (getArchitectureName(Arch) + " (" + getPlatformName(Platform) + ")")
49+
auto Version = MinDeployment.empty() ? "" : MinDeployment.getAsString();
50+
51+
return (getArchitectureName(Arch) + " (" + getPlatformName(Platform) +
52+
Version + ")")
5053
.str();
5154
}
5255

@@ -70,8 +73,11 @@ ArchitectureSet mapToArchitectureSet(ArrayRef<Target> Targets) {
7073
}
7174

7275
std::string getTargetTripleName(const Target &Targ) {
76+
auto Version =
77+
Targ.MinDeployment.empty() ? "" : Targ.MinDeployment.getAsString();
78+
7379
return (getArchitectureName(Targ.Arch) + "-apple-" +
74-
getOSAndEnvironmentName(Targ.Platform))
80+
getOSAndEnvironmentName(Targ.Platform, Version))
7581
.str();
7682
}
7783

llvm/lib/TextAPI/TextStubV5.cpp

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ enum TBDKey : size_t {
115115
ObjCClass,
116116
ObjCEHType,
117117
ObjCIvar,
118+
RPath,
119+
Paths,
118120
};
119121

120122
std::array<StringRef, 64> Keys = {
@@ -151,6 +153,8 @@ std::array<StringRef, 64> Keys = {
151153
"objc_class",
152154
"objc_eh_type",
153155
"objc_ivar",
156+
"rpaths",
157+
"paths",
154158
};
155159

156160
static llvm::SmallString<128> getParseErrorMsg(TBDKey Key) {
@@ -273,11 +277,19 @@ Expected<TargetList> getTargetsSection(const Object *Section) {
273277
getRequiredValue<StringRef>(TBDKey::Target, Obj, &Object::getString);
274278
if (!TargetStr)
275279
return make_error<JSONStubError>(getParseErrorMsg(TBDKey::Target));
280+
auto VersionStr = getRequiredValue<StringRef>(TBDKey::Deployment, Obj,
281+
&Object::getString);
282+
if (!VersionStr)
283+
return make_error<JSONStubError>(getParseErrorMsg(TBDKey::Deployment));
284+
VersionTuple Version;
285+
if (Version.tryParse(*VersionStr))
286+
return make_error<JSONStubError>(getParseErrorMsg(TBDKey::Deployment));
276287
auto TargetOrErr = Target::create(*TargetStr);
277288
if (!TargetOrErr)
278289
return make_error<JSONStubError>(getParseErrorMsg(TBDKey::Target));
290+
TargetOrErr->MinDeployment = Version;
291+
279292
IFTargets.push_back(*TargetOrErr);
280-
// TODO: Implement Deployment Version.
281293
}
282294
return std::move(IFTargets);
283295
}
@@ -321,15 +333,11 @@ Error collectSymbolsFromSegment(const Object *Segment, TargetsToSymbols &Result,
321333
SymbolFlags WeakFlag = SectionFlag | (SectionFlag == SymbolFlags::Undefined
322334
? SymbolFlags::WeakReferenced
323335
: SymbolFlags::WeakDefined);
324-
Err = collectFromArray(TBDKey::Weak, Segment,
325-
[&Result, WeakFlag](StringRef Name) {
326-
JSONSymbol Sym = {
327-
SymbolKind::GlobalSymbol,
328-
Name.str(),
329-
WeakFlag,
330-
};
331-
Result.back().second.emplace_back(Sym);
332-
});
336+
Err = collectFromArray(
337+
TBDKey::Weak, Segment, [&Result, WeakFlag](StringRef Name) {
338+
JSONSymbol Sym = {SymbolKind::GlobalSymbol, Name.str(), WeakFlag};
339+
Result.back().second.emplace_back(Sym);
340+
});
333341
if (Err)
334342
return Err;
335343

@@ -402,12 +410,14 @@ Expected<TargetsToSymbols> getSymbolSection(const Object *File, TBDKey Key,
402410
return make_error<JSONStubError>(getParseErrorMsg(Key));
403411

404412
if (DataSection) {
405-
auto Err = collectSymbolsFromSegment(DataSection, Result, SectionFlag);
413+
auto Err = collectSymbolsFromSegment(DataSection, Result,
414+
SectionFlag | SymbolFlags::Data);
406415
if (Err)
407416
return std::move(Err);
408417
}
409418
if (TextSection) {
410-
auto Err = collectSymbolsFromSegment(TextSection, Result, SectionFlag);
419+
auto Err = collectSymbolsFromSegment(TextSection, Result,
420+
SectionFlag | SymbolFlags::Text);
411421
if (Err)
412422
return std::move(Err);
413423
}
@@ -605,6 +615,11 @@ Expected<IFPtr> parseToInterfaceFile(const Object *File) {
605615
return RLOrErr.takeError();
606616
AttrToTargets ReexportLibs = std::move(*RLOrErr);
607617

618+
auto RPathsOrErr = getLibSection(File, TBDKey::RPath, TBDKey::Paths, Targets);
619+
if (!RPathsOrErr)
620+
return RPathsOrErr.takeError();
621+
AttrToTargets RPaths = std::move(*RPathsOrErr);
622+
608623
auto ExportsOrErr = getSymbolSection(File, TBDKey::Exports, Targets);
609624
if (!ExportsOrErr)
610625
return ExportsOrErr.takeError();
@@ -639,6 +654,9 @@ Expected<IFPtr> parseToInterfaceFile(const Object *File) {
639654
for (auto &[Lib, Targets] : Umbrellas)
640655
for (auto Target : Targets)
641656
F->addParentUmbrella(Target, Lib);
657+
for (auto &[Path, Targets] : RPaths)
658+
for (auto Target : Targets)
659+
F->addRPath(Target, Path);
642660
for (auto &[Targets, Symbols] : Exports)
643661
for (auto &Sym : Symbols)
644662
F->addSymbol(Sym.Kind, Sym.Name, Targets, Sym.Flags);

llvm/unittests/TextAPI/TextStubHelpers.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ struct ExportedSymbol {
2020
std::string Name = {};
2121
bool Weak = false;
2222
bool ThreadLocalValue = false;
23+
bool isData = false;
2324
MachO::TargetList Targets = {};
2425
};
2526

2627
using ExportedSymbolSeq = std::vector<ExportedSymbol>;
27-
using UUIDs = std::vector<std::pair<llvm::MachO::Target, std::string>>;
28+
using TargetToAttr = std::vector<std::pair<llvm::MachO::Target, std::string>>;
2829
using TBDFile = std::unique_ptr<MachO::InterfaceFile>;
2930
using TBDReexportFile = std::shared_ptr<MachO::InterfaceFile>;
3031

llvm/unittests/TextAPI/TextStubV3Tests.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,10 @@ TEST(TBDv3, ReadFile) {
8181
for (auto &&arch : Archs)
8282
Targets.emplace_back(Target(arch, Platform));
8383
EXPECT_EQ(Archs, File->getArchitectures());
84-
UUIDs Uuids = {{Target(AK_armv7, PLATFORM_UNKNOWN),
85-
"00000000-0000-0000-0000-000000000000"},
86-
{Target(AK_arm64, PLATFORM_UNKNOWN),
87-
"11111111-1111-1111-1111-111111111111"}};
84+
TargetToAttr Uuids = {{Target(AK_armv7, PLATFORM_UNKNOWN),
85+
"00000000-0000-0000-0000-000000000000"},
86+
{Target(AK_arm64, PLATFORM_UNKNOWN),
87+
"11111111-1111-1111-1111-111111111111"}};
8888
EXPECT_EQ(Uuids, File->uuids());
8989
EXPECT_EQ(File->getPlatforms().size(), 1U);
9090
EXPECT_EQ(Platform, *File->getPlatforms().begin());
@@ -171,10 +171,10 @@ TEST(TBDv3, ReadMultipleDocuments) {
171171
for (auto &&arch : Archs)
172172
Targets.emplace_back(Target(arch, Platform));
173173
EXPECT_EQ(Archs, File->getArchitectures());
174-
UUIDs Uuids = {{Target(AK_armv7, PLATFORM_UNKNOWN),
175-
"00000000-0000-0000-0000-000000000000"},
176-
{Target(AK_arm64, PLATFORM_UNKNOWN),
177-
"11111111-1111-1111-1111-111111111111"}};
174+
TargetToAttr Uuids = {{Target(AK_armv7, PLATFORM_UNKNOWN),
175+
"00000000-0000-0000-0000-000000000000"},
176+
{Target(AK_arm64, PLATFORM_UNKNOWN),
177+
"11111111-1111-1111-1111-111111111111"}};
178178
EXPECT_EQ(Uuids, File->uuids());
179179
EXPECT_EQ(File->getPlatforms().size(), 1U);
180180
EXPECT_EQ(Platform, *File->getPlatforms().begin());

llvm/unittests/TextAPI/TextStubV4Tests.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ TEST(TBDv4, ReadFile) {
9090
Target(AK_x86_64, PLATFORM_MACOS),
9191
Target(AK_x86_64, PLATFORM_IOS),
9292
};
93-
UUIDs uuids = {{Targets[0], "00000000-0000-0000-0000-000000000000"},
94-
{Targets[1], "11111111-1111-1111-1111-111111111111"},
95-
{Targets[2], "11111111-1111-1111-1111-111111111111"}};
93+
TargetToAttr uuids = {{Targets[0], "00000000-0000-0000-0000-000000000000"},
94+
{Targets[1], "11111111-1111-1111-1111-111111111111"},
95+
{Targets[2], "11111111-1111-1111-1111-111111111111"}};
9696
EXPECT_EQ(Archs, File->getArchitectures());
9797
EXPECT_EQ(uuids, File->uuids());
9898
EXPECT_EQ(Platforms.size(), File->getPlatforms().size());
@@ -228,7 +228,7 @@ TEST(TBDv4, ReadMultipleDocuments) {
228228
for (auto &&Arch : Archs)
229229
for (auto &&Platform : Platforms)
230230
Targets.emplace_back(Target(Arch, Platform));
231-
UUIDs Uuids = {
231+
TargetToAttr Uuids = {
232232
{Targets[0], "00000000-0000-0000-0000-000000000000"},
233233
{Targets[1], "00000000-0000-0000-0000-000000000002"},
234234
{Targets[2], "11111111-1111-1111-1111-111111111111"},
@@ -362,8 +362,8 @@ TEST(TBDv4, WriteFile) {
362362
Target(AK_i386, PLATFORM_MACOS),
363363
Target(AK_x86_64, PLATFORM_IOSSIMULATOR),
364364
};
365-
UUIDs uuids = {{Targets[0], "00000000-0000-0000-0000-000000000000"},
366-
{Targets[1], "11111111-1111-1111-1111-111111111111"}};
365+
TargetToAttr uuids = {{Targets[0], "00000000-0000-0000-0000-000000000000"},
366+
{Targets[1], "11111111-1111-1111-1111-111111111111"}};
367367
File.setInstallName("Umbrella.framework/Umbrella");
368368
File.setFileType(FileType::TBD_V4);
369369
File.addTargets(Targets);
@@ -430,8 +430,8 @@ TEST(TBDv4, WriteMultipleDocuments) {
430430
Target(AK_i386, Platform),
431431
Target(AK_x86_64, Platform),
432432
};
433-
UUIDs Uuids = {{Targets[0], "00000000-0000-0000-0000-000000000002"},
434-
{Targets[1], "11111111-1111-1111-1111-111111111112"}};
433+
TargetToAttr Uuids = {{Targets[0], "00000000-0000-0000-0000-000000000002"},
434+
{Targets[1], "11111111-1111-1111-1111-111111111112"}};
435435
File.setInstallName("/System/Library/Frameworks/Umbrella.framework/Umbrella");
436436
File.setFileType(FileType::TBD_V4);
437437
File.addTargets(Targets);

0 commit comments

Comments
 (0)