aboutsummaryrefslogtreecommitdiffstats
path: root/lib/VMCore
diff options
context:
space:
mode:
authorBob Wilson <bob.wilson@apple.com>2012-12-24 18:15:21 +0000
committerBob Wilson <bob.wilson@apple.com>2012-12-24 18:15:21 +0000
commita0be09f511c68a88ee95b73c8f0ebd78156a559e (patch)
tree678964cde398eea6351973aba975ccec327aad3b /lib/VMCore
parentfa45cdf646572cf11b03cfdaa63f75fd74fc7d34 (diff)
downloadexternal_llvm-a0be09f511c68a88ee95b73c8f0ebd78156a559e.zip
external_llvm-a0be09f511c68a88ee95b73c8f0ebd78156a559e.tar.gz
external_llvm-a0be09f511c68a88ee95b73c8f0ebd78156a559e.tar.bz2
Add LLVMContext::emitWarning methods and use them. <rdar://problem/12867368>
When the backend is used from clang, it should produce proper diagnostics instead of just printing messages to errs(). Other clients may also want to register their own error handlers with the LLVMContext, and the same handler should work for warnings in the same way as the existing emitError methods. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171041 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore')
-rw-r--r--lib/VMCore/LLVMContext.cpp29
1 files changed, 28 insertions, 1 deletions
diff --git a/lib/VMCore/LLVMContext.cpp b/lib/VMCore/LLVMContext.cpp
index 68c4a76..bdb1b4b 100644
--- a/lib/VMCore/LLVMContext.cpp
+++ b/lib/VMCore/LLVMContext.cpp
@@ -97,16 +97,30 @@ void LLVMContext::emitError(const Twine &ErrorStr) {
emitError(0U, ErrorStr);
}
-void LLVMContext::emitError(const Instruction *I, const Twine &ErrorStr) {
+void LLVMContext::emitWarning(const Twine &ErrorStr) {
+ emitWarning(0U, ErrorStr);
+}
+
+static unsigned getSrcLocation(const Instruction *I) {
unsigned LocCookie = 0;
if (const MDNode *SrcLoc = I->getMetadata("srcloc")) {
if (SrcLoc->getNumOperands() != 0)
if (const ConstantInt *CI = dyn_cast<ConstantInt>(SrcLoc->getOperand(0)))
LocCookie = CI->getZExtValue();
}
+ return LocCookie;
+}
+
+void LLVMContext::emitError(const Instruction *I, const Twine &ErrorStr) {
+ unsigned LocCookie = getSrcLocation(I);
return emitError(LocCookie, ErrorStr);
}
+void LLVMContext::emitWarning(const Instruction *I, const Twine &ErrorStr) {
+ unsigned LocCookie = getSrcLocation(I);
+ return emitWarning(LocCookie, ErrorStr);
+}
+
void LLVMContext::emitError(unsigned LocCookie, const Twine &ErrorStr) {
// If there is no error handler installed, just print the error and exit.
if (pImpl->InlineAsmDiagHandler == 0) {
@@ -120,6 +134,19 @@ void LLVMContext::emitError(unsigned LocCookie, const Twine &ErrorStr) {
pImpl->InlineAsmDiagHandler(Diag, pImpl->InlineAsmDiagContext, LocCookie);
}
+void LLVMContext::emitWarning(unsigned LocCookie, const Twine &ErrorStr) {
+ // If there is no handler installed, just print the warning.
+ if (pImpl->InlineAsmDiagHandler == 0) {
+ errs() << "warning: " << ErrorStr << "\n";
+ return;
+ }
+
+ // If we do have a handler, we can report the warning.
+ SMDiagnostic Diag("", SourceMgr::DK_Warning, ErrorStr.str());
+
+ pImpl->InlineAsmDiagHandler(Diag, pImpl->InlineAsmDiagContext, LocCookie);
+}
+
//===----------------------------------------------------------------------===//
// Metadata Kind Uniquing
//===----------------------------------------------------------------------===//