mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 06:30:16 +00:00
[ms-inline asm] Remove the brackets from X86Operand in the IR. These will be
added back in by X86AsmPrinter::printIntelMemReference() during codegen. Previously, this following example void t() { int i; __asm mov eax, [i] } would generate the below assembly mov eax, dword ptr [[eax]] which resulted in a fatal error when compiling. Test case coming on the clang side. rdar://13444264 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177440 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d3e7416de7
commit
0f7ccd279d
@ -4181,24 +4181,31 @@ AsmParser::parseMSInlineAsm(void *AsmLoc, std::string &AsmString,
|
||||
std::string AsmStringIR;
|
||||
AsmRewriteKind PrevKind = AOK_Imm;
|
||||
raw_string_ostream OS(AsmStringIR);
|
||||
const char *Start = SrcMgr.getMemoryBuffer(0)->getBufferStart();
|
||||
const char *AsmStart = SrcMgr.getMemoryBuffer(0)->getBufferStart();
|
||||
const char *AsmEnd = SrcMgr.getMemoryBuffer(0)->getBufferEnd();
|
||||
array_pod_sort(AsmStrRewrites.begin(), AsmStrRewrites.end(), RewritesSort);
|
||||
for (SmallVectorImpl<AsmRewrite>::iterator I = AsmStrRewrites.begin(),
|
||||
E = AsmStrRewrites.end();
|
||||
I != E; ++I) {
|
||||
const char *Loc = (*I).Loc.getPointer();
|
||||
assert(Loc >= Start && "Expected Loc to be at or after Start!");
|
||||
assert(Loc >= AsmStart && "Expected Loc to be at or after Start!");
|
||||
|
||||
unsigned AdditionalSkip = 0;
|
||||
AsmRewriteKind Kind = (*I).Kind;
|
||||
|
||||
// Emit everything up to the immediate/expression.
|
||||
OS << StringRef(Start, Loc - Start);
|
||||
unsigned Len = Loc - AsmStart;
|
||||
if (Len) {
|
||||
// For Input/Output operands we need to remove the brackets, if present.
|
||||
if ((Kind == AOK_Input || Kind == AOK_Output) && Loc[-1] == '[')
|
||||
--Len;
|
||||
OS << StringRef(AsmStart, Len);
|
||||
}
|
||||
PrevKind = Kind;
|
||||
|
||||
// Skip the original expression.
|
||||
if (Kind == AOK_Skip) {
|
||||
Start = Loc + (*I).Len;
|
||||
AsmStart = Loc + (*I).Len;
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -4247,13 +4254,17 @@ AsmParser::parseMSInlineAsm(void *AsmLoc, std::string &AsmString,
|
||||
}
|
||||
|
||||
// Skip the original expression.
|
||||
Start = Loc + (*I).Len + AdditionalSkip;
|
||||
AsmStart = Loc + (*I).Len + AdditionalSkip;
|
||||
|
||||
// For Input/Output operands we need to remove the brackets, if present.
|
||||
if ((Kind == AOK_Input || Kind == AOK_Output) && AsmStart != AsmEnd &&
|
||||
*AsmStart == ']')
|
||||
++AsmStart;
|
||||
}
|
||||
|
||||
// Emit the remainder of the asm string.
|
||||
const char *AsmEnd = SrcMgr.getMemoryBuffer(0)->getBufferEnd();
|
||||
if (Start != AsmEnd)
|
||||
OS << StringRef(Start, AsmEnd - Start);
|
||||
if (AsmStart != AsmEnd)
|
||||
OS << StringRef(AsmStart, AsmEnd - AsmStart);
|
||||
|
||||
AsmString = OS.str();
|
||||
return false;
|
||||
|
Loading…
x
Reference in New Issue
Block a user