From 1c6e5914576acfcf6234359a1a2a239841e75f2f 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 llvm-svn: 276748 --- llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 12 +++++++---- .../MC/ARM/directive-arch_extension-unsupported.s | 25 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 llvm/test/MC/ARM/directive-arch_extension-unsupported.s diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index 41379f0..9f7fb06 100644 --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/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/llvm/test/MC/ARM/directive-arch_extension-unsupported.s b/llvm/test/MC/ARM/directive-arch_extension-unsupported.s new file mode 100644 index 0000000..0e959b5 --- /dev/null +++ b/llvm/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 -- 2.7.4