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:
parent
2818ac81d4
commit
13235011d5
@ -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 '$':
|
||||||
|
Loading…
Reference in New Issue
Block a user