@@ -243,6 +243,11 @@ namespace {
243
243
return parseSILIdentifier (Result, L, Diagnostic (ID, Args...));
244
244
}
245
245
246
+ template <typename T>
247
+ bool
248
+ parseSILQualifier (Optional<T> &result,
249
+ llvm::function_ref<Optional<T>(StringRef)> parseName);
250
+
246
251
bool parseVerbatim (StringRef identifier);
247
252
248
253
template <typename T>
@@ -819,6 +824,38 @@ static bool parseSILOptional(bool &Result, SILParser &SP, StringRef Expected) {
819
824
return false ;
820
825
}
821
826
827
+ // If the qualifier string is unrecognized, then diagnose and fail.
828
+ //
829
+ // If the qualifier is absent, then succeed and set the result to None.
830
+ // The caller can decide how to proceed with an absent qualifier.
831
+ //
832
+ // Usage:
833
+ // auto parseQualifierName = [](StringRef Str) {
834
+ // return llvm::StringSwitch<Optional<SomeQualifier>>(Str)
835
+ // .Case("one", SomeQualifier::One)
836
+ // .Case("two", SomeQualifier::Two)
837
+ // .Default(None);
838
+ // };
839
+ // if (parseSILQualifier<SomeQualifier>(Qualifier, parseQualifierName))
840
+ // return true;
841
+ template <typename T>
842
+ bool SILParser::parseSILQualifier (
843
+ Optional<T> &result, llvm::function_ref<Optional<T>(StringRef)> parseName) {
844
+ auto loc = P.Tok .getLoc ();
845
+ StringRef Str;
846
+ // If we do not parse '[' ... ']',
847
+ if (!parseSILOptional (Str, *this )) {
848
+ result = None;
849
+ return false ;
850
+ }
851
+ result = parseName (Str);
852
+ if (!result) {
853
+ P.diagnose (loc, Diagnostic (diag::unrecognized_sil_qualifier));
854
+ return true ;
855
+ }
856
+ return false ;
857
+ }
858
+
822
859
// / Remap RequirementReps to Requirements.
823
860
void SILParser::convertRequirements (ArrayRef<RequirementRepr> From,
824
861
SmallVectorImpl<Requirement> &To) {
@@ -2010,84 +2047,6 @@ bool SILParser::parseSILDebugLocation(SILLocation &L, SILBuilder &B,
2010
2047
return false ;
2011
2048
}
2012
2049
2013
- static bool parseLoadOwnershipQualifier (LoadOwnershipQualifier &Result,
2014
- SILParser &P) {
2015
- StringRef Str;
2016
- // If we do not parse '[' ... ']', we have unqualified. Set value and return.
2017
- if (!parseSILOptional (Str, P)) {
2018
- Result = LoadOwnershipQualifier::Unqualified;
2019
- return false ;
2020
- }
2021
-
2022
- // Then try to parse one of our other qualifiers. We do not support parsing
2023
- // unqualified here so we use that as our fail value.
2024
- auto Tmp = llvm::StringSwitch<LoadOwnershipQualifier>(Str)
2025
- .Case (" take" , LoadOwnershipQualifier::Take)
2026
- .Case (" copy" , LoadOwnershipQualifier::Copy)
2027
- .Case (" trivial" , LoadOwnershipQualifier::Trivial)
2028
- .Default (LoadOwnershipQualifier::Unqualified);
2029
-
2030
- // Thus return true (following the conventions in this file) if we fail.
2031
- if (Tmp == LoadOwnershipQualifier::Unqualified)
2032
- return true ;
2033
-
2034
- // Otherwise, assign Result and return false.
2035
- Result = Tmp;
2036
- return false ;
2037
- }
2038
-
2039
- static bool parseStoreOwnershipQualifier (StoreOwnershipQualifier &Result,
2040
- SILParser &P) {
2041
- StringRef Str;
2042
- // If we do not parse '[' ... ']', we have unqualified. Set value and return.
2043
- if (!parseSILOptional (Str, P)) {
2044
- Result = StoreOwnershipQualifier::Unqualified;
2045
- return false ;
2046
- }
2047
-
2048
- // Then try to parse one of our other qualifiers. We do not support parsing
2049
- // unqualified here so we use that as our fail value.
2050
- auto Tmp = llvm::StringSwitch<StoreOwnershipQualifier>(Str)
2051
- .Case (" init" , StoreOwnershipQualifier::Init)
2052
- .Case (" assign" , StoreOwnershipQualifier::Assign)
2053
- .Case (" trivial" , StoreOwnershipQualifier::Trivial)
2054
- .Default (StoreOwnershipQualifier::Unqualified);
2055
-
2056
- // Thus return true (following the conventions in this file) if we fail.
2057
- if (Tmp == StoreOwnershipQualifier::Unqualified)
2058
- return true ;
2059
-
2060
- // Otherwise, assign Result and return false.
2061
- Result = Tmp;
2062
- return false ;
2063
- }
2064
-
2065
- static bool parseAssignOwnershipQualifier (AssignOwnershipQualifier &Result,
2066
- SILParser &P) {
2067
- StringRef Str;
2068
- // If we do not parse '[' ... ']', we have unknown. Set value and return.
2069
- if (!parseSILOptional (Str, P)) {
2070
- Result = AssignOwnershipQualifier::Unknown;
2071
- return false ;
2072
- }
2073
-
2074
- // Then try to parse one of our other initialization kinds. We do not support
2075
- // parsing unknown here so we use that as our fail value.
2076
- auto Tmp = llvm::StringSwitch<AssignOwnershipQualifier>(Str)
2077
- .Case (" reassign" , AssignOwnershipQualifier::Reassign)
2078
- .Case (" reinit" , AssignOwnershipQualifier::Reinit)
2079
- .Case (" init" , AssignOwnershipQualifier::Init)
2080
- .Default (AssignOwnershipQualifier::Unknown);
2081
-
2082
- // Thus return true (following the conventions in this file) if we fail.
2083
- if (Tmp == AssignOwnershipQualifier::Unknown)
2084
- return true ;
2085
-
2086
- // Otherwise, assign Result and return false.
2087
- Result = Tmp;
2088
- return false ;
2089
- }
2090
-
2091
2050
static bool parseAssignByWrapperMode (AssignByWrapperInst::Mode &Result,
2092
2051
SILParser &P) {
2093
2052
StringRef Str;
@@ -3252,15 +3211,23 @@ bool SILParser::parseSpecificSILInstruction(SILBuilder &B,
3252
3211
}
3253
3212
3254
3213
case SILInstructionKind::LoadInst: {
3255
- LoadOwnershipQualifier Qualifier;
3214
+ Optional< LoadOwnershipQualifier> Qualifier;
3256
3215
SourceLoc AddrLoc;
3257
-
3258
- if (parseLoadOwnershipQualifier (Qualifier, *this ) ||
3259
- parseTypedValueRef (Val, AddrLoc, B) ||
3260
- parseSILDebugLocation (InstLoc, B))
3216
+ auto parseLoadOwnership = [](StringRef Str) {
3217
+ return llvm::StringSwitch<Optional<LoadOwnershipQualifier>>(Str)
3218
+ .Case (" take" , LoadOwnershipQualifier::Take)
3219
+ .Case (" copy" , LoadOwnershipQualifier::Copy)
3220
+ .Case (" trivial" , LoadOwnershipQualifier::Trivial)
3221
+ .Default (None);
3222
+ };
3223
+ if (parseSILQualifier<LoadOwnershipQualifier>(Qualifier, parseLoadOwnership)
3224
+ || parseTypedValueRef (Val, AddrLoc, B)
3225
+ || parseSILDebugLocation (InstLoc, B)) {
3261
3226
return true ;
3262
-
3263
- ResultVal = B.createLoad (InstLoc, Val, Qualifier);
3227
+ }
3228
+ if (!Qualifier)
3229
+ Qualifier = LoadOwnershipQualifier::Unqualified;
3230
+ ResultVal = B.createLoad (InstLoc, Val, Qualifier.getValue ());
3264
3231
break ;
3265
3232
}
3266
3233
@@ -3838,19 +3805,37 @@ bool SILParser::parseSpecificSILInstruction(SILBuilder &B,
3838
3805
SourceLoc ToLoc, AddrLoc;
3839
3806
Identifier ToToken;
3840
3807
SILValue AddrVal;
3841
- StoreOwnershipQualifier StoreQualifier;
3842
- AssignOwnershipQualifier AssignQualifier;
3808
+ Optional< StoreOwnershipQualifier> StoreQualifier;
3809
+ Optional< AssignOwnershipQualifier> AssignQualifier;
3843
3810
bool IsStore = Opcode == SILInstructionKind::StoreInst;
3844
3811
bool IsAssign = Opcode == SILInstructionKind::AssignInst;
3845
3812
if (parseValueName (From) ||
3846
3813
parseSILIdentifier (ToToken, ToLoc, diag::expected_tok_in_sil_instr,
3847
3814
" to" ))
3848
3815
return true ;
3849
3816
3850
- if (IsStore && parseStoreOwnershipQualifier (StoreQualifier, *this ))
3817
+ auto parseStoreOwnership = [](StringRef Str) {
3818
+ return llvm::StringSwitch<Optional<StoreOwnershipQualifier>>(Str)
3819
+ .Case (" init" , StoreOwnershipQualifier::Init)
3820
+ .Case (" assign" , StoreOwnershipQualifier::Assign)
3821
+ .Case (" trivial" , StoreOwnershipQualifier::Trivial)
3822
+ .Default (None);
3823
+ };
3824
+ if (IsStore
3825
+ && parseSILQualifier<StoreOwnershipQualifier>(StoreQualifier,
3826
+ parseStoreOwnership))
3851
3827
return true ;
3852
3828
3853
- if (IsAssign && parseAssignOwnershipQualifier (AssignQualifier, *this ))
3829
+ auto parseAssignOwnership = [](StringRef Str) {
3830
+ return llvm::StringSwitch<Optional<AssignOwnershipQualifier>>(Str)
3831
+ .Case (" reassign" , AssignOwnershipQualifier::Reassign)
3832
+ .Case (" reinit" , AssignOwnershipQualifier::Reinit)
3833
+ .Case (" init" , AssignOwnershipQualifier::Init)
3834
+ .Default (None);
3835
+ };
3836
+ if (IsAssign
3837
+ && parseSILQualifier<AssignOwnershipQualifier>(AssignQualifier,
3838
+ parseAssignOwnership))
3854
3839
return true ;
3855
3840
3856
3841
if (parseTypedValueRef (AddrVal, AddrLoc, B) ||
@@ -3871,15 +3856,19 @@ bool SILParser::parseSpecificSILInstruction(SILBuilder &B,
3871
3856
SILType ValType = AddrVal->getType ().getObjectType ();
3872
3857
3873
3858
if (IsStore) {
3859
+ if (!StoreQualifier)
3860
+ StoreQualifier = StoreOwnershipQualifier::Unqualified;
3874
3861
ResultVal =
3875
3862
B.createStore (InstLoc, getLocalValue (From, ValType, InstLoc, B),
3876
- AddrVal, StoreQualifier);
3863
+ AddrVal, StoreQualifier. getValue () );
3877
3864
} else {
3878
3865
assert (IsAssign);
3866
+ if (!AssignQualifier)
3867
+ AssignQualifier = AssignOwnershipQualifier::Unknown;
3879
3868
3880
3869
ResultVal =
3881
3870
B.createAssign (InstLoc, getLocalValue (From, ValType, InstLoc, B),
3882
- AddrVal, AssignQualifier);
3871
+ AddrVal, AssignQualifier. getValue () );
3883
3872
}
3884
3873
3885
3874
break ;
0 commit comments