// MIT License // // Copyright (c) 2022-2025 Advanced Micro Devices, Inc. All Rights Reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "exception.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace rocprofsys { namespace { template void consume_args(Args&&...) {} template auto get_backtrace(Args... _arg) { consume_args(_arg...); auto _bt = std::stringstream{}; if constexpr(sizeof...(Args) > 0) { ((_bt << _arg), ...) << "\n"; } tim::unwind::detailed_backtrace<2>(_bt, true); return strdup(_bt.str().c_str()); } } // namespace template exception::exception(const std::string& _msg) : Tp{ _msg } , m_what{ get_backtrace(_msg) } {} template exception::exception(const char* _msg) : Tp{ _msg } , m_what{ get_backtrace(_msg) } {} template exception::exception(const std::string& _msg, bool with_backtrace) : Tp{ _msg } , m_what{ with_backtrace ? get_backtrace(_msg) : strdup(_msg.c_str()) } {} template exception::~exception() { free(m_what); } template exception::exception(const exception& _rhs) : Tp{ _rhs } , m_what{ strdup(_rhs.m_what) } {} template exception& exception::operator=(const exception& _rhs) { if(this != &_rhs) { Tp::operator=(_rhs); m_what = strdup(_rhs.m_what); } return *this; } template const char* exception::what() const noexcept { return (m_what) ? m_what : Tp::what(); } template class exception; template class exception; template class exception; template class exception; template class exception; template class exception; template class exception; template class exception; template class exception; // template class exception; // template class exception; // template class exception; // template class exception; // template class exception; // template class exception; // template class exception; // template class exception; // template class exception; // template class exception; // template class exception; // template class exception; } // namespace rocprofsys