aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/LLVMContext.h6
-rw-r--r--lib/Analysis/ProfileDataLoaderPass.cpp4
-rw-r--r--lib/Analysis/ProfileInfoLoaderPass.cpp17
-rw-r--r--lib/CodeGen/IntrinsicLowering.cpp36
-rw-r--r--lib/Transforms/InstCombine/InstCombineCalls.cpp5
-rw-r--r--lib/Transforms/Instrumentation/EdgeProfiling.cpp5
-rw-r--r--lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp5
-rw-r--r--lib/Transforms/Instrumentation/PathProfiling.cpp4
-rw-r--r--lib/VMCore/LLVMContext.cpp29
9 files changed, 78 insertions, 33 deletions
diff --git a/include/llvm/LLVMContext.h b/include/llvm/LLVMContext.h
index 5903e2e55e..a5a26946b7 100644
--- a/include/llvm/LLVMContext.h
+++ b/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/lib/Analysis/ProfileDataLoaderPass.cpp b/lib/Analysis/ProfileDataLoaderPass.cpp
index 604541f4fd..af12c4d4a3 100644
--- a/lib/Analysis/ProfileDataLoaderPass.cpp
+++ b/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/lib/Analysis/ProfileInfoLoaderPass.cpp b/lib/Analysis/ProfileInfoLoaderPass.cpp
index 2f3486cb44..8e6d1c2ecb 100644
--- a/lib/Analysis/ProfileInfoLoaderPass.cpp
+++ b/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/lib/CodeGen/IntrinsicLowering.cpp b/lib/CodeGen/IntrinsicLowering.cpp
index 698d289f13..f289a9beac 100644
--- a/lib/CodeGen/IntrinsicLowering.cpp
+++ b/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/lib/Transforms/InstCombine/InstCombineCalls.cpp b/lib/Transforms/InstCombine/InstCombineCalls.cpp
index 7babf32159..4849463b5a 100644
--- a/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/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/lib/Transforms/Instrumentation/EdgeProfiling.cpp b/lib/Transforms/Instrumentation/EdgeProfiling.cpp
index 41e42aff49..cf12b1f758 100644
--- a/lib/Transforms/Instrumentation/EdgeProfiling.cpp
+++ b/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/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp b/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp
index 8f8d027dca..3c851681b9 100644
--- a/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp
+++ b/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/lib/Transforms/Instrumentation/PathProfiling.cpp b/lib/Transforms/Instrumentation/PathProfiling.cpp
index 2a0e89ce6a..2d324b89b1 100644
--- a/lib/Transforms/Instrumentation/PathProfiling.cpp
+++ b/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/lib/VMCore/LLVMContext.cpp b/lib/VMCore/LLVMContext.cpp
index 68c4a766f6..bdb1b4ba2e 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
//===----------------------------------------------------------------------===//