diff options
-rw-r--r-- | include/llvm/LLVMContext.h | 6 | ||||
-rw-r--r-- | lib/Analysis/ProfileDataLoaderPass.cpp | 4 | ||||
-rw-r--r-- | lib/Analysis/ProfileInfoLoaderPass.cpp | 17 | ||||
-rw-r--r-- | lib/CodeGen/IntrinsicLowering.cpp | 36 | ||||
-rw-r--r-- | lib/Transforms/InstCombine/InstCombineCalls.cpp | 5 | ||||
-rw-r--r-- | lib/Transforms/Instrumentation/EdgeProfiling.cpp | 5 | ||||
-rw-r--r-- | lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp | 5 | ||||
-rw-r--r-- | lib/Transforms/Instrumentation/PathProfiling.cpp | 4 | ||||
-rw-r--r-- | lib/VMCore/LLVMContext.cpp | 29 |
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 //===----------------------------------------------------------------------===// |