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

#ifndef liblldb_StopInfoMachException_h_
#define liblldb_StopInfoMachException_h_

// C Includes
// C++ Includes
#include <string>

// Other libraries and framework includes
// Project includes
#include "lldb/Target/StopInfo.h"

namespace lldb_private {

class StopInfoMachException : public StopInfo
{
public:
    //------------------------------------------------------------------
    // Constructors and Destructors
    //------------------------------------------------------------------
    StopInfoMachException (Thread &thread, 
                           uint32_t exc_type, 
                           uint32_t exc_data_count,
                           uint64_t exc_code, 
                           uint64_t exc_subcode) :
        StopInfo (thread, exc_type),
        m_exc_data_count (exc_data_count),
        m_exc_code (exc_code),
        m_exc_subcode (exc_subcode)
    {
    }

    virtual ~StopInfoMachException()
    {
    }


    virtual lldb::StopReason
    GetStopReason () const
    {
        return lldb::eStopReasonException;
    }

    virtual const char *
    GetDescription ();

    // Since some mach exceptions will be reported as breakpoints, signals,
    // or trace, we use this static accessor which will translate the mach
    // exception into the correct StopInfo.
    static lldb::StopInfoSP
    CreateStopReasonWithMachException (Thread &thread, 
                                       uint32_t exc_type, 
                                       uint32_t exc_data_count,
                                       uint64_t exc_code, 
                                       uint64_t exc_subcode);
    
protected:
    uint32_t m_exc_data_count;
    uint64_t m_exc_code;
    uint64_t m_exc_subcode;
    std::string m_description;
};


} // namespace lldb_private

#endif  // liblldb_StopInfoMachException_h_
