Reduce the number of memory allocations when displaying
a warning about clobbering reserved registers (NFC). Also address some minor inefficiencies and style issues. Differential Revision: https://reviews.llvm.org/D86088
This commit is contained in:
parent
8248c2af94
commit
eb482afaf5
|
@ -11,6 +11,7 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "llvm/CodeGen/AsmPrinter.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
|
@ -547,22 +548,23 @@ void AsmPrinter::emitInlineAsm(const MachineInstr *MI) const {
|
|||
EmitMSInlineAsmStr(AsmStr, MI, MMI, AP, LocCookie, OS);
|
||||
|
||||
// Emit warnings if we use reserved registers on the clobber list, as
|
||||
// that might give surprising results.
|
||||
std::vector<std::string> RestrRegs;
|
||||
// that might lead to undefined behaviour.
|
||||
SmallVector<Register, 8> RestrRegs;
|
||||
const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
|
||||
// Start with the first operand descriptor, and iterate over them.
|
||||
for (unsigned I = InlineAsm::MIOp_FirstOperand, NumOps = MI->getNumOperands();
|
||||
I < NumOps; ++I) {
|
||||
const MachineOperand &MO = MI->getOperand(I);
|
||||
if (MO.isImm()) {
|
||||
unsigned Flags = MO.getImm();
|
||||
const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
|
||||
if (InlineAsm::getKind(Flags) == InlineAsm::Kind_Clobber &&
|
||||
!TRI->isAsmClobberable(*MF, MI->getOperand(I + 1).getReg())) {
|
||||
RestrRegs.push_back(TRI->getName(MI->getOperand(I + 1).getReg()));
|
||||
}
|
||||
// Skip to one before the next operand descriptor, if it exists.
|
||||
I += InlineAsm::getNumOperandRegisters(Flags);
|
||||
if (!MO.isImm())
|
||||
continue;
|
||||
unsigned Flags = MO.getImm();
|
||||
if (InlineAsm::getKind(Flags) == InlineAsm::Kind_Clobber) {
|
||||
Register Reg = MI->getOperand(I + 1).getReg();
|
||||
if (!TRI->isAsmClobberable(*MF, Reg))
|
||||
RestrRegs.push_back(Reg);
|
||||
}
|
||||
// Skip to one before the next operand descriptor, if it exists.
|
||||
I += InlineAsm::getNumOperandRegisters(Flags);
|
||||
}
|
||||
|
||||
if (!RestrRegs.empty()) {
|
||||
|
@ -572,14 +574,15 @@ void AsmPrinter::emitInlineAsm(const MachineInstr *MI) const {
|
|||
SrcMgr.getMemoryBuffer(BufNum)->getBuffer().begin());
|
||||
|
||||
std::string Msg = "inline asm clobber list contains reserved registers: ";
|
||||
for (auto I = RestrRegs.begin(), E = RestrRegs.end(); I != E; I++) {
|
||||
for (auto I = RestrRegs.begin(), E = RestrRegs.end(); I != E; ++I) {
|
||||
if(I != RestrRegs.begin())
|
||||
Msg += ", ";
|
||||
Msg += *I;
|
||||
Msg += TRI->getName(*I);
|
||||
}
|
||||
std::string Note = "Reserved registers on the clobber list may not be "
|
||||
"preserved across the asm statement, and clobbering them may "
|
||||
"lead to undefined behaviour.";
|
||||
const char *Note =
|
||||
"Reserved registers on the clobber list may not be "
|
||||
"preserved across the asm statement, and clobbering them may "
|
||||
"lead to undefined behaviour.";
|
||||
SrcMgr.PrintMessage(Loc, SourceMgr::DK_Warning, Msg);
|
||||
SrcMgr.PrintMessage(Loc, SourceMgr::DK_Note, Note);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue