1292932Sdim//===-- DebugMacros.h -------------------------------------------*- C++ -*-===// 2292932Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6292932Sdim// 7292932Sdim//===----------------------------------------------------------------------===// 8292932Sdim 9292932Sdim#ifndef liblldb_DebugMacros_h_ 10292932Sdim#define liblldb_DebugMacros_h_ 11292932Sdim 12292932Sdim#include <memory> 13292932Sdim#include <vector> 14292932Sdim 15321369Sdim#include "lldb/Utility/ConstString.h" 16292932Sdim#include "lldb/lldb-private.h" 17292932Sdim 18292932Sdimnamespace lldb_private { 19292932Sdim 20292932Sdimclass CompileUnit; 21292932Sdimclass DebugMacros; 22292932Sdimtypedef std::shared_ptr<DebugMacros> DebugMacrosSP; 23292932Sdim 24314564Sdimclass DebugMacroEntry { 25292932Sdimpublic: 26360784Sdim enum EntryType : uint8_t { 27360784Sdim INVALID, DEFINE, UNDEF, START_FILE, END_FILE, INDIRECT 28360784Sdim }; 29292932Sdim 30292932Sdimpublic: 31314564Sdim static DebugMacroEntry CreateDefineEntry(uint32_t line, const char *str); 32292932Sdim 33314564Sdim static DebugMacroEntry CreateUndefEntry(uint32_t line, const char *str); 34292932Sdim 35314564Sdim static DebugMacroEntry CreateStartFileEntry(uint32_t line, 36314564Sdim uint32_t debug_line_file_idx); 37292932Sdim 38314564Sdim static DebugMacroEntry CreateEndFileEntry(); 39292932Sdim 40314564Sdim static DebugMacroEntry 41314564Sdim CreateIndirectEntry(const DebugMacrosSP &debug_macros_sp); 42292932Sdim 43314564Sdim DebugMacroEntry() : m_type(INVALID) {} 44292932Sdim 45314564Sdim ~DebugMacroEntry() = default; 46292932Sdim 47360784Sdim EntryType GetType() const { return static_cast<EntryType>(m_type); } 48292932Sdim 49314564Sdim uint64_t GetLineNumber() const { return m_line; } 50292932Sdim 51314564Sdim ConstString GetMacroString() const { return m_str; } 52292932Sdim 53314564Sdim const FileSpec &GetFileSpec(CompileUnit *comp_unit) const; 54292932Sdim 55314564Sdim DebugMacros *GetIndirectDebugMacros() const { 56314564Sdim return m_debug_macros_sp.get(); 57314564Sdim } 58292932Sdim 59292932Sdimprivate: 60314564Sdim DebugMacroEntry(EntryType type, uint32_t line, uint32_t debug_line_file_idx, 61314564Sdim const char *str); 62292932Sdim 63314564Sdim DebugMacroEntry(EntryType type, const DebugMacrosSP &debug_macros_sp); 64292932Sdim 65360784Sdim uint32_t m_type : 3; 66314564Sdim uint32_t m_line : 29; 67314564Sdim uint32_t m_debug_line_file_idx; 68314564Sdim ConstString m_str; 69314564Sdim DebugMacrosSP m_debug_macros_sp; 70292932Sdim}; 71292932Sdim 72314564Sdimclass DebugMacros { 73292932Sdimpublic: 74314564Sdim DebugMacros() = default; 75292932Sdim 76314564Sdim ~DebugMacros() = default; 77292932Sdim 78314564Sdim void AddMacroEntry(const DebugMacroEntry &entry) { 79314564Sdim m_macro_entries.push_back(entry); 80314564Sdim } 81292932Sdim 82314564Sdim size_t GetNumMacroEntries() const { return m_macro_entries.size(); } 83292932Sdim 84314564Sdim DebugMacroEntry GetMacroEntryAtIndex(const size_t index) const { 85314564Sdim if (index < m_macro_entries.size()) 86314564Sdim return m_macro_entries[index]; 87314564Sdim else 88314564Sdim return DebugMacroEntry(); 89314564Sdim } 90292932Sdim 91292932Sdimprivate: 92314564Sdim DISALLOW_COPY_AND_ASSIGN(DebugMacros); 93292932Sdim 94314564Sdim std::vector<DebugMacroEntry> m_macro_entries; 95292932Sdim}; 96292932Sdim 97292932Sdim} // namespace lldb_private 98292932Sdim 99292932Sdim#endif // liblldb_DebugMacros_h_ 100