diff --git a/clang/test/Misc/inline-asm-clobber-warning.c b/clang/test/Misc/inline-asm-clobber-warning.c new file mode 100644 --- /dev/null +++ b/clang/test/Misc/inline-asm-clobber-warning.c @@ -0,0 +1,21 @@ +/// This test checks that the warning includes the location in the C source +/// file that contains the inline asm. Instead of saying for both. +/// Although this warning is emitted in llvm it cannot be tested from IR as +/// it does not have that location information at that stage. + +// RUN: %clang -target arm-arm-none-eabi -march=armv7-m -c %s -o /dev/null \ +// RUN: 2>&1 | FileCheck %s + +// REQUIRES: arm-registered-target + +void bar(void) { + __asm__ __volatile__("nop" + : + : + : "sp"); +} + +// CHECK: inline-asm-clobber-warning.c:12:24: warning: inline asm clobber list contains reserved registers: SP [-Winline-asm] +// CHECK-NEXT: __asm__ __volatile__("nop" +// CHECK-NEXT: ^ +// CHECK-NEXT: inline-asm-clobber-warning.c:12:24: note: Reserved registers on the clobber list may not be preserved across the asm statement, and clobbering them may lead to undefined behaviour. diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp @@ -21,6 +21,7 @@ #include "llvm/CodeGen/TargetRegisterInfo.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DataLayout.h" +#include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/InlineAsm.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" @@ -527,11 +528,6 @@ } if (!RestrRegs.empty()) { - unsigned BufNum = addInlineAsmDiagBuffer(OS.str(), LocMD); - auto &SrcMgr = *MMI->getContext().getInlineSourceManager(); - SMLoc Loc = SMLoc::getFromPointer( - SrcMgr.getMemoryBuffer(BufNum)->getBuffer().begin()); - std::string Msg = "inline asm clobber list contains reserved registers: "; ListSeparator LS; for (const Register &RR : RestrRegs) { @@ -542,8 +538,10 @@ "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); + MMI->getModule()->getContext().diagnose(DiagnosticInfoInlineAsm( + LocCookie, Msg.c_str(), DiagnosticSeverity::DS_Warning)); + MMI->getModule()->getContext().diagnose( + DiagnosticInfoInlineAsm(LocCookie, Note, DiagnosticSeverity::DS_Note)); } emitInlineAsm(OS.str(), getSubtargetInfo(), TM.Options.MCOptions, LocMD,