Skip to content

Commit 195cdfd

Browse files
authored
[APINotes] Support SwiftImportAs for C++ structs
This upstreams a few Clang API Notes attributes that were recently added downstream in the Apple fork (swiftlang#7386).
1 parent f9026cf commit 195cdfd

File tree

4 files changed

+44
-2
lines changed

4 files changed

+44
-2
lines changed

clang/include/clang/APINotes/Types.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,10 @@ class TagInfo : public CommonTypeInfo {
660660
unsigned IsFlagEnum : 1;
661661

662662
public:
663+
std::optional<std::string> SwiftImportAs;
664+
std::optional<std::string> SwiftRetainOp;
665+
std::optional<std::string> SwiftReleaseOp;
666+
663667
std::optional<EnumExtensibilityKind> EnumExtensibility;
664668

665669
TagInfo() : HasFlagEnum(0), IsFlagEnum(0) {}
@@ -677,6 +681,13 @@ class TagInfo : public CommonTypeInfo {
677681
TagInfo &operator|=(const TagInfo &RHS) {
678682
static_cast<CommonTypeInfo &>(*this) |= RHS;
679683

684+
if (!SwiftImportAs)
685+
SwiftImportAs = RHS.SwiftImportAs;
686+
if (!SwiftRetainOp)
687+
SwiftRetainOp = RHS.SwiftRetainOp;
688+
if (!SwiftReleaseOp)
689+
SwiftReleaseOp = RHS.SwiftReleaseOp;
690+
680691
if (!HasFlagEnum)
681692
setFlagEnum(RHS.isFlagEnum());
682693

@@ -693,6 +704,9 @@ class TagInfo : public CommonTypeInfo {
693704

694705
inline bool operator==(const TagInfo &LHS, const TagInfo &RHS) {
695706
return static_cast<const CommonTypeInfo &>(LHS) == RHS &&
707+
LHS.SwiftImportAs == RHS.SwiftImportAs &&
708+
LHS.SwiftRetainOp == RHS.SwiftRetainOp &&
709+
LHS.SwiftReleaseOp == RHS.SwiftReleaseOp &&
696710
LHS.isFlagEnum() == RHS.isFlagEnum() &&
697711
LHS.EnumExtensibility == RHS.EnumExtensibility;
698712
}

clang/lib/APINotes/APINotesFormat.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const uint16_t VERSION_MAJOR = 0;
2424
/// API notes file minor version number.
2525
///
2626
/// When the format changes IN ANY WAY, this number should be incremented.
27-
const uint16_t VERSION_MINOR = 24; // EnumExtensibility + FlagEnum
27+
const uint16_t VERSION_MINOR = 25; // SwiftImportAs
2828

2929
using IdentifierID = llvm::PointerEmbeddedInt<unsigned, 31>;
3030
using IdentifierIDField = llvm::BCVBR<16>;

clang/lib/APINotes/APINotesWriter.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1124,7 +1124,10 @@ class CommonTypeTableInfo
11241124
class TagTableInfo : public CommonTypeTableInfo<TagTableInfo, TagInfo> {
11251125
public:
11261126
unsigned getUnversionedInfoSize(const TagInfo &TI) {
1127-
return 1 + getCommonTypeInfoSize(TI);
1127+
return 2 + (TI.SwiftImportAs ? TI.SwiftImportAs->size() : 0) +
1128+
2 + (TI.SwiftRetainOp ? TI.SwiftRetainOp->size() : 0) +
1129+
2 + (TI.SwiftReleaseOp ? TI.SwiftReleaseOp->size() : 0) +
1130+
1 + getCommonTypeInfoSize(TI);
11281131
}
11291132

11301133
void emitUnversionedInfo(raw_ostream &OS, const TagInfo &TI) {
@@ -1142,6 +1145,25 @@ class TagTableInfo : public CommonTypeTableInfo<TagTableInfo, TagInfo> {
11421145

11431146
writer.write<uint8_t>(Flags);
11441147

1148+
if (auto ImportAs = TI.SwiftImportAs) {
1149+
writer.write<uint16_t>(ImportAs->size() + 1);
1150+
OS.write(ImportAs->c_str(), ImportAs->size());
1151+
} else {
1152+
writer.write<uint16_t>(0);
1153+
}
1154+
if (auto RetainOp = TI.SwiftRetainOp) {
1155+
writer.write<uint16_t>(RetainOp->size() + 1);
1156+
OS.write(RetainOp->c_str(), RetainOp->size());
1157+
} else {
1158+
writer.write<uint16_t>(0);
1159+
}
1160+
if (auto ReleaseOp = TI.SwiftReleaseOp) {
1161+
writer.write<uint16_t>(ReleaseOp->size() + 1);
1162+
OS.write(ReleaseOp->c_str(), ReleaseOp->size());
1163+
} else {
1164+
writer.write<uint16_t>(0);
1165+
}
1166+
11451167
emitCommonTypeInfo(OS, TI);
11461168
}
11471169
};

clang/lib/APINotes/APINotesYAMLCompiler.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,9 @@ struct Tag {
410410
std::optional<bool> SwiftPrivate;
411411
std::optional<StringRef> SwiftBridge;
412412
std::optional<StringRef> NSErrorDomain;
413+
std::optional<std::string> SwiftImportAs;
414+
std::optional<std::string> SwiftRetainOp;
415+
std::optional<std::string> SwiftReleaseOp;
413416
std::optional<EnumExtensibilityKind> EnumExtensibility;
414417
std::optional<bool> FlagEnum;
415418
std::optional<EnumConvenienceAliasKind> EnumConvenienceKind;
@@ -440,6 +443,9 @@ template <> struct MappingTraits<Tag> {
440443
IO.mapOptional("SwiftName", T.SwiftName, StringRef(""));
441444
IO.mapOptional("SwiftBridge", T.SwiftBridge);
442445
IO.mapOptional("NSErrorDomain", T.NSErrorDomain);
446+
IO.mapOptional("SwiftImportAs", T.SwiftImportAs);
447+
IO.mapOptional("SwiftReleaseOp", T.SwiftReleaseOp);
448+
IO.mapOptional("SwiftRetainOp", T.SwiftRetainOp);
443449
IO.mapOptional("EnumExtensibility", T.EnumExtensibility);
444450
IO.mapOptional("FlagEnum", T.FlagEnum);
445451
IO.mapOptional("EnumKind", T.EnumConvenienceKind);

0 commit comments

Comments
 (0)