[llvm] r276842 - [MC] Add command-line option to choose the max nest level in asm macros.

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 26 22:51:57 PDT 2016


Author: davide
Date: Wed Jul 27 00:51:56 2016
New Revision: 276842

URL: http://llvm.org/viewvc/llvm-project?rev=276842&view=rev
Log:
[MC] Add command-line option to choose the max nest level in asm macros.

Submitted by: t83wCSLq
Differential Revision:  https://reviews.llvm.org/D22313

Added:
    llvm/trunk/test/MC/AsmParser/macro-max-depth.s
Modified:
    llvm/trunk/lib/MC/MCParser/AsmParser.cpp

Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=276842&r1=276841&r2=276842&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
+++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Wed Jul 27 00:51:56 2016
@@ -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 <cctype>
 #include <deque>
+#include <sstream>
 #include <string>
 #include <vector>
 using namespace llvm;
 
 MCAsmParserSemaCallback::~MCAsmParserSemaCallback() {}
 
+static cl::opt<unsigned> 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<AsmToken> MCAsmMacroArgument;
@@ -2363,10 +2369,17 @@ void AsmParser::defineMacro(StringRef Na
 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))

Added: llvm/trunk/test/MC/AsmParser/macro-max-depth.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/macro-max-depth.s?rev=276842&view=auto
==============================================================================
--- llvm/trunk/test/MC/AsmParser/macro-max-depth.s (added)
+++ llvm/trunk/test/MC/AsmParser/macro-max-depth.s Wed Jul 27 00:51:56 2016
@@ -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.




More information about the llvm-commits mailing list