// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/developer/debug/zxdb/symbols/dwarf_tag.h"

#include <iterator>

#include "src/lib/fxl/strings/string_printf.h"

namespace zxdb {

namespace {

// Undefined values will be null.
const char* kDwarfTagNames[] = {
    "<none>",                           // 0x00
    "DW_TAG_array_type",                // 0x01
    "DW_TAG_class_type",                // 0x02
    "DW_TAG_entry_point",               // 0x03
    "DW_TAG_enumeration_type",          // 0x04
    "DW_TAG_formal_parameter",          // 0x05
    nullptr,                            // 0x06
    nullptr,                            // 0x07
    "DW_TAG_imported_declaration",      // 0x08
    nullptr,                            // 0x09
    "DW_TAG_label",                     // 0x0a
    "DW_TAG_lexical_block",             // 0x0b
    nullptr,                            // 0x0c
    "DW_TAG_member",                    // 0x0d
    nullptr,                            // 0x0e
    "DW_TAG_pointer_type",              // 0x0f
    "DW_TAG_reference_type",            // 0x10
    "DW_TAG_compile_unit",              // 0x11
    "DW_TAG_string_type",               // 0x12
    "DW_TAG_structure_type",            // 0x13
    nullptr,                            // 0x14
    "DW_TAG_subroutine_type",           // 0x15
    "DW_TAG_typedef",                   // 0x16
    "DW_TAG_union_type",                // 0x17
    "DW_TAG_unspecified_parameters",    // 0x18
    "DW_TAG_variant",                   // 0x19
    "DW_TAG_common_block",              // 0x1a
    "DW_TAG_common_inclusion",          // 0x1b
    "DW_TAG_inheritance",               // 0x1c
    "DW_TAG_inlined_subroutine",        // 0x1d
    "DW_TAG_module",                    // 0x1e
    "DW_TAG_ptr_to_member_type",        // 0x1f
    "DW_TAG_set_type",                  // 0x20
    "DW_TAG_subrange_type",             // 0x21
    "DW_TAG_with_stmt",                 // 0x22
    "DW_TAG_access_declaration",        // 0x23
    "DW_TAG_base_type",                 // 0x24
    "DW_TAG_catch_block",               // 0x25
    "DW_TAG_const_type",                // 0x26
    "DW_TAG_constant",                  // 0x27
    "DW_TAG_enumerator",                // 0x28
    "DW_TAG_file_type",                 // 0x29
    "DW_TAG_friend",                    // 0x2a
    "DW_TAG_namelist",                  // 0x2b
    "DW_TAG_namelist_item",             // 0x2c
    "DW_TAG_packed_type",               // 0x2d
    "DW_TAG_subprogram",                // 0x2e
    "DW_TAG_template_type_parameter",   // 0x2f
    "DW_TAG_template_value_parameter",  // 0x30
    "DW_TAG_thrown_type",               // 0x31
    "DW_TAG_try_block",                 // 0x32
    "DW_TAG_variant_part",              // 0x33
    "DW_TAG_variable",                  // 0x34
    "DW_TAG_volatile_type",             // 0x35
    "DW_TAG_dwarf_procedure",           // 0x36
    "DW_TAG_restrict_type",             // 0x37
    "DW_TAG_interface_type",            // 0x38
    "DW_TAG_namespace",                 // 0x39
    "DW_TAG_imported_module",           // 0x3a
    "DW_TAG_unspecified_type",          // 0x3b
    "DW_TAG_partial_unit",              // 0x3c
    "DW_TAG_imported_unit",             // 0x3d
    nullptr,                            // 0x3e
    "DW_TAG_condition",                 // 0x3f
    "DW_TAG_shared_type",               // 0x40
    "DW_TAG_type_unit",                 // 0x41
    "DW_TAG_rvalue_reference_type",     // 0x42
    "DW_TAG_template_alias",            // 0x43
    "DW_TAG_coarray_type",              // 0x44
    "DW_TAG_generic_subrange",          // 0x45
    "DW_TAG_dynamic_type",              // 0x46
    "DW_TAG_atomic_type",               // 0x47
    "DW_TAG_call_site",                 // 0x48
    "DW_TAG_call_site_parameter",       // 0x49
    "DW_TAG_skeleton_unit",             // 0x4a
    "DW_TAG_immutable_type",            // 0x4b
};

constexpr size_t kDwarfTagNameCount = static_cast<size_t>(DwarfTag::kLastDefined);
static_assert(std::size(kDwarfTagNames) == kDwarfTagNameCount,
              "Update DWARF tag name array for changes to enum.");

}  // namespace

bool DwarfTagIsType(DwarfTag tag) {
  return DwarfTagIsTypeModifier(tag) || tag == DwarfTag::kArrayType || tag == DwarfTag::kBaseType ||
         tag == DwarfTag::kClassType || tag == DwarfTag::kEnumerationType ||
         tag == DwarfTag::kPtrToMemberType || tag == DwarfTag::kStringType ||
         tag == DwarfTag::kStructureType || tag == DwarfTag::kSubroutineType ||
         tag == DwarfTag::kUnionType || tag == DwarfTag::kUnspecifiedType;

  // Types in languages we ignore for now:
  //   kInterfaceType
  //   kSetType
  //   kSharedType
  //   kPackedType
  //   kFileType
}

bool DwarfTagIsTypeModifier(DwarfTag tag) {
  return tag == DwarfTag::kConstType || tag == DwarfTag::kPointerType ||
         tag == DwarfTag::kReferenceType || tag == DwarfTag::kRestrictType ||
         tag == DwarfTag::kRvalueReferenceType || tag == DwarfTag::kTypedef ||
         tag == DwarfTag::kVolatileType || tag == DwarfTag::kImportedDeclaration ||
         tag == DwarfTag::kAtomicType;
}

bool DwarfTagIsCVQualifier(DwarfTag tag) {
  return tag == DwarfTag::kConstType || tag == DwarfTag::kVolatileType ||
         tag == DwarfTag::kRestrictType || tag == DwarfTag::kAtomicType;
}

bool DwarfTagIsEitherReference(DwarfTag tag) {
  return tag == DwarfTag::kReferenceType || tag == DwarfTag::kRvalueReferenceType;
}

bool DwarfTagIsPointerOrReference(DwarfTag tag) {
  return DwarfTagIsEitherReference(tag) || tag == DwarfTag::kPointerType;
}

std::string DwarfTagToString(DwarfTag tag, bool include_number) {
  unsigned int_tag = static_cast<unsigned>(tag);
  if (int_tag < kDwarfTagNameCount && kDwarfTagNames[int_tag]) {
    if (include_number)
      return fxl::StringPrintf("%s (0x%02x)", kDwarfTagNames[int_tag], int_tag);
    return kDwarfTagNames[int_tag];
  }
  return fxl::StringPrintf("<undefined (0x%x)>", static_cast<unsigned>(int_tag));
}

}  // namespace zxdb
