mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-02 16:36:40 +00:00
[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
This commit is contained in:
parent
c2557e86c9
commit
cb015cb02a
@ -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 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))
|
||||
|
20
test/MC/AsmParser/macro-max-depth.s
Normal file
20
test/MC/AsmParser/macro-max-depth.s
Normal file
@ -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.
|
Loading…
Reference in New Issue
Block a user