<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">Should be fixed with r197447.<div><br></div><div>Tell me if I missed something.</div><div><br></div><div>Thanks,<br><div apple-content-edited="true">
<div style="color: rgb(0, 0, 0); font-family: Helvetica;  font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">-Quentin</div>

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