[llvm] r197438 - Add warning capabilities in LLVM.

Eric Christopher echristo at gmail.com
Mon Dec 16 16:18:11 PST 2013


>
>
> Were you planning on doing the inline assembly changes?
>
> If you meant replacing the calls to LLVMContext::emitError into calls to
> LLVMContext::diagnose with the appropriate DiagnosticInfo class, yes I have
> planed to do that soon.
>
>
I meant this, yes :)

and Thanks.


> If you meant replacing/updating diagnostic machinery used for
> SMDiagnostic, I was planing to make a RFC. This was part of the open
> questions.
>
>
Cool deal.

-eric


> Cheers,
> -Quentin
>
>
> -eric
>
> On Mon Dec 16 2013 at 3:28:56 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131217/6c4a43c7/attachment.html>


More information about the llvm-commits mailing list