summaryrefslogtreecommitdiffstats
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
commit4ed23578daa2ab659255511885f998d8876354d8 (patch)
treea1b75c77a95d2193da1e22e3816e52f64615471c
parent06b84eb414b76f6513c56a08c898a60d4d121987 (diff)
downloadbcm5719-llvm-4ed23578daa2ab659255511885f998d8876354d8.tar.gz
bcm5719-llvm-4ed23578daa2ab659255511885f998d8876354d8.zip
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. llvm-svn: 171041
-rw-r--r--llvm/include/llvm/LLVMContext.h6
-rw-r--r--llvm/lib/Analysis/ProfileDataLoaderPass.cpp4
-rw-r--r--llvm/lib/Analysis/ProfileInfoLoaderPass.cpp17
-rw-r--r--llvm/lib/CodeGen/IntrinsicLowering.cpp36
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp5
-rw-r--r--llvm/lib/Transforms/Instrumentation/EdgeProfiling.cpp5
-rw-r--r--llvm/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp5
-rw-r--r--llvm/lib/Transforms/Instrumentation/PathProfiling.cpp4
-rw-r--r--llvm/lib/VMCore/LLVMContext.cpp29
9 files changed, 78 insertions, 33 deletions
diff --git a/llvm/include/llvm/LLVMContext.h b/llvm/include/llvm/LLVMContext.h
index 5903e2e55e1..a5a26946b77 100644
--- a/llvm/include/llvm/LLVMContext.h
+++ b/llvm/include/llvm/LLVMContext.h
@@ -89,6 +89,12 @@ public:
void emitError(const Instruction *I, const Twine &ErrorStr);
void emitError(const Twine &ErrorStr);
+ /// emitWarning - This is similar to emitError but it emits a warning instead
+ /// of an error.
+ void emitWarning(unsigned LocCookie, const Twine &ErrorStr);
+ void emitWarning(const Instruction *I, const Twine &ErrorStr);
+ void emitWarning(const Twine &ErrorStr);
+
private:
LLVMContext(LLVMContext&) LLVM_DELETED_FUNCTION;
void operator=(LLVMContext&) LLVM_DELETED_FUNCTION;
diff --git a/llvm/lib/Analysis/ProfileDataLoaderPass.cpp b/llvm/lib/Analysis/ProfileDataLoaderPass.cpp
index 604541f4fdc..af12c4d4a39 100644
--- a/llvm/lib/Analysis/ProfileDataLoaderPass.cpp
+++ b/llvm/lib/Analysis/ProfileDataLoaderPass.cpp
@@ -177,8 +177,8 @@ bool ProfileMetadataLoaderPass::runOnModule(Module &M) {
unsigned ReadCount = matchEdges(M, PB, Counters);
if (ReadCount != Counters.size()) {
- errs() << "WARNING: profile information is inconsistent with "
- << "the current program!\n";
+ M.getContext().emitWarning("profile information is inconsistent "
+ "with the current program");
}
NumEdgesRead = ReadCount;
diff --git a/llvm/lib/Analysis/ProfileInfoLoaderPass.cpp b/llvm/lib/Analysis/ProfileInfoLoaderPass.cpp
index 2f3486cb449..8e6d1c2ecb9 100644
--- a/llvm/lib/Analysis/ProfileInfoLoaderPass.cpp
+++ b/llvm/lib/Analysis/ProfileInfoLoaderPass.cpp
@@ -19,6 +19,7 @@
#include "llvm/Analysis/ProfileInfoLoader.h"
#include "llvm/BasicBlock.h"
#include "llvm/InstrTypes.h"
+#include "llvm/LLVMContext.h"
#include "llvm/Module.h"
#include "llvm/Pass.h"
#include "llvm/Support/CFG.h"
@@ -170,8 +171,8 @@ bool LoaderPass::runOnModule(Module &M) {
}
}
if (ReadCount != Counters.size()) {
- errs() << "WARNING: profile information is inconsistent with "
- << "the current program!\n";
+ M.getContext().emitWarning("profile information is inconsistent "
+ "with the current program");
}
NumEdgesRead = ReadCount;
}
@@ -218,8 +219,8 @@ bool LoaderPass::runOnModule(Module &M) {
}
}
if (ReadCount != Counters.size()) {
- errs() << "WARNING: profile information is inconsistent with "
- << "the current program!\n";
+ M.getContext().emitWarning("profile information is inconsistent "
+ "with the current program");
}
NumEdgesRead = ReadCount;
}
@@ -239,8 +240,8 @@ bool LoaderPass::runOnModule(Module &M) {
BlockInformation[F][BB] = (double)Counters[ReadCount++];
}
if (ReadCount != Counters.size()) {
- errs() << "WARNING: profile information is inconsistent with "
- << "the current program!\n";
+ M.getContext().emitWarning("profile information is inconsistent "
+ "with the current program");
}
}
@@ -258,8 +259,8 @@ bool LoaderPass::runOnModule(Module &M) {
FunctionInformation[F] = (double)Counters[ReadCount++];
}
if (ReadCount != Counters.size()) {
- errs() << "WARNING: profile information is inconsistent with "
- << "the current program!\n";
+ M.getContext().emitWarning("profile information is inconsistent "
+ "with the current program");
}
}
diff --git a/llvm/lib/CodeGen/IntrinsicLowering.cpp b/llvm/lib/CodeGen/IntrinsicLowering.cpp
index 698d289f13c..f289a9beacb 100644
--- a/llvm/lib/CodeGen/IntrinsicLowering.cpp
+++ b/llvm/lib/CodeGen/IntrinsicLowering.cpp
@@ -413,22 +413,30 @@ void IntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
}
case Intrinsic::stacksave:
- case Intrinsic::stackrestore: {
if (!Warned)
- errs() << "WARNING: this target does not support the llvm.stack"
- << (Callee->getIntrinsicID() == Intrinsic::stacksave ?
- "save" : "restore") << " intrinsic.\n";
+ Context.emitWarning("this target does not support the "
+ "llvm.stacksave intrinsic");
+ Warned = true;
+ CI->replaceAllUsesWith(Constant::getNullValue(CI->getType()));
+ break;
+
+ case Intrinsic::stackrestore:
+ if (!Warned)
+ Context.emitWarning("this target does not support the "
+ "llvm.stackrestore intrinsic");
Warned = true;
- if (Callee->getIntrinsicID() == Intrinsic::stacksave)
- CI->replaceAllUsesWith(Constant::getNullValue(CI->getType()));
break;
- }
case Intrinsic::returnaddress:
+ Context.emitWarning("this target does not support the "
+ "llvm.returnaddress intrinsic");
+ CI->replaceAllUsesWith(ConstantPointerNull::get(
+ cast<PointerType>(CI->getType())));
+ break;
+
case Intrinsic::frameaddress:
- errs() << "WARNING: this target does not support the llvm."
- << (Callee->getIntrinsicID() == Intrinsic::returnaddress ?
- "return" : "frame") << "address intrinsic.\n";
+ Context.emitWarning("this target does not support the "
+ "llvm.frameaddress intrinsic");
CI->replaceAllUsesWith(ConstantPointerNull::get(
cast<PointerType>(CI->getType())));
break;
@@ -438,12 +446,12 @@ void IntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
case Intrinsic::pcmarker:
break; // Simply strip out pcmarker on unsupported architectures
- case Intrinsic::readcyclecounter: {
- errs() << "WARNING: this target does not support the llvm.readcyclecoun"
- << "ter intrinsic. It is being lowered to a constant 0\n";
+ case Intrinsic::readcyclecounter:
+ Context.emitWarning("this target does not support the "
+ "llvm.readcyclecounter intrinsic; "
+ "it is being lowered to a constant 0");
CI->replaceAllUsesWith(ConstantInt::get(Type::getInt64Ty(Context), 0));
break;
- }
case Intrinsic::dbg_declare:
break; // Simply strip out debugging intrinsics
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index 7babf321597..4849463b5a1 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -1154,8 +1154,9 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) {
// If we are removing arguments to the function, emit an obnoxious warning.
if (FT->getNumParams() < NumActualArgs) {
if (!FT->isVarArg()) {
- errs() << "WARNING: While resolving call to function '"
- << Callee->getName() << "' arguments were dropped!\n";
+ FT->getContext().emitWarning("while resolving call to function '" +
+ Callee->getName() +
+ "' arguments were dropped");
} else {
// Add all of the arguments in their promoted form to the arg list.
for (unsigned i = FT->getNumParams(); i != NumActualArgs; ++i, ++AI) {
diff --git a/llvm/lib/Transforms/Instrumentation/EdgeProfiling.cpp b/llvm/lib/Transforms/Instrumentation/EdgeProfiling.cpp
index 41e42aff490..cf12b1f7587 100644
--- a/llvm/lib/Transforms/Instrumentation/EdgeProfiling.cpp
+++ b/llvm/lib/Transforms/Instrumentation/EdgeProfiling.cpp
@@ -21,6 +21,7 @@
#include "llvm/Transforms/Instrumentation.h"
#include "ProfilingUtils.h"
#include "llvm/ADT/Statistic.h"
+#include "llvm/LLVMContext.h"
#include "llvm/Module.h"
#include "llvm/Pass.h"
#include "llvm/Support/raw_ostream.h"
@@ -54,8 +55,8 @@ ModulePass *llvm::createEdgeProfilerPass() { return new EdgeProfiler(); }
bool EdgeProfiler::runOnModule(Module &M) {
Function *Main = M.getFunction("main");
if (Main == 0) {
- errs() << "WARNING: cannot insert edge profiling into a module"
- << " with no main function!\n";
+ M.getContext().emitWarning("cannot insert edge profiling into a module"
+ " with no main function");
return false; // No main, no instrumentation!
}
diff --git a/llvm/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp b/llvm/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp
index 8f8d027dca7..3c851681b90 100644
--- a/llvm/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp
+++ b/llvm/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp
@@ -22,6 +22,7 @@
#include "llvm/Analysis/ProfileInfo.h"
#include "llvm/Analysis/ProfileInfoLoader.h"
#include "llvm/Constants.h"
+#include "llvm/LLVMContext.h"
#include "llvm/Module.h"
#include "llvm/Pass.h"
#include "llvm/Support/Debug.h"
@@ -75,8 +76,8 @@ inline static void printEdgeCounter(ProfileInfo::Edge e,
bool OptimalEdgeProfiler::runOnModule(Module &M) {
Function *Main = M.getFunction("main");
if (Main == 0) {
- errs() << "WARNING: cannot insert edge profiling into a module"
- << " with no main function!\n";
+ M.getContext().emitWarning("cannot insert edge profiling into a module"
+ " with no main function");
return false; // No main, no instrumentation!
}
diff --git a/llvm/lib/Transforms/Instrumentation/PathProfiling.cpp b/llvm/lib/Transforms/Instrumentation/PathProfiling.cpp
index 2a0e89ce6a1..2d324b89b10 100644
--- a/llvm/lib/Transforms/Instrumentation/PathProfiling.cpp
+++ b/llvm/lib/Transforms/Instrumentation/PathProfiling.cpp
@@ -1345,8 +1345,8 @@ bool PathProfiler::runOnModule(Module &M) {
Main = M.getFunction("MAIN__");
if (!Main) {
- errs() << "WARNING: cannot insert path profiling into a module"
- << " with no main function!\n";
+ Context->emitWarning("cannot insert edge profiling into a module"
+ " with no main function");
return false;
}
diff --git a/llvm/lib/VMCore/LLVMContext.cpp b/llvm/lib/VMCore/LLVMContext.cpp
index 68c4a766f6d..bdb1b4ba2ee 100644
--- a/llvm/lib/VMCore/LLVMContext.cpp
+++ b/llvm/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
//===----------------------------------------------------------------------===//
OpenPOWER on IntegriCloud