When an inline-asm diagnostic is reported by the backend, report it with the
authorJoey Gouly <joey.gouly@gmail.com>
Thu, 5 Jun 2014 21:23:42 +0000 (21:23 +0000)
committerJoey Gouly <joey.gouly@gmail.com>
Thu, 5 Jun 2014 21:23:42 +0000 (21:23 +0000)
correct severity.

Previously all inline-asm diagnostics were reported as errors.

llvm-svn: 210286

clang/lib/CodeGen/CodeGenAction.cpp
clang/test/CodeGen/arm-asm-deprecated.c [new file with mode: 0644]
clang/test/CodeGen/x86-64-inline-asm.c [new file with mode: 0644]

index a197fae..f593ccf 100644 (file)
@@ -297,13 +297,24 @@ void BackendConsumer::InlineAsmDiagHandler2(const llvm::SMDiagnostic &D,
   FullSourceLoc Loc;
   if (D.getLoc() != SMLoc())
     Loc = ConvertBackendLocation(D, Context->getSourceManager());
-  
 
+  unsigned DiagID;
+  switch (D.getKind()) {
+  case llvm::SourceMgr::DK_Error:
+    DiagID = diag::err_fe_inline_asm;
+    break;
+  case llvm::SourceMgr::DK_Warning:
+    DiagID = diag::warn_fe_inline_asm;
+    break;
+  case llvm::SourceMgr::DK_Note:
+    DiagID = diag::note_fe_inline_asm;
+    break;
+  }
   // If this problem has clang-level source location information, report the
-  // issue as being an error in the source with a note showing the instantiated
+  // issue in the source with a note showing the instantiated
   // code.
   if (LocCookie.isValid()) {
-    Diags.Report(LocCookie, diag::err_fe_inline_asm).AddString(Message);
+    Diags.Report(LocCookie, DiagID).AddString(Message);
     
     if (D.getLoc().isValid()) {
       DiagnosticBuilder B = Diags.Report(Loc, diag::note_fe_inline_asm_here);
@@ -319,10 +330,10 @@ void BackendConsumer::InlineAsmDiagHandler2(const llvm::SMDiagnostic &D,
     return;
   }
   
-  // Otherwise, report the backend error as occurring in the generated .s file.
-  // If Loc is invalid, we still need to report the error, it just gets no
+  // Otherwise, report the backend issue as occurring in the generated .s file.
+  // If Loc is invalid, we still need to report the issue, it just gets no
   // location info.
-  Diags.Report(Loc, diag::err_fe_inline_asm).AddString(Message);
+  Diags.Report(Loc, DiagID).AddString(Message);
 }
 
 #define ComputeDiagID(Severity, GroupName, DiagID)                             \
diff --git a/clang/test/CodeGen/arm-asm-deprecated.c b/clang/test/CodeGen/arm-asm-deprecated.c
new file mode 100644 (file)
index 0000000..d3229a6
--- /dev/null
@@ -0,0 +1,8 @@
+// REQUIRES: arm-registered-target
+// RUN: %clang_cc1 -triple armv8 -target-feature +neon %s -S -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK-v8
+// RUN: not %clang_cc1 -triple armv8 -target-feature +neon %s -S -o /dev/null -Werror 2>&1 | FileCheck %s --check-prefix=CHECK-v8-Werror
+
+void set_endian() {
+  asm("setend be"); // CHECK-v8: warning: deprecated 
+                    // CHECK-v8-Werror: error: deprecated
+}
diff --git a/clang/test/CodeGen/x86-64-inline-asm.c b/clang/test/CodeGen/x86-64-inline-asm.c
new file mode 100644 (file)
index 0000000..666d4c0
--- /dev/null
@@ -0,0 +1,7 @@
+// REQUIRES: x86-registered-target
+// RUN: %clang_cc1 -triple x86_64 %s -S -o /dev/null 2>&1 | FileCheck %s
+// RUN: not %clang_cc1 -triple x86_64 %s -S -o /dev/null -Werror 2>&1 | FileCheck %s --check-prefix=CHECK-Werror
+void f() {
+  asm("movaps %xmm3, (%esi, 2)"); // CHECK: warning: scale factor without index register is ignored
+                                  // CHECK-Werror: error: scale factor without index register is ignored
+}