# Copyright 2018 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.

import("//build/config/clang/clang.gni")

static_library("symbols") {
  # The client library one directory up instantiates the "Impl" classes using
  # the non-public headers.
  friend = [
    ":*",
    "//src/developer/debug/zxdb/client/*",
  ]

  public = [
    "arch.h",
    "array_type.h",
    "base_type.h",
    "code_block.h",
    "collection.h",
    "data_member.h",
    "dwarf_expr_eval.h",
    "dwarf_tag.h",
    "enumeration.h",
    "file_line.h",
    "function.h",
    "function_type.h",
    "identifier.h",
    "inherited_from.h",
    "input_location.h",
    "lazy_symbol.h",
    "line_details.h",
    "loaded_module_symbols.h",
    "location.h",
    "member_ptr.h",
    "modified_type.h",
    "module_symbol_index.h",
    "module_symbol_index_node.h",
    "module_symbol_status.h",
    "module_symbols.h",
    "namespace.h",
    "process_symbols.h",
    "resolve_options.h",
    "symbol.h",
    "symbol_context.h",
    "symbol_data_provider.h",
    "symbol_factory.h",
    "symbol_utils.h",
    "system_symbols.h",
    "target_symbols.h",
    "type.h",
    "type_utils.h",
    "value.h",
    "variable.h",
    "variable_location.h",
    "visit_scopes.h",
  ]

  sources = [
    "arch.cc",
    "array_type.cc",
    "base_type.cc",
    "build_id_index.cc",
    "build_id_index.h",
    "code_block.cc",
    "collection.cc",
    "data_member.cc",
    "dwarf_die_decoder.cc",
    "dwarf_die_decoder.h",
    "dwarf_expr_eval.cc",
    "dwarf_symbol_factory.cc",
    "dwarf_symbol_factory.h",
    "dwarf_tag.cc",
    "enumeration.cc",
    "file_line.cc",
    "find_line.cc",
    "find_line.h",
    "function.cc",
    "function_type.cc",
    "identifier.cc",
    "inherited_from.cc",
    "lazy_symbol.cc",
    "line_details.cc",
    "line_table.h",
    "line_table_impl.cc",
    "line_table_impl.h",
    "loaded_module_symbols.cc",
    "location.cc",
    "member_ptr.cc",
    "modified_type.cc",
    "module_symbol_index.cc",
    "module_symbol_index_node.cc",
    "module_symbols.cc",
    "module_symbols_impl.cc",
    "module_symbols_impl.h",
    "namespace.cc",
    "process_symbols.cc",
    "symbol.cc",
    "symbol_context.cc",
    "symbol_data_provider.cc",
    "symbol_utils.cc",
    "system_symbols.cc",
    "target_symbols.cc",
    "type.cc",
    "type_utils.cc",
    "value.cc",
    "variable.cc",
    "variable_location.cc",
    "visit_scopes.cc",
  ]

  # This library can not use any part of the debugger other than the "common"
  # base helpers.
  public_deps = [
    "//src/developer/debug/ipc:client",
    "//src/developer/debug/shared",
    "//src/developer/debug/zxdb/common",
    "//src/lib/elflib",
    "//src/lib/fxl",
  ]

  deps = [
    "//garnet/third_party/llvm:LLVMDebugInfoDWARF",
    "//src/lib/elflib",
  ]
}

static_library("test_support") {
  testonly = true

  sources = [
    "index_test_support.cc",
    "index_test_support.h",
    "mock_line_table.cc",
    "mock_line_table.h",
    "mock_module_symbols.cc",
    "mock_module_symbols.h",
    "mock_symbol_data_provider.cc",
    "mock_symbol_data_provider.h",
    "process_symbols_test_setup.cc",
    "process_symbols_test_setup.h",
    "type_test_support.cc",
    "type_test_support.h",
    "variable_test_support.cc",
    "variable_test_support.h",
  ]

  deps = [
    ":symbols",
    "//garnet/third_party/llvm:LLVMDebugInfoDWARF",
  ]
}

# Copies the test libraries for zxdb tests to use when run on Linux or Mac.
default_shared_out_dir =
    get_label_info("//anything(${default_toolchain}-shared)", "root_out_dir")
copy("copy_test_so") {
  sources = [
    "$default_shared_out_dir/lib.unstripped/libzxdb_symbol_test.so",
    "test_data/libsymbol_test_so.targetso",
    "test_data/libsymbol_test_so_stripped.targetso",
  ]

  # Use a ".targetso" extension because this isn't a library that can actually
  # loaded on the host platform.
  outputs = [
    "$root_out_dir/test_data/zxdb/{{source_name_part}}.targetso",
  ]

  deps = [
    "test_data:zxdb_symbol_test(${default_toolchain}-shared)",
  ]
}

if (current_toolchain == host_toolchain) {
  copy("copy_test_elf_file") {
    # This file is a small valid ELF file for testing the parser with.
    # It was generated by compiling the program:
    #   int main() { return 1; }
    # on Linux with:
    #   gcc -O2 file.c
    sources = [
      "test_data/small_test_file.elf",
    ]
    outputs = [
      "$root_out_dir/test_data/zxdb/small_test_file.elf",
    ]

    metadata = {
      test_runtime_deps = outputs
    }
  }
}

source_set("tests") {
  testonly = true

  sources = [
    "build_id_index_unittest.cc",
    "code_block_unittest.cc",
    "dwarf_expr_eval_unittest.cc",
    "dwarf_symbol_factory_unittest.cc",
    "dwarf_test_util.cc",
    "dwarf_test_util.h",
    "find_line_unittest.cc",
    "function_type_unittest.cc",
    "identifier_unittest.cc",
    "loaded_module_symbols_unittest.cc",
    "member_ptr_unittest.cc",
    "mock_symbol_data_provider_unittest.cc",
    "modified_type_unittest.cc",
    "module_symbol_index_node_unittest.cc",
    "module_symbol_index_unittest.cc",
    "module_symbols_impl_unittest.cc",
    "process_symbols_unittest.cc",
    "symbol_utils_unittest.cc",
    "target_symbols_unittest.cc",
    "test_symbol_module.cc",
    "type_utils_unittest.cc",
    "variable_location_unittest.cc",
    "visit_scopes_unittest.cc",
  ]

  deps = [
    ":copy_test_elf_file($host_toolchain)",
    ":symbols",
    ":test_support",
    "//garnet/third_party/llvm:LLVMDebugInfoDWARF",
    "//src/developer/debug/zxdb/common:test_support",
    "//third_party/googletest:gtest",
  ]

  data_deps = [
    ":copy_test_so",
  ]

  metadata = {
    test_runtime_deps = get_target_outputs(":copy_test_so")
  }
}

source_set("perf_tests") {
  testonly = true

  sources = [
    "module_symbol_index_perftest.cc",
  ]

  deps = [
    ":symbols",
    "//src/developer/debug/zxdb/common:perf_test",
  ]
}
