mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-10 06:25:01 +00:00
revert '[CodeGen] emit inline asm clobber list warnings for reserved'
llvm-svn: 339274
This commit is contained in:
parent
7a1c2358ef
commit
ede7d8a446
@ -631,11 +631,6 @@ private:
|
||||
/// inline asm.
|
||||
void EmitInlineAsm(const MachineInstr *MI) const;
|
||||
|
||||
/// Add inline assembly info to the diagnostics machinery, so we can
|
||||
/// emit file and position info. Returns SrcMgr memory buffer position.
|
||||
unsigned addInlineAsmDiagBuffer(StringRef AsmStr,
|
||||
const MDNode *LocMDNode) const;
|
||||
|
||||
//===------------------------------------------------------------------===//
|
||||
// Internal Implementation Details
|
||||
//===------------------------------------------------------------------===//
|
||||
|
@ -71,42 +71,6 @@ static void srcMgrDiagHandler(const SMDiagnostic &Diag, void *diagInfo) {
|
||||
DiagInfo->DiagHandler(Diag, DiagInfo->DiagContext, LocCookie);
|
||||
}
|
||||
|
||||
unsigned AsmPrinter::addInlineAsmDiagBuffer(StringRef AsmStr,
|
||||
const MDNode *LocMDNode) const {
|
||||
if (!DiagInfo) {
|
||||
DiagInfo = make_unique<SrcMgrDiagInfo>();
|
||||
|
||||
MCContext &Context = MMI->getContext();
|
||||
Context.setInlineSourceManager(&DiagInfo->SrcMgr);
|
||||
|
||||
LLVMContext &LLVMCtx = MMI->getModule()->getContext();
|
||||
if (LLVMCtx.getInlineAsmDiagnosticHandler()) {
|
||||
DiagInfo->DiagHandler = LLVMCtx.getInlineAsmDiagnosticHandler();
|
||||
DiagInfo->DiagContext = LLVMCtx.getInlineAsmDiagnosticContext();
|
||||
DiagInfo->SrcMgr.setDiagHandler(srcMgrDiagHandler, DiagInfo.get());
|
||||
}
|
||||
}
|
||||
|
||||
SourceMgr &SrcMgr = DiagInfo->SrcMgr;
|
||||
|
||||
std::unique_ptr<MemoryBuffer> Buffer;
|
||||
// The inline asm source manager will outlive AsmStr, so make a copy of the
|
||||
// string for SourceMgr to own.
|
||||
Buffer = MemoryBuffer::getMemBufferCopy(AsmStr, "<inline asm>");
|
||||
|
||||
// Tell SrcMgr about this buffer, it takes ownership of the buffer.
|
||||
unsigned BufNum = SrcMgr.AddNewSourceBuffer(std::move(Buffer), SMLoc());
|
||||
|
||||
// Store LocMDNode in DiagInfo, using BufNum as an identifier.
|
||||
if (LocMDNode) {
|
||||
DiagInfo->LocInfos.resize(BufNum);
|
||||
DiagInfo->LocInfos[BufNum - 1] = LocMDNode;
|
||||
}
|
||||
|
||||
return BufNum;
|
||||
}
|
||||
|
||||
|
||||
/// EmitInlineAsm - Emit a blob of inline asm to the output streamer.
|
||||
void AsmPrinter::EmitInlineAsm(StringRef Str, const MCSubtargetInfo &STI,
|
||||
const MCTargetOptions &MCOptions,
|
||||
@ -134,11 +98,39 @@ void AsmPrinter::EmitInlineAsm(StringRef Str, const MCSubtargetInfo &STI,
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned BufNum = addInlineAsmDiagBuffer(Str, LocMDNode);
|
||||
DiagInfo->SrcMgr.setIncludeDirs(MCOptions.IASSearchPaths);
|
||||
if (!DiagInfo) {
|
||||
DiagInfo = make_unique<SrcMgrDiagInfo>();
|
||||
|
||||
std::unique_ptr<MCAsmParser> Parser(createMCAsmParser(
|
||||
DiagInfo->SrcMgr, OutContext, *OutStreamer, *MAI, BufNum));
|
||||
MCContext &Context = MMI->getContext();
|
||||
Context.setInlineSourceManager(&DiagInfo->SrcMgr);
|
||||
|
||||
LLVMContext &LLVMCtx = MMI->getModule()->getContext();
|
||||
if (LLVMCtx.getInlineAsmDiagnosticHandler()) {
|
||||
DiagInfo->DiagHandler = LLVMCtx.getInlineAsmDiagnosticHandler();
|
||||
DiagInfo->DiagContext = LLVMCtx.getInlineAsmDiagnosticContext();
|
||||
DiagInfo->SrcMgr.setDiagHandler(srcMgrDiagHandler, DiagInfo.get());
|
||||
}
|
||||
}
|
||||
|
||||
SourceMgr &SrcMgr = DiagInfo->SrcMgr;
|
||||
SrcMgr.setIncludeDirs(MCOptions.IASSearchPaths);
|
||||
|
||||
std::unique_ptr<MemoryBuffer> Buffer;
|
||||
// The inline asm source manager will outlive Str, so make a copy of the
|
||||
// string for SourceMgr to own.
|
||||
Buffer = MemoryBuffer::getMemBufferCopy(Str, "<inline asm>");
|
||||
|
||||
// Tell SrcMgr about this buffer, it takes ownership of the buffer.
|
||||
unsigned BufNum = SrcMgr.AddNewSourceBuffer(std::move(Buffer), SMLoc());
|
||||
|
||||
// Store LocMDNode in DiagInfo, using BufNum as an identifier.
|
||||
if (LocMDNode) {
|
||||
DiagInfo->LocInfos.resize(BufNum);
|
||||
DiagInfo->LocInfos[BufNum-1] = LocMDNode;
|
||||
}
|
||||
|
||||
std::unique_ptr<MCAsmParser> Parser(
|
||||
createMCAsmParser(SrcMgr, OutContext, *OutStreamer, *MAI, BufNum));
|
||||
|
||||
// Do not use assembler-level information for parsing inline assembly.
|
||||
OutStreamer->setUseAssemblerInfoForParsing(false);
|
||||
@ -527,44 +519,6 @@ void AsmPrinter::EmitInlineAsm(const MachineInstr *MI) const {
|
||||
MCOptions.SanitizeAddress =
|
||||
MF->getFunction().hasFnAttribute(Attribute::SanitizeAddress);
|
||||
|
||||
// Emit warnings if we use reserved registers on the clobber list, as
|
||||
// that might give surprising results.
|
||||
std::vector<std::string> RestrRegs;
|
||||
// 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();
|
||||
if (InlineAsm::getKind(Flags) == InlineAsm::Kind_Clobber &&
|
||||
MF->getRegInfo().isReserved(MI->getOperand(I + 1).getReg())) {
|
||||
const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
|
||||
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 (!RestrRegs.empty()) {
|
||||
unsigned BufNum = addInlineAsmDiagBuffer(OS.str(), LocMD);
|
||||
auto &SrcMgr = DiagInfo->SrcMgr;
|
||||
SMLoc Loc = SMLoc::getFromPointer(
|
||||
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++) {
|
||||
if(I != RestrRegs.begin())
|
||||
Msg += ", ";
|
||||
Msg += *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.";
|
||||
SrcMgr.PrintMessage(Loc, SourceMgr::DK_Warning, Msg);
|
||||
SrcMgr.PrintMessage(Loc, SourceMgr::DK_Note, Note);
|
||||
}
|
||||
|
||||
EmitInlineAsm(OS.str(), getSubtargetInfo(), MCOptions, LocMD,
|
||||
MI->getInlineAsmDialect());
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user