[llvm] r197438 - Add warning capabilities in LLVM.

Quentin Colombet qcolombet at apple.com
Tue Dec 17 09:52:44 PST 2013


Reapplied in r197508.

This time, all the diagnostic stuff has been moved into IR.

-Quentin

On Dec 16, 2013, at 5:05 PM, Quentin Colombet <qcolombet at apple.com> wrote:

> Should be fixed with r197447.
> 
> Tell me if I missed something.
> 
> Thanks,
> -Quentin
> 
> On Dec 16, 2013, at 4:55 PM, Quentin Colombet <qcolombet at apple.com> wrote:
> 
>> Hi Reid,
>> 
>> Good catch!
>> 
>> On Dec 16, 2013, at 4:49 PM, Reid Kleckner <rnk at google.com> wrote:
>> 
>>> Sorry, the IR dependency has always been there.  The new one is Analysis and CodeGen in DiagnosticPrinter.cpp.
>> Those are typos (originally DiagnosticPrinter classes were supposed to support SCEV and MachineInstr), we do not need to include anything from Analysis or CodeGen.
>> 
>> I will update the file accordingly.
>> 
>> Sorry about that.
>> 
>> -Quentin 
>>> 
>>> 
>>> On Mon, Dec 16, 2013 at 4:41 PM, Reid Kleckner <rnk at google.com> wrote:
>>> DiagnosticInfo.cpp appears to introduce a bunch of link-time dependencies on IR from Support.  Are you sure that's the right library for it?
>>> 
>>> 
>>> On Mon, Dec 16, 2013 at 3:22 PM, Quentin Colombet <qcolombet at apple.com> wrote:
>>> Author: qcolombet
>>> Date: Mon Dec 16 17:22:51 2013
>>> New Revision: 197438
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=197438&view=rev
>>> Log:
>>> Add warning capabilities in LLVM.
>>> 
>>> The patch adds a new LLVMContext::diagnose that can be used to communicate to
>>> the front-end, if any, that something of interest happened.
>>> The diagnostics are supported by a new abstraction, the DiagnosticInfo class.
>>> The base class contains the following information:
>>> - The kind of the report: What this is about.
>>> - The severity of the report: How bad this is.
>>> 
>>> This patch also adds 2 classes:
>>> - DiagnosticInfoInlineAsm: For inline asm reporting. Basically, this diagnostic
>>> will be used to switch to the new diagnostic API for LLVMContext::emitError.
>>> - DiagnosticStackSize: For stack size reporting. Comes as a replacement of the
>>> hard coded warning in PEI.
>>> 
>>> This patch also features dynamic diagnostic identifiers. In other words plugins
>>> can use this infrastructure for their own diagnostics (for more details, see
>>> getNextAvailablePluginDiagnosticKind).
>>> 
>>> This patch introduces a new DiagnosticHandlerTy and a new DiagnosticContext in
>>> the LLVMContext that should be set by the front-end to be able to map these
>>> diagnostics in its own system.
>>> 
>>> http://llvm-reviews.chandlerc.com/D2376
>>> <rdar://problem/15515174>
>>> 
>>> Added:
>>>     llvm/trunk/include/llvm/Support/DiagnosticInfo.h
>>>     llvm/trunk/include/llvm/Support/DiagnosticPrinter.h
>>>     llvm/trunk/lib/Support/DiagnosticInfo.cpp
>>>     llvm/trunk/lib/Support/DiagnosticPrinter.cpp
>>> Modified:
>>>     llvm/trunk/include/llvm/IR/LLVMContext.h
>>>     llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp
>>>     llvm/trunk/lib/IR/LLVMContext.cpp
>>>     llvm/trunk/lib/IR/LLVMContextImpl.cpp
>>>     llvm/trunk/lib/IR/LLVMContextImpl.h
>>>     llvm/trunk/lib/Support/CMakeLists.txt
>>>     llvm/trunk/test/CodeGen/ARM/warn-stack.ll
>>>     llvm/trunk/test/CodeGen/X86/warn-stack.ll
>>> 
>>> Modified: llvm/trunk/include/llvm/IR/LLVMContext.h
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/LLVMContext.h?rev=197438&r1=197437&r2=197438&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/IR/LLVMContext.h (original)
>>> +++ llvm/trunk/include/llvm/IR/LLVMContext.h Mon Dec 16 17:22:51 2013
>>> @@ -27,6 +27,7 @@ class Twine;
>>>  class Instruction;
>>>  class Module;
>>>  class SMDiagnostic;
>>> +class DiagnosticInfo;
>>>  template <typename T> class SmallVectorImpl;
>>> 
>>>  /// This is an important class for using LLVM in a threaded context.  It
>>> @@ -64,6 +65,11 @@ public:
>>>    typedef void (*InlineAsmDiagHandlerTy)(const SMDiagnostic&, void *Context,
>>>                                           unsigned LocCookie);
>>> 
>>> +  /// Defines the type of a diagnostic handler.
>>> +  /// \see LLVMContext::setDiagnosticHandler.
>>> +  /// \see LLVMContext::diagnose.
>>> +  typedef void (*DiagnosticHandlerTy)(const DiagnosticInfo &DI, void *Context);
>>> +
>>>    /// setInlineAsmDiagnosticHandler - This method sets a handler that is invoked
>>>    /// when problems with inline asm are detected by the backend.  The first
>>>    /// argument is a function pointer and the second is a context pointer that
>>> @@ -82,6 +88,33 @@ public:
>>>    /// setInlineAsmDiagnosticHandler.
>>>    void *getInlineAsmDiagnosticContext() const;
>>> 
>>> +  /// setDiagnosticHandler - This method sets a handler that is invoked
>>> +  /// when the backend needs to report anything to the user.  The first
>>> +  /// argument is a function pointer and the second is a context pointer that
>>> +  /// gets passed into the DiagHandler.
>>> +  ///
>>> +  /// LLVMContext doesn't take ownership or interpret either of these
>>> +  /// pointers.
>>> +  void setDiagnosticHandler(DiagnosticHandlerTy DiagHandler,
>>> +                            void *DiagContext = 0);
>>> +
>>> +  /// getDiagnosticHandler - Return the diagnostic handler set by
>>> +  /// setDiagnosticHandler.
>>> +  DiagnosticHandlerTy getDiagnosticHandler() const;
>>> +
>>> +  /// getDiagnosticContext - Return the diagnostic context set by
>>> +  /// setDiagnosticContext.
>>> +  void *getDiagnosticContext() const;
>>> +
>>> +  /// diagnose - Report a message to the currently installed diagnostic handler.
>>> +  /// This function returns, in particular in the case of error reporting
>>> +  /// (DI.Severity == RS_Error), so the caller should leave the compilation
>>> +  /// process in a self-consistent state, even though the generated code
>>> +  /// need not be correct.
>>> +  /// The diagnostic message will be implicitly prefixed with a severity
>>> +  /// keyword according to \p DI.getSeverity(), i.e., "error: "
>>> +  /// for RS_Error, "warning: " for RS_Warning, and "note: " for RS_Note.
>>> +  void diagnose(const DiagnosticInfo &DI);
>>> 
>>>    /// emitError - Emit an error message to the currently installed error handler
>>>    /// with optional location information.  This function returns, so code should
>>> 
>>> Added: llvm/trunk/include/llvm/Support/DiagnosticInfo.h
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/DiagnosticInfo.h?rev=197438&view=auto
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Support/DiagnosticInfo.h (added)
>>> +++ llvm/trunk/include/llvm/Support/DiagnosticInfo.h Mon Dec 16 17:22:51 2013
>>> @@ -0,0 +1,165 @@
>>> +//===- llvm/Support/DiagnosticInfo.h - Diagnostic Declaration ---*- C++ -*-===//
>>> +//
>>> +//                     The LLVM Compiler Infrastructure
>>> +//
>>> +// This file is distributed under the University of Illinois Open Source
>>> +// License. See LICENSE.TXT for details.
>>> +//
>>> +//===----------------------------------------------------------------------===//
>>> +//
>>> +// This file declares the different classes involved in low level diagnostics.
>>> +//
>>> +// Diagnostics reporting is still done as part of the LLVMContext.
>>> +//===----------------------------------------------------------------------===//
>>> +
>>> +#ifndef LLVM_SUPPORT_DIAGNOSTICINFO_H
>>> +#define LLVM_SUPPORT_DIAGNOSTICINFO_H
>>> +
>>> +#include "llvm/ADT/ArrayRef.h"
>>> +#include "llvm/Support/Casting.h"
>>> +
>>> +namespace llvm {
>>> +
>>> +// Forward declarations.
>>> +class DiagnosticPrinter;
>>> +class Function;
>>> +class Instruction;
>>> +class Twine;
>>> +class Value;
>>> +
>>> +/// \brief Defines the different supported severity of a diagnostic.
>>> +enum DiagnosticSeverity {
>>> +  DS_Error,
>>> +  DS_Warning,
>>> +  DS_Note
>>> +};
>>> +
>>> +/// \brief Defines the different supported kind of a diagnostic.
>>> +/// This enum should be extended with a new ID for each added concrete subclass.
>>> +enum DiagnosticKind {
>>> +  DK_InlineAsm,
>>> +  DK_StackSize,
>>> +  DK_FirstPluginKind
>>> +};
>>> +
>>> +/// \brief Get the next available kind ID for a plugin diagnostic.
>>> +/// Each time this function is called, it returns a different number.
>>> +/// Therefore, a plugin that wants to "identify" its own classes
>>> +/// with a dynamic identifier, just have to use this method to get a new ID
>>> +/// and assign it to each of its classes.
>>> +/// The returned ID will be greater than or equal to DK_FirstPluginKind.
>>> +/// Thus, the plugin identifiers will not conflict with the
>>> +/// DiagnosticKind values.
>>> +int getNextAvailablePluginDiagnosticKind();
>>> +
>>> +/// \brief This is the base abstract class for diagnostic reporting in
>>> +/// the backend.
>>> +/// The print method must be overloaded by the subclasses to print a
>>> +/// user-friendly message in the client of the backend (let us call it a
>>> +/// frontend).
>>> +class DiagnosticInfo {
>>> +private:
>>> +  /// Kind defines the kind of report this is about.
>>> +  const /* DiagnosticKind */ int Kind;
>>> +  /// Severity gives the severity of the diagnostic.
>>> +  const DiagnosticSeverity Severity;
>>> +
>>> +public:
>>> +  DiagnosticInfo(/* DiagnosticKind */ int Kind, DiagnosticSeverity Severity)
>>> +      : Kind(Kind), Severity(Severity) {}
>>> +
>>> +  virtual ~DiagnosticInfo() {}
>>> +
>>> +  /* DiagnosticKind */ int getKind() const { return Kind; }
>>> +  DiagnosticSeverity getSeverity() const { return Severity; }
>>> +
>>> +  /// Print using the given \p DP a user-friendly message.
>>> +  /// This is the default message that will be printed to the user.
>>> +  /// It is used when the frontend does not directly take advantage
>>> +  /// of the information contained in fields of the subclasses.
>>> +  /// The printed message must not end with '.' nor start with a severity
>>> +  /// keyword.
>>> +  virtual void print(DiagnosticPrinter &DP) const = 0;
>>> +};
>>> +
>>> +/// Diagnostic information for inline asm reporting.
>>> +/// This is basically a message and an optional location.
>>> +class DiagnosticInfoInlineAsm : public DiagnosticInfo {
>>> +private:
>>> +  /// Optional line information. 0 if not set.
>>> +  unsigned LocCookie;
>>> +  /// Message to be reported.
>>> +  const Twine &MsgStr;
>>> +  /// Optional origin of the problem.
>>> +  const Instruction *Instr;
>>> +
>>> +public:
>>> +  /// \p MsgStr is the message to be reported to the frontend.
>>> +  /// This class does not copy \p MsgStr, therefore the reference must be valid
>>> +  /// for the whole life time of the Diagnostic.
>>> +  DiagnosticInfoInlineAsm(const Twine &MsgStr,
>>> +                          DiagnosticSeverity Severity = DS_Error)
>>> +      : DiagnosticInfo(DK_InlineAsm, Severity), LocCookie(0), MsgStr(MsgStr),
>>> +        Instr(NULL) {}
>>> +
>>> +  /// \p LocCookie if non-zero gives the line number for this report.
>>> +  /// \p MsgStr gives the message.
>>> +  /// This class does not copy \p MsgStr, therefore the reference must be valid
>>> +  /// for the whole life time of the Diagnostic.
>>> +  DiagnosticInfoInlineAsm(unsigned LocCookie, const Twine &MsgStr,
>>> +                          DiagnosticSeverity Severity = DS_Error)
>>> +      : DiagnosticInfo(DK_InlineAsm, Severity), LocCookie(LocCookie),
>>> +        MsgStr(MsgStr), Instr(NULL) {}
>>> +
>>> +  /// \p Instr gives the original instruction that triggered the diagnostic.
>>> +  /// \p MsgStr gives the message.
>>> +  /// This class does not copy \p MsgStr, therefore the reference must be valid
>>> +  /// for the whole life time of the Diagnostic.
>>> +  /// Same for \p I.
>>> +  DiagnosticInfoInlineAsm(const Instruction &I, const Twine &MsgStr,
>>> +                          DiagnosticSeverity Severity = DS_Error);
>>> +
>>> +  unsigned getLocCookie() const { return LocCookie; }
>>> +  const Twine &getMsgStr() const { return MsgStr; }
>>> +  const Instruction *getInstruction() const { return Instr; }
>>> +
>>> +  /// \see DiagnosticInfo::print.
>>> +  virtual void print(DiagnosticPrinter &DP) const;
>>> +
>>> +  /// Hand rolled RTTI.
>>> +  static bool classof(const DiagnosticInfo *DI) {
>>> +    return DI->getKind() == DK_InlineAsm;
>>> +  }
>>> +};
>>> +
>>> +/// Diagnostic information for stack size reporting.
>>> +/// This is basically a function and a size.
>>> +class DiagnosticInfoStackSize : public DiagnosticInfo {
>>> +private:
>>> +  /// The function that is concerned by this stack size diagnostic.
>>> +  const Function &Fn;
>>> +  /// The computed stack size.
>>> +  unsigned StackSize;
>>> +
>>> +public:
>>> +  /// \p The function that is concerned by this stack size diagnostic.
>>> +  /// \p The computed stack size.
>>> +  DiagnosticInfoStackSize(const Function &Fn, unsigned StackSize,
>>> +                          DiagnosticSeverity Severity = DS_Warning)
>>> +      : DiagnosticInfo(DK_StackSize, Severity), Fn(Fn), StackSize(StackSize) {}
>>> +
>>> +  const Function &getFunction() const { return Fn; }
>>> +  unsigned getStackSize() const { return StackSize; }
>>> +
>>> +  /// \see DiagnosticInfo::print.
>>> +  virtual void print(DiagnosticPrinter &DP) const;
>>> +
>>> +  /// Hand rolled RTTI.
>>> +  static bool classof(const DiagnosticInfo *DI) {
>>> +    return DI->getKind() == DK_StackSize;
>>> +  }
>>> +};
>>> +
>>> +} // End namespace llvm
>>> +
>>> +#endif
>>> 
>>> Added: llvm/trunk/include/llvm/Support/DiagnosticPrinter.h
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/DiagnosticPrinter.h?rev=197438&view=auto
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Support/DiagnosticPrinter.h (added)
>>> +++ llvm/trunk/include/llvm/Support/DiagnosticPrinter.h Mon Dec 16 17:22:51 2013
>>> @@ -0,0 +1,84 @@
>>> +//===- llvm/Support/DiagnosticPrinter.h - Diagnostic Printer ----*- C++ -*-===//
>>> +//
>>> +//                     The LLVM Compiler Infrastructure
>>> +//
>>> +// This file is distributed under the University of Illinois Open Source
>>> +// License. See LICENSE.TXT for details.
>>> +//
>>> +//===----------------------------------------------------------------------===//
>>> +//
>>> +// This file declares the main interface for printer backend diagnostic.
>>> +//
>>> +// Clients of the backend diagnostics should overload this interface based
>>> +// on their needs.
>>> +//===----------------------------------------------------------------------===//
>>> +
>>> +#ifndef LLVM_SUPPORT_DIAGNOSTICPRINTER_H
>>> +#define LLVM_SUPPORT_DIAGNOSTICPRINTER_H
>>> +
>>> +#include <string>
>>> +
>>> +namespace llvm {
>>> +// Forward declarations.
>>> +class raw_ostream;
>>> +class StringRef;
>>> +class Twine;
>>> +class Value;
>>> +
>>> +/// \brief Interface for custom diagnostic printing.
>>> +class DiagnosticPrinter {
>>> +public:
>>> +  virtual ~DiagnosticPrinter() {}
>>> +
>>> +  // Simple types.
>>> +  virtual DiagnosticPrinter &operator<<(char C) = 0;
>>> +  virtual DiagnosticPrinter &operator<<(unsigned char C) = 0;
>>> +  virtual DiagnosticPrinter &operator<<(signed char C) = 0;
>>> +  virtual DiagnosticPrinter &operator<<(StringRef Str) = 0;
>>> +  virtual DiagnosticPrinter &operator<<(const char *Str) = 0;
>>> +  virtual DiagnosticPrinter &operator<<(const std::string &Str) = 0;
>>> +  virtual DiagnosticPrinter &operator<<(unsigned long N) = 0;
>>> +  virtual DiagnosticPrinter &operator<<(long N) = 0;
>>> +  virtual DiagnosticPrinter &operator<<(unsigned long long N) = 0;
>>> +  virtual DiagnosticPrinter &operator<<(long long N) = 0;
>>> +  virtual DiagnosticPrinter &operator<<(const void *P) = 0;
>>> +  virtual DiagnosticPrinter &operator<<(unsigned int N) = 0;
>>> +  virtual DiagnosticPrinter &operator<<(int N) = 0;
>>> +  virtual DiagnosticPrinter &operator<<(double N) = 0;
>>> +  virtual DiagnosticPrinter &operator<<(const Twine &Str) = 0;
>>> +
>>> +  // IR related types.
>>> +  virtual DiagnosticPrinter &operator<<(const Value &V) = 0;
>>> +};
>>> +
>>> +/// \brief Basic diagnostic printer that uses an underlying raw_ostream.
>>> +class DiagnosticPrinterRawOStream : public DiagnosticPrinter {
>>> +protected:
>>> +  raw_ostream &Stream;
>>> +
>>> +public:
>>> +  DiagnosticPrinterRawOStream(raw_ostream &Stream) : Stream(Stream) {};
>>> +
>>> +  // Simple types.
>>> +  virtual DiagnosticPrinter &operator<<(char C);
>>> +  virtual DiagnosticPrinter &operator<<(unsigned char C);
>>> +  virtual DiagnosticPrinter &operator<<(signed char C);
>>> +  virtual DiagnosticPrinter &operator<<(StringRef Str);
>>> +  virtual DiagnosticPrinter &operator<<(const char *Str);
>>> +  virtual DiagnosticPrinter &operator<<(const std::string &Str);
>>> +  virtual DiagnosticPrinter &operator<<(unsigned long N);
>>> +  virtual DiagnosticPrinter &operator<<(long N);
>>> +  virtual DiagnosticPrinter &operator<<(unsigned long long N);
>>> +  virtual DiagnosticPrinter &operator<<(long long N);
>>> +  virtual DiagnosticPrinter &operator<<(const void *P);
>>> +  virtual DiagnosticPrinter &operator<<(unsigned int N);
>>> +  virtual DiagnosticPrinter &operator<<(int N);
>>> +  virtual DiagnosticPrinter &operator<<(double N);
>>> +  virtual DiagnosticPrinter &operator<<(const Twine &Str);
>>> +
>>> +  // IR related types.
>>> +  virtual DiagnosticPrinter &operator<<(const Value &V);
>>> +};
>>> +} // End namespace llvm
>>> +
>>> +#endif
>>> 
>>> Modified: llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp?rev=197438&r1=197437&r2=197438&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp Mon Dec 16 17:22:51 2013
>>> @@ -30,9 +30,11 @@
>>>  #include "llvm/CodeGen/MachineRegisterInfo.h"
>>>  #include "llvm/CodeGen/RegisterScavenging.h"
>>>  #include "llvm/IR/InlineAsm.h"
>>> +#include "llvm/IR/LLVMContext.h"
>>>  #include "llvm/Support/CommandLine.h"
>>>  #include "llvm/Support/Compiler.h"
>>>  #include "llvm/Support/Debug.h"
>>> +#include "llvm/Support/DiagnosticInfo.h"
>>>  #include "llvm/Support/raw_ostream.h"
>>>  #include "llvm/Target/TargetFrameLowering.h"
>>>  #include "llvm/Target/TargetInstrInfo.h"
>>> @@ -160,10 +162,11 @@ bool PEI::runOnMachineFunction(MachineFu
>>> 
>>>    // Warn on stack size when we exceeds the given limit.
>>>    MachineFrameInfo *MFI = Fn.getFrameInfo();
>>> -  if (WarnStackSize.getNumOccurrences() > 0 &&
>>> -      WarnStackSize < MFI->getStackSize())
>>> -    errs() << "warning: Stack size limit exceeded (" << MFI->getStackSize()
>>> -           << ") in " << Fn.getName()  << ".\n";
>>> +  uint64_t StackSize = MFI->getStackSize();
>>> +  if (WarnStackSize.getNumOccurrences() > 0 && WarnStackSize < StackSize) {
>>> +    DiagnosticInfoStackSize DiagStackSize(*F, StackSize);
>>> +    F->getContext().diagnose(DiagStackSize);
>>> +  }
>>> 
>>>    delete RS;
>>>    ReturnBlocks.clear();
>>> 
>>> Modified: llvm/trunk/lib/IR/LLVMContext.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContext.cpp?rev=197438&r1=197437&r2=197438&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/IR/LLVMContext.cpp (original)
>>> +++ llvm/trunk/lib/IR/LLVMContext.cpp Mon Dec 16 17:22:51 2013
>>> @@ -17,6 +17,8 @@
>>>  #include "llvm/IR/Constants.h"
>>>  #include "llvm/IR/Instruction.h"
>>>  #include "llvm/IR/Metadata.h"
>>> +#include "llvm/Support/DiagnosticInfo.h"
>>> +#include "llvm/Support/DiagnosticPrinter.h"
>>>  #include "llvm/Support/ManagedStatic.h"
>>>  #include "llvm/Support/SourceMgr.h"
>>>  #include <cctype>
>>> @@ -98,6 +100,20 @@ void *LLVMContext::getInlineAsmDiagnosti
>>>    return pImpl->InlineAsmDiagContext;
>>>  }
>>> 
>>> +void LLVMContext::setDiagnosticHandler(DiagnosticHandlerTy DiagnosticHandler,
>>> +                                       void *DiagnosticContext) {
>>> +  pImpl->DiagnosticHandler = DiagnosticHandler;
>>> +  pImpl->DiagnosticContext = DiagnosticContext;
>>> +}
>>> +
>>> +LLVMContext::DiagnosticHandlerTy LLVMContext::getDiagnosticHandler() const {
>>> +  return pImpl->DiagnosticHandler;
>>> +}
>>> +
>>> +void *LLVMContext::getDiagnosticContext() const {
>>> +  return pImpl->DiagnosticContext;
>>> +}
>>> +
>>>  void LLVMContext::emitError(const Twine &ErrorStr) {
>>>    emitError(0U, ErrorStr);
>>>  }
>>> @@ -112,6 +128,31 @@ void LLVMContext::emitError(const Instru
>>>    return emitError(LocCookie, ErrorStr);
>>>  }
>>> 
>>> +void LLVMContext::diagnose(const DiagnosticInfo &DI) {
>>> +  // If there is a report handler, use it.
>>> +  if (pImpl->DiagnosticHandler != 0) {
>>> +    pImpl->DiagnosticHandler(DI, pImpl->DiagnosticContext);
>>> +    return;
>>> +  }
>>> +  // Otherwise, print the message with a prefix based on the severity.
>>> +  std::string MsgStorage;
>>> +  raw_string_ostream Stream(MsgStorage);
>>> +  DiagnosticPrinterRawOStream DP(Stream);
>>> +  DI.print(DP);
>>> +  Stream.flush();
>>> +  switch (DI.getSeverity()) {
>>> +  case DS_Error:
>>> +    errs() << "error: " << MsgStorage << "\n";
>>> +    exit(1);
>>> +  case DS_Warning:
>>> +    errs() << "warning: " << MsgStorage << "\n";
>>> +    break;
>>> +  case DS_Note:
>>> +    errs() << "note: " << MsgStorage << "\n";
>>> +    break;
>>> +  }
>>> +}
>>> +
>>>  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) {
>>> 
>>> Modified: llvm/trunk/lib/IR/LLVMContextImpl.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContextImpl.cpp?rev=197438&r1=197437&r2=197438&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/IR/LLVMContextImpl.cpp (original)
>>> +++ llvm/trunk/lib/IR/LLVMContextImpl.cpp Mon Dec 16 17:22:51 2013
>>> @@ -37,6 +37,8 @@ LLVMContextImpl::LLVMContextImpl(LLVMCon
>>>      Int64Ty(C, 64) {
>>>    InlineAsmDiagHandler = 0;
>>>    InlineAsmDiagContext = 0;
>>> +  DiagnosticHandler = 0;
>>> +  DiagnosticContext = 0;
>>>    NamedStructTypesUniqueID = 0;
>>>  }
>>> 
>>> 
>>> Modified: llvm/trunk/lib/IR/LLVMContextImpl.h
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContextImpl.h?rev=197438&r1=197437&r2=197438&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/IR/LLVMContextImpl.h (original)
>>> +++ llvm/trunk/lib/IR/LLVMContextImpl.h Mon Dec 16 17:22:51 2013
>>> @@ -238,9 +238,12 @@ public:
>>> 
>>>    LLVMContext::InlineAsmDiagHandlerTy InlineAsmDiagHandler;
>>>    void *InlineAsmDiagContext;
>>> -
>>> -  typedef DenseMap<DenseMapAPIntKeyInfo::KeyTy, ConstantInt*,
>>> -                         DenseMapAPIntKeyInfo> IntMapTy;
>>> +
>>> +  LLVMContext::DiagnosticHandlerTy DiagnosticHandler;
>>> +  void *DiagnosticContext;
>>> +
>>> +  typedef DenseMap<DenseMapAPIntKeyInfo::KeyTy, ConstantInt *,
>>> +                   DenseMapAPIntKeyInfo> IntMapTy;
>>>    IntMapTy IntConstants;
>>> 
>>>    typedef DenseMap<DenseMapAPFloatKeyInfo::KeyTy, ConstantFP*,
>>> 
>>> Modified: llvm/trunk/lib/Support/CMakeLists.txt
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CMakeLists.txt?rev=197438&r1=197437&r2=197438&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/Support/CMakeLists.txt (original)
>>> +++ llvm/trunk/lib/Support/CMakeLists.txt Mon Dec 16 17:22:51 2013
>>> @@ -17,6 +17,8 @@ add_llvm_library(LLVMSupport
>>>    Debug.cpp
>>>    DeltaAlgorithm.cpp
>>>    DAGDeltaAlgorithm.cpp
>>> +  DiagnosticInfo.cpp
>>> +  DiagnosticPrinter.cpp
>>>    Dwarf.cpp
>>>    ErrorHandling.cpp
>>>    FileUtilities.cpp
>>> 
>>> Added: llvm/trunk/lib/Support/DiagnosticInfo.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/DiagnosticInfo.cpp?rev=197438&view=auto
>>> ==============================================================================
>>> --- llvm/trunk/lib/Support/DiagnosticInfo.cpp (added)
>>> +++ llvm/trunk/lib/Support/DiagnosticInfo.cpp Mon Dec 16 17:22:51 2013
>>> @@ -0,0 +1,54 @@
>>> +//===- llvm/Support/DiagnosticInfo.cpp - Diagnostic Definitions -*- C++ -*-===//
>>> +//
>>> +//                     The LLVM Compiler Infrastructure
>>> +//
>>> +// This file is distributed under the University of Illinois Open Source
>>> +// License. See LICENSE.TXT for details.
>>> +//
>>> +//===----------------------------------------------------------------------===//
>>> +//
>>> +// This file defines the different classes involved in low level diagnostics.
>>> +//
>>> +// Diagnostics reporting is still done as part of the LLVMContext.
>>> +//===----------------------------------------------------------------------===//
>>> +
>>> +#include "llvm/ADT/Twine.h"
>>> +#include "llvm/IR/Constants.h"
>>> +#include "llvm/IR/Function.h"
>>> +#include "llvm/IR/Instruction.h"
>>> +#include "llvm/IR/Metadata.h"
>>> +#include "llvm/Support/Atomic.h"
>>> +#include "llvm/Support/DiagnosticInfo.h"
>>> +#include "llvm/Support/DiagnosticPrinter.h"
>>> +
>>> +#include <string>
>>> +
>>> +using namespace llvm;
>>> +
>>> +int getNextAvailablePluginDiagnosticKind() {
>>> +  static sys::cas_flag PluginKindID = DK_FirstPluginKind;
>>> +  return (int)sys::AtomicIncrement(&PluginKindID);
>>> +}
>>> +
>>> +DiagnosticInfoInlineAsm::DiagnosticInfoInlineAsm(const Instruction &I,
>>> +                                                 const Twine &MsgStr,
>>> +                                                 DiagnosticSeverity Severity)
>>> +    : DiagnosticInfo(DK_InlineAsm, Severity), LocCookie(0), MsgStr(MsgStr),
>>> +      Instr(&I) {
>>> +  if (const MDNode *SrcLoc = I.getMetadata("srcloc")) {
>>> +    if (SrcLoc->getNumOperands() != 0)
>>> +      if (const ConstantInt *CI = dyn_cast<ConstantInt>(SrcLoc->getOperand(0)))
>>> +        LocCookie = CI->getZExtValue();
>>> +  }
>>> +}
>>> +
>>> +void DiagnosticInfoInlineAsm::print(DiagnosticPrinter &DP) const {
>>> +  DP << getMsgStr();
>>> +  if (getLocCookie())
>>> +    DP << " at line " << getLocCookie();
>>> +}
>>> +
>>> +void DiagnosticInfoStackSize::print(DiagnosticPrinter &DP) const {
>>> +  DP << "stack size limit exceeded (" << getStackSize() << ") in "
>>> +     << getFunction();
>>> +}
>>> 
>>> Added: llvm/trunk/lib/Support/DiagnosticPrinter.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/DiagnosticPrinter.cpp?rev=197438&view=auto
>>> ==============================================================================
>>> --- llvm/trunk/lib/Support/DiagnosticPrinter.cpp (added)
>>> +++ llvm/trunk/lib/Support/DiagnosticPrinter.cpp Mon Dec 16 17:22:51 2013
>>> @@ -0,0 +1,103 @@
>>> +//===- llvm/Support/DiagnosticInfo.cpp - Diagnostic Definitions -*- C++ -*-===//
>>> +//
>>> +//                     The LLVM Compiler Infrastructure
>>> +//
>>> +// This file is distributed under the University of Illinois Open Source
>>> +// License. See LICENSE.TXT for details.
>>> +//
>>> +//===----------------------------------------------------------------------===//
>>> +//
>>> +// This file defines the a diagnostic printer relying on raw_ostream.
>>> +//
>>> +//===----------------------------------------------------------------------===//
>>> +
>>> +#include "llvm/ADT/Twine.h"
>>> +#include "llvm/Analysis/ScalarEvolution.h"
>>> +#include "llvm/CodeGen/MachineInstr.h"
>>> +#include "llvm/IR/Value.h"
>>> +#include "llvm/Support/DiagnosticPrinter.h"
>>> +#include "llvm/Support/raw_ostream.h"
>>> +
>>> +using namespace llvm;
>>> +
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(char C) {
>>> +  Stream << C;
>>> +  return *this;
>>> +}
>>> +
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(unsigned char C) {
>>> +  Stream << C;
>>> +  return *this;
>>> +}
>>> +
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(signed char C) {
>>> +  Stream << C;
>>> +  return *this;
>>> +}
>>> +
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(StringRef Str) {
>>> +  Stream << Str;
>>> +  return *this;
>>> +}
>>> +
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(const char *Str) {
>>> +  Stream << Str;
>>> +  return *this;
>>> +}
>>> +
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(
>>> +    const std::string &Str) {
>>> +  Stream << Str;
>>> +  return *this;
>>> +}
>>> +
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(unsigned long N) {
>>> +  Stream << N;
>>> +  return *this;
>>> +}
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(long N) {
>>> +  Stream << N;
>>> +  return *this;
>>> +}
>>> +
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(
>>> +    unsigned long long N) {
>>> +  Stream << N;
>>> +  return *this;
>>> +}
>>> +
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(long long N) {
>>> +  Stream << N;
>>> +  return *this;
>>> +}
>>> +
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(const void *P) {
>>> +  Stream << P;
>>> +  return *this;
>>> +}
>>> +
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(unsigned int N) {
>>> +  Stream << N;
>>> +  return *this;
>>> +}
>>> +
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(int N) {
>>> +  Stream << N;
>>> +  return *this;
>>> +}
>>> +
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(double N) {
>>> +  Stream << N;
>>> +  return *this;
>>> +}
>>> +
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(const Twine &Str) {
>>> +  Stream << Str.getSingleStringRef();
>>> +  return *this;
>>> +}
>>> +
>>> +// IR related types.
>>> +DiagnosticPrinter &DiagnosticPrinterRawOStream::operator<<(const Value &V) {
>>> +  Stream << V.getName();
>>> +  return *this;
>>> +}
>>> 
>>> Modified: llvm/trunk/test/CodeGen/ARM/warn-stack.ll
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/warn-stack.ll?rev=197438&r1=197437&r2=197438&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/test/CodeGen/ARM/warn-stack.ll (original)
>>> +++ llvm/trunk/test/CodeGen/ARM/warn-stack.ll Mon Dec 16 17:22:51 2013
>>> @@ -12,7 +12,7 @@ entry:
>>>    ret void
>>>  }
>>> 
>>> -; CHECK: warning: Stack size limit exceeded (96) in warn.
>>> +; CHECK: warning: stack size limit exceeded (96) in warn
>>>  define void @warn() nounwind ssp {
>>>  entry:
>>>    %buffer = alloca [80 x i8], align 1
>>> 
>>> Modified: llvm/trunk/test/CodeGen/X86/warn-stack.ll
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/warn-stack.ll?rev=197438&r1=197437&r2=197438&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/test/CodeGen/X86/warn-stack.ll (original)
>>> +++ llvm/trunk/test/CodeGen/X86/warn-stack.ll Mon Dec 16 17:22:51 2013
>>> @@ -12,7 +12,7 @@ entry:
>>>    ret void
>>>  }
>>> 
>>> -; CHECK: warning: Stack size limit exceeded (104) in warn.
>>> +; CHECK: warning: stack size limit exceeded (104) in warn
>>>  define void @warn() nounwind ssp {
>>>  entry:
>>>    %buffer = alloca [80 x i8], align 1
>>> 
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>> 
>>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131217/00b43cb1/attachment.html>


More information about the llvm-commits mailing list