//===-- MIUtilDebug.h -------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#pragma once

#define MI_USE_DEBUG_TRACE_FN // Undefine to compile out fn trace code

// In-house headers:
#include "MIUtilString.h"

// Declarations:
class CMICmnLog;

//++
//============================================================================
// Details: MI debugging aid utility class.
//--
class CMIUtilDebug {
  // Statics:
public:
  static void ShowDlgWaitForDbgAttach();
  static void WaitForDbgAttachInfinteLoop();

  // Methods:
public:
  /* ctor */ CMIUtilDebug();

  // Overrideable:
public:
  // From CMICmnBase
  /* dtor */ virtual ~CMIUtilDebug();
};

//++
//============================================================================
// Details: MI debug utility class. Used to indicate the current function
//          depth in the call stack. It uses the CMIlCmnLog logger to output
//          the current fn trace information.
//          Use macro MI_TRACEFN( "Some fn name" ) and implement the scope of
//          the functions you wish to build up a trace off.
//          Use preprocessor definition MI_USE_DEBUG_TRACE_FN to turn off or on
//          tracing code.
//--
class CMIUtilDebugFnTrace {
  // Methods:
public:
  /* ctor */ CMIUtilDebugFnTrace(const CMIUtilString &vFnName);

  // Overrideable:
public:
  // From CMICmnBase
  /* dtor */ virtual ~CMIUtilDebugFnTrace();

  // Attributes:
private:
  const CMIUtilString m_strFnName;

  static CMICmnLog &ms_rLog;
  static MIuint ms_fnDepthCnt; // Increment count as fn depth increases,
                               // decrement count as fn stack pops off
};

//++
//============================================================================
// Details: Take the given text and send it to the server's Logger to output to
// the
//          trace file.
// Type:    Compile preprocess.
// Args:    x   - (R) Message (may be seen by user).
//--
#ifdef MI_USE_DEBUG_TRACE_FN
#define MI_TRACEFN(x) CMIUtilDebugFnTrace __MITrace(x)
#else
#define MI_TRACEFN(x)
#endif // MI_USE_DEBUG_TRACE_FN
