|  | //===- 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/DebugInfo.h" | 
|  | #include "llvm/IR/DiagnosticInfo.h" | 
|  | #include "llvm/IR/DiagnosticPrinter.h" | 
|  | #include "llvm/IR/Function.h" | 
|  | #include "llvm/IR/Instruction.h" | 
|  | #include "llvm/IR/Metadata.h" | 
|  | #include "llvm/IR/Module.h" | 
|  | #include "llvm/Support/Atomic.h" | 
|  | #include <string> | 
|  |  | 
|  | using namespace llvm; | 
|  |  | 
|  | int llvm::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(); | 
|  | } | 
|  |  | 
|  | void DiagnosticInfoDebugMetadataVersion::print(DiagnosticPrinter &DP) const { | 
|  | DP << "ignoring debug info with an invalid version (" << getMetadataVersion() | 
|  | << ") in " << getModule(); | 
|  | } | 
|  |  | 
|  | void DiagnosticInfoSampleProfile::print(DiagnosticPrinter &DP) const { | 
|  | if (getFileName() && getLineNum() > 0) | 
|  | DP << getFileName() << ":" << getLineNum() << ": "; | 
|  | else if (getFileName()) | 
|  | DP << getFileName() << ": "; | 
|  | DP << getMsg(); | 
|  | } | 
|  |  | 
|  | bool DiagnosticInfoOptimizationRemark::isLocationAvailable() const { | 
|  | return getFunction().getParent()->getNamedMetadata("llvm.dbg.cu") != nullptr; | 
|  | } | 
|  |  | 
|  | void DiagnosticInfoOptimizationRemark::getLocation(StringRef *Filename, | 
|  | unsigned *Line, | 
|  | unsigned *Column) const { | 
|  | DILocation DIL(getDebugLoc().getAsMDNode(getFunction().getContext())); | 
|  | *Filename = DIL.getFilename(); | 
|  | *Line = DIL.getLineNumber(); | 
|  | *Column = DIL.getColumnNumber(); | 
|  | } | 
|  |  | 
|  | const std::string DiagnosticInfoOptimizationRemark::getLocationStr() const { | 
|  | StringRef Filename("<unknown>"); | 
|  | unsigned Line = 0; | 
|  | unsigned Column = 0; | 
|  | if (isLocationAvailable()) | 
|  | getLocation(&Filename, &Line, &Column); | 
|  | return Twine(Filename + ":" + Twine(Line) + ":" + Twine(Column)).str(); | 
|  | } | 
|  |  | 
|  | void DiagnosticInfoOptimizationRemark::print(DiagnosticPrinter &DP) const { | 
|  | DP << getLocationStr() << ": " << getMsg(); | 
|  | } |