summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
index d78283f53bc..41835729781 100644
--- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
+++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
@@ -1056,6 +1056,7 @@ bool X86AsmParser::VerifyAndAdjustOperands(OperandVector &OrigOperands,
assert(OrigOperands.size() == FinalOperands.size() + 1 &&
"Opernand size mismatch");
+ SmallVector<std::pair<SMLoc, std::string>, 2> Warnings;
// Verify types match
int RegClassID = -1;
for (unsigned int i = 0; i < FinalOperands.size(); ++i) {
@@ -1100,9 +1101,10 @@ bool X86AsmParser::VerifyAndAdjustOperands(OperandVector &OrigOperands,
if (FinalReg != OrigReg) {
std::string RegName = IsSI ? "ES:(R|E)SI" : "ES:(R|E)DI";
- Warning(OrigOp.getStartLoc(),
- "memory operand is only for determining the size, " +
- RegName + " will be used for the location");
+ Warnings.push_back(std::make_pair(
+ OrigOp.getStartLoc(),
+ "memory operand is only for determining the size, " + RegName +
+ " will be used for the location"));
}
FinalOp.Mem.Size = OrigOp.Mem.Size;
@@ -1111,7 +1113,14 @@ bool X86AsmParser::VerifyAndAdjustOperands(OperandVector &OrigOperands,
}
}
- // Remove old operandss
+ // Produce warnings only if all the operands passed the adjustment - prevent
+ // legal cases like "movsd (%rax), %xmm0" mistakenly produce warnings
+ for (auto WarningMsg = Warnings.begin(); WarningMsg < Warnings.end();
+ ++WarningMsg) {
+ Warning((*WarningMsg).first, (*WarningMsg).second);
+ }
+
+ // Remove old operands
for (unsigned int i = 0; i < FinalOperands.size(); ++i)
OrigOperands.pop_back();
}
OpenPOWER on IntegriCloud