From cb015cb02acd90d4ee2bb6c75b060980b923c3b0 Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Wed, 27 Jul 2016 05:51:56 +0000 Subject: [PATCH] [MC] Add command-line option to choose the max nest level in asm macros. Submitted by: t83wCSLq Differential Revision: https://reviews.llvm.org/D22313 llvm-svn: 276842 --- lib/MC/MCParser/AsmParser.cpp | 21 +++++++++++++++++---- test/MC/AsmParser/macro-max-depth.s | 20 ++++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 test/MC/AsmParser/macro-max-depth.s diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index 8f2ee7f1163..d85f1c613c7 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -34,6 +34,7 @@ #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCValue.h" +#include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/MemoryBuffer.h" @@ -41,12 +42,17 @@ #include "llvm/Support/raw_ostream.h" #include #include +#include #include #include using namespace llvm; MCAsmParserSemaCallback::~MCAsmParserSemaCallback() {} +static cl::opt AsmMacroMaxNestingDepth( + "asm-macro-max-nesting-depth", cl::init(20), cl::Hidden, + cl::desc("The maximum nesting depth allowed for assembly macros.")); + namespace { /// \brief Helper types for tracking macro definitions. typedef std::vector MCAsmMacroArgument; @@ -2363,10 +2369,17 @@ void AsmParser::defineMacro(StringRef Name, MCAsmMacro Macro) { void AsmParser::undefineMacro(StringRef Name) { MacroMap.erase(Name); } bool AsmParser::handleMacroEntry(const MCAsmMacro *M, SMLoc NameLoc) { - // Arbitrarily limit macro nesting depth, to match 'as'. We can eliminate - // this, although we should protect against infinite loops. - if (ActiveMacros.size() == 20) - return TokError("macros cannot be nested more than 20 levels deep"); + // Arbitrarily limit macro nesting depth (default matches 'as'). We can + // eliminate this, although we should protect against infinite loops. + unsigned MaxNestingDepth = AsmMacroMaxNestingDepth; + if (ActiveMacros.size() == MaxNestingDepth) { + std::ostringstream MaxNestingDepthError; + MaxNestingDepthError << "macros cannot be nested more than " + << MaxNestingDepth << " levels deep." + << " Use -asm-macro-max-nesting-depth to increase " + "this limit."; + return TokError(MaxNestingDepthError.str()); + } MCAsmMacroArguments A; if (parseMacroArguments(M, A)) diff --git a/test/MC/AsmParser/macro-max-depth.s b/test/MC/AsmParser/macro-max-depth.s new file mode 100644 index 00000000000..47fbf9a1930 --- /dev/null +++ b/test/MC/AsmParser/macro-max-depth.s @@ -0,0 +1,20 @@ +// RUN: llvm-mc -triple x86_64-unknown-unknown -asm-macro-max-nesting-depth=42 %s | FileCheck %s -check-prefix=CHECK_PASS +// RUN: not llvm-mc -triple x86_64-unknown-unknown %s 2> %t +// RUN: FileCheck -check-prefix=CHECK_FAIL < %t %s + +.macro rec head, tail:vararg + .ifnb \tail + rec \tail + .else + .long 42 + .endif +.endm + +.macro amplify macro, args:vararg + \macro \args \args \args \args +.endm + +amplify rec 0 0 0 0 0 0 0 0 0 0 + +// CHECK_PASS: .long 42 +// CHECK_FAIL: error: macros cannot be nested more than {{[0-9]+}} levels deep. Use -asm-macro-max-nesting-depth to increase this limit.