From 7263e3e5ca409aa6b08f765fae3615053532c594 Mon Sep 17 00:00:00 2001 From: Oliver Stannard Date: Tue, 26 Jul 2016 14:24:43 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@276748 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 12 ++++++--- .../directive-arch_extension-unsupported.s | 25 +++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 test/MC/ARM/directive-arch_extension-unsupported.s diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index 41379f0f190..9f7fb0612fe 100644 --- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -10505,7 +10505,7 @@ bool ARMAsmParser::parseDirectiveArchExtension(SMLoc L) { MCAsmParser &Parser = getParser(); if (getLexer().isNot(AsmToken::Identifier)) { - Error(getLexer().getLoc(), "unexpected token"); + Error(getLexer().getLoc(), "expected architecture extension name"); Parser.eatToEndOfStatement(); return false; } @@ -10520,15 +10520,19 @@ bool ARMAsmParser::parseDirectiveArchExtension(SMLoc L) { Name = Name.substr(2); } unsigned FeatureKind = ARM::parseArchExt(Name); - if (FeatureKind == ARM::AEK_INVALID) + if (FeatureKind == ARM::AEK_INVALID) { Error(ExtLoc, "unknown architectural extension: " + Name); + return false; + } for (const auto &Extension : Extensions) { if (Extension.Kind != FeatureKind) continue; - if (Extension.Features.none()) - report_fatal_error("unsupported architectural extension: " + Name); + if (Extension.Features.none()) { + Error(ExtLoc, "unsupported architectural extension: " + Name); + return false; + } if ((getAvailableFeatures() & Extension.ArchCheck) != Extension.ArchCheck) { Error(ExtLoc, "architectural extension '" + Name + "' is not " diff --git a/test/MC/ARM/directive-arch_extension-unsupported.s b/test/MC/ARM/directive-arch_extension-unsupported.s new file mode 100644 index 00000000000..0e959b51d4d --- /dev/null +++ b/test/MC/ARM/directive-arch_extension-unsupported.s @@ -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