@@ -6947,18 +6947,22 @@ static void ExpandCryptoAEK(const AArch64::ArchInfo &ArchInfo,
69476947 }
69486948}
69496949
6950+ static SMLoc incrementLoc (SMLoc L, int Offset) {
6951+ return SMLoc::getFromPointer (L.getPointer () + Offset);
6952+ }
6953+
69506954// / parseDirectiveArch
69516955// / ::= .arch token
69526956bool AArch64AsmParser::parseDirectiveArch (SMLoc L) {
6953- SMLoc ArchLoc = getLoc ();
6957+ SMLoc CurLoc = getLoc ();
69546958
69556959 StringRef Arch, ExtensionString;
69566960 std::tie (Arch, ExtensionString) =
69576961 getParser ().parseStringToEndOfStatement ().trim ().split (' +' );
69586962
69596963 const AArch64::ArchInfo *ArchInfo = AArch64::parseArch (Arch);
69606964 if (!ArchInfo)
6961- return Error (ArchLoc , " unknown arch name" );
6965+ return Error (CurLoc , " unknown arch name" );
69626966
69636967 if (parseToken (AsmToken::EndOfStatement))
69646968 return true ;
@@ -6978,27 +6982,30 @@ bool AArch64AsmParser::parseDirectiveArch(SMLoc L) {
69786982 ExtensionString.split (RequestedExtensions, ' +' );
69796983
69806984 ExpandCryptoAEK (*ArchInfo, RequestedExtensions);
6985+ CurLoc = incrementLoc (CurLoc, Arch.size ());
69816986
6982- FeatureBitset Features = STI.getFeatureBits ();
6983- setAvailableFeatures (ComputeAvailableFeatures (Features));
69846987 for (auto Name : RequestedExtensions) {
6988+ // Advance source location past '+'.
6989+ CurLoc = incrementLoc (CurLoc, 1 );
6990+
69856991 bool EnableFeature = !Name.consume_front_insensitive (" no" );
69866992
6987- for ( const auto &Extension : ExtensionMap ) {
6988- if ( Extension.Name != Name)
6989- continue ;
6993+ auto It = llvm::find_if (ExtensionMap, [&Name]( const auto &Extension) {
6994+ return Extension.Name == Name;
6995+ }) ;
69906996
6991- if (Extension. Features . none ( ))
6992- report_fatal_error ( " unsupported architectural extension: " + Name);
6997+ if (It == std::end (ExtensionMap ))
6998+ Error (CurLoc, " unsupported architectural extension: " + Name);
69936999
6994- FeatureBitset ToggleFeatures =
6995- EnableFeature
6996- ? STI.SetFeatureBitsTransitively (~Features & Extension.Features )
6997- : STI.ToggleFeature (Features & Extension.Features );
6998- setAvailableFeatures (ComputeAvailableFeatures (ToggleFeatures));
6999- break ;
7000- }
7000+ if (EnableFeature)
7001+ STI.SetFeatureBitsTransitively (It->Features );
7002+ else
7003+ STI.ClearFeatureBitsTransitively (It->Features );
7004+
7005+ CurLoc = incrementLoc (CurLoc, Name.size ());
70017006 }
7007+ FeatureBitset Features = ComputeAvailableFeatures (STI.getFeatureBits ());
7008+ setAvailableFeatures (Features);
70027009 return false ;
70037010}
70047011
@@ -7018,28 +7025,21 @@ bool AArch64AsmParser::parseDirectiveArchExtension(SMLoc L) {
70187025 Name = Name.substr (2 );
70197026 }
70207027
7021- MCSubtargetInfo &STI = copySTI ();
7022- FeatureBitset Features = STI.getFeatureBits ();
7023- for (const auto &Extension : ExtensionMap) {
7024- if (Extension.Name != Name)
7025- continue ;
7026-
7027- if (Extension.Features .none ())
7028- return Error (ExtLoc, " unsupported architectural extension: " + Name);
7029-
7030- FeatureBitset ToggleFeatures =
7031- EnableFeature
7032- ? STI.SetFeatureBitsTransitively (~Features & Extension.Features )
7033- : STI.ToggleFeature (Features & Extension.Features );
7034- setAvailableFeatures (ComputeAvailableFeatures (ToggleFeatures));
7035- return false ;
7036- }
7028+ auto It = llvm::find_if (ExtensionMap, [&Name](const auto &Extension) {
7029+ return Extension.Name == Name;
7030+ });
70377031
7038- return Error (ExtLoc, " unknown architectural extension: " + Name);
7039- }
7032+ if (It == std::end (ExtensionMap))
7033+ return Error (ExtLoc, " unsupported architectural extension: " + Name);
70407034
7041- static SMLoc incrementLoc (SMLoc L, int Offset) {
7042- return SMLoc::getFromPointer (L.getPointer () + Offset);
7035+ MCSubtargetInfo &STI = copySTI ();
7036+ if (EnableFeature)
7037+ STI.SetFeatureBitsTransitively (It->Features );
7038+ else
7039+ STI.ClearFeatureBitsTransitively (It->Features );
7040+ FeatureBitset Features = ComputeAvailableFeatures (STI.getFeatureBits ());
7041+ setAvailableFeatures (Features);
7042+ return false ;
70437043}
70447044
70457045// / parseDirectiveCPU
@@ -7075,30 +7075,22 @@ bool AArch64AsmParser::parseDirectiveCPU(SMLoc L) {
70757075
70767076 bool EnableFeature = !Name.consume_front_insensitive (" no" );
70777077
7078- bool FoundExtension = false ;
7079- for (const auto &Extension : ExtensionMap) {
7080- if (Extension.Name != Name)
7081- continue ;
7082-
7083- if (Extension.Features .none ())
7084- report_fatal_error (" unsupported architectural extension: " + Name);
7085-
7086- FeatureBitset Features = STI.getFeatureBits ();
7087- FeatureBitset ToggleFeatures =
7088- EnableFeature
7089- ? STI.SetFeatureBitsTransitively (~Features & Extension.Features )
7090- : STI.ToggleFeature (Features & Extension.Features );
7091- setAvailableFeatures (ComputeAvailableFeatures (ToggleFeatures));
7092- FoundExtension = true ;
7078+ auto It = llvm::find_if (ExtensionMap, [&Name](const auto &Extension) {
7079+ return Extension.Name == Name;
7080+ });
70937081
7094- break ;
7095- }
7082+ if (It == std::end (ExtensionMap))
7083+ Error (CurLoc, " unsupported architectural extension: " + Name);
70967084
7097- if (!FoundExtension)
7098- Error (CurLoc, " unsupported architectural extension" );
7085+ if (EnableFeature)
7086+ STI.SetFeatureBitsTransitively (It->Features );
7087+ else
7088+ STI.ClearFeatureBitsTransitively (It->Features );
70997089
71007090 CurLoc = incrementLoc (CurLoc, Name.size ());
71017091 }
7092+ FeatureBitset Features = ComputeAvailableFeatures (STI.getFeatureBits ());
7093+ setAvailableFeatures (Features);
71027094 return false ;
71037095}
71047096
0 commit comments