Escape % in diagnostic message when compiling LLVM IR.

% 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 %.

llvm-svn: 152956
This commit is contained in:
Benjamin Kramer 2012-03-16 22:31:42 +00:00
parent 6e177d3155
commit 778b8b84b8
2 changed files with 13 additions and 3 deletions

View 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;

View 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
}