[ARM] Improve error messages for .arch_extension directive

- More informative message when extension name is not an identifier token.
- Stop parsing directive if extension is unknown (avoid duplicate error
  messages).
- Report unsupported extensions with a source location, rather than
  report_fatal_error.

Differential Revision: https://reviews.llvm.org/D22806

llvm-svn: 276748
This commit is contained in:
Oliver Stannard 2016-07-26 14:24:43 +00:00
parent 2171828a49
commit 1c6e591457
2 changed files with 33 additions and 4 deletions

View File

@ -10505,7 +10505,7 @@ bool ARMAsmParser::parseDirectiveArchExtension(SMLoc L) {
MCAsmParser &Parser = getParser(); MCAsmParser &Parser = getParser();
if (getLexer().isNot(AsmToken::Identifier)) { if (getLexer().isNot(AsmToken::Identifier)) {
Error(getLexer().getLoc(), "unexpected token"); Error(getLexer().getLoc(), "expected architecture extension name");
Parser.eatToEndOfStatement(); Parser.eatToEndOfStatement();
return false; return false;
} }
@ -10520,15 +10520,19 @@ bool ARMAsmParser::parseDirectiveArchExtension(SMLoc L) {
Name = Name.substr(2); Name = Name.substr(2);
} }
unsigned FeatureKind = ARM::parseArchExt(Name); unsigned FeatureKind = ARM::parseArchExt(Name);
if (FeatureKind == ARM::AEK_INVALID) if (FeatureKind == ARM::AEK_INVALID) {
Error(ExtLoc, "unknown architectural extension: " + Name); Error(ExtLoc, "unknown architectural extension: " + Name);
return false;
}
for (const auto &Extension : Extensions) { for (const auto &Extension : Extensions) {
if (Extension.Kind != FeatureKind) if (Extension.Kind != FeatureKind)
continue; continue;
if (Extension.Features.none()) if (Extension.Features.none()) {
report_fatal_error("unsupported architectural extension: " + Name); Error(ExtLoc, "unsupported architectural extension: " + Name);
return false;
}
if ((getAvailableFeatures() & Extension.ArchCheck) != Extension.ArchCheck) { if ((getAvailableFeatures() & Extension.ArchCheck) != Extension.ArchCheck) {
Error(ExtLoc, "architectural extension '" + Name + "' is not " Error(ExtLoc, "architectural extension '" + Name + "' is not "

View File

@ -0,0 +1,25 @@
@ RUN: not llvm-mc -triple armv7--none-eabi -filetype asm -o /dev/null 2>&1 %s | FileCheck %s
.arch_extension os
CHECK: error: unsupported architectural extension: os
.arch_extension iwmmxt
CHECK: error: unsupported architectural extension: iwmmxt
.arch_extension iwmmxt2
CHECK: error: unsupported architectural extension: iwmmxt2
.arch_extension maverick
CHECK: error: unsupported architectural extension: maverick
.arch_extension xscale
CHECK: error: unsupported architectural extension: xscale
.arch_extension invalid_extension_name
CHECK: error: unknown architectural extension: invalid_extension_name
.arch_extension 42
CHECK: error: expected architecture extension name
.arch_extension
CHECK: error: expected architecture extension name