Pull in r201784 from upstream llvm trunk (by Benjamin Kramer):

AsmParser: Disable Darwin-style macro argument expansion on non-darwin targets.

  There is code in the wild that relies on $0 not being expanded.

This fixes some cases of using $ signs in literals being incorrectly
assembled.

Reported by:	Richard Henderson
Upstream PR:	http://llvm.org/PR21500
MFC after:	3 days
This commit is contained in:
Dimitry Andric 2014-11-08 13:19:48 +00:00
parent 2818ac81d4
commit 13235011d5

View File

@ -1695,7 +1695,7 @@ bool AsmParser::expandMacro(raw_svector_ostream &OS, StringRef Body,
const MCAsmMacroParameters &Parameters, const MCAsmMacroParameters &Parameters,
const MCAsmMacroArguments &A, const SMLoc &L) { const MCAsmMacroArguments &A, const SMLoc &L) {
unsigned NParameters = Parameters.size(); unsigned NParameters = Parameters.size();
if (NParameters != 0 && NParameters != A.size()) if ((!IsDarwin || NParameters != 0) && NParameters != A.size())
return Error(L, "Wrong number of arguments"); return Error(L, "Wrong number of arguments");
// A macro without parameters is handled differently on Darwin: // A macro without parameters is handled differently on Darwin:
@ -1705,7 +1705,7 @@ bool AsmParser::expandMacro(raw_svector_ostream &OS, StringRef Body,
std::size_t End = Body.size(), Pos = 0; std::size_t End = Body.size(), Pos = 0;
for (; Pos != End; ++Pos) { for (; Pos != End; ++Pos) {
// Check for a substitution or escape. // Check for a substitution or escape.
if (!NParameters) { if (IsDarwin && !NParameters) {
// This macro has no parameters, look for $0, $1, etc. // This macro has no parameters, look for $0, $1, etc.
if (Body[Pos] != '$' || Pos + 1 == End) if (Body[Pos] != '$' || Pos + 1 == End)
continue; continue;
@ -1728,7 +1728,7 @@ bool AsmParser::expandMacro(raw_svector_ostream &OS, StringRef Body,
if (Pos == End) if (Pos == End)
break; break;
if (!NParameters) { if (IsDarwin && !NParameters) {
switch (Body[Pos + 1]) { switch (Body[Pos + 1]) {
// $$ => $ // $$ => $
case '$': case '$':