@@ -141,6 +141,18 @@ Each global variable definition is of the following form:
141141 AvailabilityMsg: ""
142142
143143*/
144+ namespace llvm {
145+
146+ namespace yaml {
147+ template <> struct ScalarEnumerationTraits <SwiftSafetyKind> {
148+ static void enumeration (IO &IO, SwiftSafetyKind &SK) {
149+ IO.enumCase (SK, " unspecified" , SwiftSafetyKind::Unspecified);
150+ IO.enumCase (SK, " safe" , SwiftSafetyKind::Safe);
151+ IO.enumCase (SK, " unsafe" , SwiftSafetyKind::Unsafe);
152+ }
153+ };
154+ } // namespace yaml
155+ } // namespace llvm
144156
145157namespace {
146158enum class APIAvailability {
@@ -322,6 +334,7 @@ struct Method {
322334 /* TO_UPSTREAM(BoundsSafety) ON */
323335 std::optional<BoundsSafetyNotes> ReturnBoundsSafety;
324336 /* TO_UPSTREAM(BoundsSafety) OFF */
337+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
325338};
326339
327340typedef std::vector<Method> MethodsSeq;
@@ -361,6 +374,7 @@ template <> struct MappingTraits<Method> {
361374 /* TO_UPSTREAM(BoundsSafety) ON */
362375 IO.mapOptional (" BoundsSafety" , M.ReturnBoundsSafety );
363376 /* TO_UPSTREAM(BoundsSafety) OFF */
377+ IO.mapOptional (" SwiftSafety" , M.SafetyKind , SwiftSafetyKind::None);
364378 }
365379};
366380} // namespace yaml
@@ -376,6 +390,7 @@ struct Property {
376390 StringRef SwiftName;
377391 std::optional<bool > SwiftImportAsAccessors;
378392 StringRef Type;
393+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
379394};
380395
381396typedef std::vector<Property> PropertiesSeq;
@@ -397,6 +412,7 @@ template <> struct MappingTraits<Property> {
397412 IO.mapOptional (" SwiftName" , P.SwiftName , StringRef (" " ));
398413 IO.mapOptional (" SwiftImportAsAccessors" , P.SwiftImportAsAccessors );
399414 IO.mapOptional (" Type" , P.Type , StringRef (" " ));
415+ IO.mapOptional (" SwiftSafety" , P.SafetyKind , SwiftSafetyKind::None);
400416 }
401417};
402418} // namespace yaml
@@ -416,6 +432,7 @@ struct Class {
416432 std::optional<std::string> SwiftConformance;
417433 MethodsSeq Methods;
418434 PropertiesSeq Properties;
435+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
419436};
420437
421438typedef std::vector<Class> ClassesSeq;
@@ -441,6 +458,7 @@ template <> struct MappingTraits<Class> {
441458 IO.mapOptional (" SwiftConformsTo" , C.SwiftConformance );
442459 IO.mapOptional (" Methods" , C.Methods );
443460 IO.mapOptional (" Properties" , C.Properties );
461+ IO.mapOptional (" SwiftSafety" , C.SafetyKind , SwiftSafetyKind::None);
444462 }
445463};
446464} // namespace yaml
@@ -462,6 +480,7 @@ struct Function {
462480 /* TO_UPSTREAM(BoundsSafety) ON */
463481 std::optional<BoundsSafetyNotes> ReturnBoundsSafety;
464482 /* TO_UPSTREAM(BoundsSafety) OFF */
483+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
465484};
466485
467486typedef std::vector<Function> FunctionsSeq;
@@ -489,6 +508,7 @@ template <> struct MappingTraits<Function> {
489508 /* TO_UPSTREAM(BoundsSafety) ON */
490509 IO.mapOptional (" BoundsSafety" , F.ReturnBoundsSafety );
491510 /* TO_UPSTREAM(BoundsSafety) OFF */
511+ IO.mapOptional (" SwiftSafety" , F.SafetyKind , SwiftSafetyKind::None);
492512 }
493513};
494514} // namespace yaml
@@ -502,6 +522,7 @@ struct GlobalVariable {
502522 std::optional<bool > SwiftPrivate;
503523 StringRef SwiftName;
504524 StringRef Type;
525+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
505526};
506527
507528typedef std::vector<GlobalVariable> GlobalVariablesSeq;
@@ -521,6 +542,7 @@ template <> struct MappingTraits<GlobalVariable> {
521542 IO.mapOptional (" SwiftPrivate" , GV.SwiftPrivate );
522543 IO.mapOptional (" SwiftName" , GV.SwiftName , StringRef (" " ));
523544 IO.mapOptional (" Type" , GV.Type , StringRef (" " ));
545+ IO.mapOptional (" SwiftSafety" , GV.SafetyKind , SwiftSafetyKind::None);
524546 }
525547};
526548} // namespace yaml
@@ -532,6 +554,7 @@ struct EnumConstant {
532554 AvailabilityItem Availability;
533555 std::optional<bool > SwiftPrivate;
534556 StringRef SwiftName;
557+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
535558};
536559
537560typedef std::vector<EnumConstant> EnumConstantsSeq;
@@ -549,6 +572,7 @@ template <> struct MappingTraits<EnumConstant> {
549572 IO.mapOptional (" AvailabilityMsg" , EC.Availability .Msg , StringRef (" " ));
550573 IO.mapOptional (" SwiftPrivate" , EC.SwiftPrivate );
551574 IO.mapOptional (" SwiftName" , EC.SwiftName , StringRef (" " ));
575+ IO.mapOptional (" SwiftSafety" , EC.SafetyKind , SwiftSafetyKind::None);
552576 }
553577};
554578} // namespace yaml
@@ -592,6 +616,7 @@ struct Field {
592616 std::optional<bool > SwiftPrivate;
593617 StringRef SwiftName;
594618 StringRef Type;
619+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
595620};
596621
597622typedef std::vector<Field> FieldsSeq;
@@ -611,6 +636,7 @@ template <> struct MappingTraits<Field> {
611636 IO.mapOptional (" SwiftPrivate" , F.SwiftPrivate );
612637 IO.mapOptional (" SwiftName" , F.SwiftName , StringRef (" " ));
613638 IO.mapOptional (" Type" , F.Type , StringRef (" " ));
639+ IO.mapOptional (" SwiftSafety" , F.SafetyKind , SwiftSafetyKind::None);
614640 }
615641};
616642} // namespace yaml
@@ -638,6 +664,7 @@ struct Tag {
638664 std::optional<EnumConvenienceAliasKind> EnumConvenienceKind;
639665 std::optional<bool > SwiftCopyable;
640666 std::optional<bool > SwiftEscapable;
667+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
641668 FunctionsSeq Methods;
642669 FieldsSeq Fields;
643670
@@ -683,6 +710,7 @@ template <> struct MappingTraits<Tag> {
683710 IO.mapOptional (" Methods" , T.Methods );
684711 IO.mapOptional (" Fields" , T.Fields );
685712 IO.mapOptional (" Tags" , T.Tags );
713+ IO.mapOptional (" SwiftSafety" , T.SafetyKind , SwiftSafetyKind::None);
686714 }
687715};
688716} // namespace yaml
@@ -698,6 +726,7 @@ struct Typedef {
698726 std::optional<StringRef> NSErrorDomain;
699727 std::optional<SwiftNewTypeKind> SwiftType;
700728 std::optional<std::string> SwiftConformance;
729+ const SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
701730};
702731
703732typedef std::vector<Typedef> TypedefsSeq;
@@ -770,6 +799,7 @@ struct Namespace {
770799 StringRef SwiftName;
771800 std::optional<bool > SwiftPrivate;
772801 TopLevelItems Items;
802+ const SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
773803};
774804} // namespace
775805
@@ -974,6 +1004,8 @@ class YAMLConverter {
9741004 StringRef APIName) {
9751005 convertAvailability (Common.Availability , Info, APIName);
9761006 Info.setSwiftPrivate (Common.SwiftPrivate );
1007+ if (Common.SafetyKind != SwiftSafetyKind::None)
1008+ Info.setSwiftSafety (Common.SafetyKind );
9771009 Info.SwiftName = std::string (Common.SwiftName );
9781010 }
9791011
@@ -1133,6 +1165,8 @@ class YAMLConverter {
11331165 void convertFunction (const Function &Function, FuncOrMethodInfo &FI) {
11341166 convertAvailability (Function.Availability , FI, Function.Name );
11351167 FI.setSwiftPrivate (Function.SwiftPrivate );
1168+ if (Function.SafetyKind != SwiftSafetyKind::None)
1169+ FI.setSwiftSafety (Function.SafetyKind );
11361170 FI.SwiftName = std::string (Function.SwiftName );
11371171 /* TO_UPSTREAM(BoundsSafety) ON */
11381172 if (Function.ReturnBoundsSafety ) {
0 commit comments