summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp110
1 files changed, 32 insertions, 78 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
index 36604b46660..4159eb19423 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
@@ -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());
OpenPOWER on IntegriCloud