[llvm] 2db090a - [llvm][AsmPrinter] Restore source location to register clobber warning

David Spickett via llvm-commits llvm-commits at lists.llvm.org
Fri May 14 01:23:02 PDT 2021


Author: David Spickett
Date: 2021-05-14T08:22:57Z
New Revision: 2db090a2ebd76f120bfae4fbe4b7241667aa585e

URL: https://github.com/llvm/llvm-project/commit/2db090a2ebd76f120bfae4fbe4b7241667aa585e
DIFF: https://github.com/llvm/llvm-project/commit/2db090a2ebd76f120bfae4fbe4b7241667aa585e.diff

LOG: [llvm][AsmPrinter] Restore source location to register clobber warning

Since 5de2d189e6ad466a1f0616195e8c524a4eb3cbc0 this particular warning
hasn't had the location of the source file containing the inline
assembly.

Fix this by reporting via LLVMContext. Which means that we no longer
have the "instantiated into assembly here" lines but they were going to
point to the start of the inline asm string anyway.

This message is already tested via IR in llvm. However we won't have
the required location info there so I've added a C file test in clang
to cover it.
(though strictly, this is testing llvm code)

Reviewed By: ychen

Differential Revision: https://reviews.llvm.org/D102244

Added: 
    clang/test/Misc/inline-asm-clobber-warning.c

Modified: 
    llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp

Removed: 
    


################################################################################
diff  --git a/clang/test/Misc/inline-asm-clobber-warning.c b/clang/test/Misc/inline-asm-clobber-warning.c
new file mode 100644
index 0000000000000..69bd4809848b1
--- /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 <inline asm> 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
index 9f7c71c676a6e..c494510044bde 100644
--- 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 @@ void AsmPrinter::emitInlineAsm(const MachineInstr *MI) const {
   }
 
   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 @@ void AsmPrinter::emitInlineAsm(const MachineInstr *MI) const {
         "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,


        


More information about the llvm-commits mailing list