]> granicus.if.org Git - clang/commitdiff
Escape % in diagnostic message when compiling LLVM IR.
authorBenjamin Kramer <benny.kra@googlemail.com>
Fri, 16 Mar 2012 22:31:42 +0000 (22:31 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Fri, 16 Mar 2012 22:31:42 +0000 (22:31 +0000)
% is a common character in IR so we'd crash on almost any malformed IR. The
diagnostic formatter expects a formatting directive when it sees an unescaped %.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152956 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenAction.cpp
test/Frontend/ir-support-errors.ll

index 6a184e0ef921e353ebb5623956aee0e7f9e72f00..dd32167b84779132af3c043e2e4d159ef7d1045f 100644 (file)
@@ -23,6 +23,7 @@
 #include "llvm/Module.h"
 #include "llvm/Pass.h"
 #include "llvm/ADT/OwningPtr.h"
+#include "llvm/ADT/SmallString.h"
 #include "llvm/Bitcode/ReaderWriter.h"
 #include "llvm/Support/IRReader.h"
 #include "llvm/Support/MemoryBuffer.h"
@@ -393,8 +394,17 @@ void CodeGenAction::ExecuteAction() {
       StringRef Msg = Err.getMessage();
       if (Msg.startswith("error: "))
         Msg = Msg.substr(7);
+
+      // Escape '%', which is interpreted as a format character.
+      llvm::SmallString<128> EscapedMessage;
+      for (unsigned i = 0, e = Msg.size(); i != e; ++i) {
+        if (Msg[i] == '%')
+          EscapedMessage += '%';
+        EscapedMessage += Msg[i];
+      }
+
       unsigned DiagID = CI.getDiagnostics().getCustomDiagID(
-          DiagnosticsEngine::Error, Msg);
+          DiagnosticsEngine::Error, EscapedMessage);
 
       CI.getDiagnostics().Report(Loc, DiagID);
       return;
index 98227d46f7ae8604537ba3f730044da82163a9bd..cb5913cd3af81efd279596a489e88f855aefbaaa 100644 (file)
@@ -3,6 +3,6 @@
 target triple = "x86_64-apple-darwin10"
 
 define i32 @f0() nounwind ssp {
-; CHECK: {{.*}}ir-support-errors.ll:7:16: error: expected value token
-       ret i32 x
+; CHECK: {{.*}}ir-support-errors.ll:7:16: error: use of undefined value '%x'
+       ret i32 %x
 }