diff options
author | Bob Wilson <bob.wilson@apple.com> | 2012-12-24 18:15:21 +0000 |
---|---|---|
committer | Bob Wilson <bob.wilson@apple.com> | 2012-12-24 18:15:21 +0000 |
commit | a0be09f511c68a88ee95b73c8f0ebd78156a559e (patch) | |
tree | 678964cde398eea6351973aba975ccec327aad3b /lib/VMCore | |
parent | fa45cdf646572cf11b03cfdaa63f75fd74fc7d34 (diff) | |
download | external_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.cpp | 29 |
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 //===----------------------------------------------------------------------===// |