/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef SIMPLE_PERF_DSO_H_
#define SIMPLE_PERF_DSO_H_

#include <memory>
#include <optional>
#include <string>
#include <string_view>
#include <unordered_map>
#include <vector>

#include <android-base/file.h>
#include <android-base/logging.h>

#include "build_id.h"
#include "kallsyms.h"
#include "read_elf.h"

namespace simpleperf {
namespace simpleperf_dso_impl {

// Find elf files with symbol table and debug information.
class DebugElfFileFinder {
 public:
  void Reset();
  void AllowMismatchedBuildId() { allow_mismatched_build_id_ = true; }
  bool SetSymFsDir(const std::string& symfs_dir);
  bool AddSymbolDir(const std::string& symbol_dir);
  void SetVdsoFile(const std::string& vdso_file, bool is_64bit);
  std::string FindDebugFile(const std::string& dso_path, bool force_64bit, BuildId& build_id);
  // Only for testing
  std::string GetPathInSymFsDir(const std::string& path);

 private:
  void CollectBuildIdInDir(const std::string& dir);
  std::optional<std::string> SearchFileMapByPath(const std::string& path);
  bool CheckDebugFilePath(const std::string& path, BuildId& build_id,
                          bool report_build_id_mismatch);

  bool allow_mismatched_build_id_ = false;
  std::string vdso_64bit_;
  std::string vdso_32bit_;
  std::string symfs_dir_;
  std::unordered_map<std::string, std::string> build_id_to_file_map_;
  std::vector<std::string> no_build_id_files_;
};

}  // namespace simpleperf_dso_impl

struct Symbol {
  uint64_t addr;
  // TODO: make len uint32_t.
  uint64_t len;

  Symbol(std::string_view name, uint64_t addr, uint64_t len);
  const char* Name() const { return name_; }

  const char* DemangledName() const;
  void SetDemangledName(std::string_view name) const;
  // Return function name without signature.
  std::string_view FunctionName() const;

  bool HasDumpId() const { return dump_id_ != UINT_MAX; }

  bool GetDumpId(uint32_t* pdump_id) const {
    if (!HasDumpId()) {
      return false;
    }
    *pdump_id = dump_id_;
    return true;
  }

  static bool CompareByDumpId(const Symbol* s1, const Symbol* s2) {
    uint32_t id1 = UINT_MAX;
    s1->GetDumpId(&id1);
    uint32_t id2 = UINT_MAX;
    s2->GetDumpId(&id2);
    return id1 < id2;
  }

  static bool CompareByAddr(const Symbol* s1, const Symbol* s2) { return s1->addr < s2->addr; }

  static bool CompareValueByAddr(const Symbol& s1, const Symbol& s2) { return s1.addr < s2.addr; }

 private:
  const char* name_;
  mutable const char* demangled_name_;
  mutable uint32_t dump_id_;

  friend class Dso;
};

enum DsoType {
  DSO_KERNEL,
  DSO_KERNEL_MODULE,
  DSO_ELF_FILE,
  DSO_DEX_FILE,  // For files containing dex files, like .vdex files.
  DSO_SYMBOL_MAP_FILE,
  DSO_UNKNOWN_FILE,
  // DSO_UNKNOWN_FILE is written to the file feature section in recording files. Changing its value
  // may cause compatibility issue. So put new DsoTypes below.
};

class Dso {
 public:
  static void SetDemangle(bool demangle);
  static std::string Demangle(const std::string& name);
  // SymFsDir is used to provide an alternative root directory looking for files with symbols.
  // For example, if we are searching symbols for /system/lib/libc.so and SymFsDir is /data/symbols,
  // then we will also search file /data/symbols/system/lib/libc.so.
  static bool SetSymFsDir(const std::string& symfs_dir);
  // SymbolDir is used to add a directory containing files with symbols. Each file under it will
  // be searched recursively to build a build_id_map.
  static bool AddSymbolDir(const std::string& symbol_dir);
  static void SetVmlinux(const std::string& vmlinux);
  static void SetKallsyms(std::string kallsyms) {
    if (!kallsyms.empty()) {
      kallsyms_ = std::move(kallsyms);
    }
  }
  static void AllowMismatchedBuildId();
  static void SetBuildIds(const std::vector<std::pair<std::string, BuildId>>& build_ids);
  static BuildId FindExpectedBuildIdForPath(const std::string& path);
  static void SetVdsoFile(const std::string& vdso_file, bool is_64bit);

  static std::unique_ptr<Dso> CreateDso(DsoType dso_type, const std::string& dso_path,
                                        bool force_64bit = false);
  static std::unique_ptr<Dso> CreateDsoWithBuildId(DsoType dso_type, const std::string& dso_path,
                                                   BuildId& build_id);
  static std::unique_ptr<Dso> CreateKernelModuleDso(const std::string& dso_path,
                                                    uint64_t memory_start, uint64_t memory_end,
                                                    Dso* kernel_dso);
  virtual ~Dso();

  DsoType type() const { return type_; }

  // Return the path recorded in perf.data.
  const std::string& Path() const { return path_; }
  // Return the path containing symbol table and debug information.
  const std::string& GetDebugFilePath() const {
    if (!debug_file_path_.has_value()) {
      debug_file_path_ = FindDebugFilePath();
    }
    return debug_file_path_.value();
  }

  // Return the path beautified for reporting.
  virtual std::string_view GetReportPath() const { return Path(); }
  // Return the file name without directory info.
  const std::string& FileName() const { return file_name_; }

  bool HasDumpId() { return dump_id_ != UINT_MAX; }

  bool GetDumpId(uint32_t* pdump_id) {
    if (!HasDumpId()) {
      return false;
    }
    *pdump_id = dump_id_;
    return true;
  }

  uint32_t CreateDumpId();
  uint32_t CreateSymbolDumpId(const Symbol* symbol);

  virtual void SetMinExecutableVaddr(uint64_t, uint64_t) {}
  virtual void GetMinExecutableVaddr(uint64_t* min_vaddr, uint64_t* file_offset) {
    *min_vaddr = 0;
    *file_offset = 0;
  }
  virtual void AddDexFileOffset(uint64_t) {}
  virtual const std::vector<uint64_t>* DexFileOffsets() { return nullptr; }

  virtual uint64_t IpToVaddrInFile(uint64_t ip, uint64_t map_start, uint64_t map_pgoff) = 0;
  virtual std::optional<uint64_t> IpToFileOffset(uint64_t ip, uint64_t map_start,
                                                 uint64_t map_pgoff);

  const Symbol* FindSymbol(uint64_t vaddr_in_dso);
  void LoadSymbols();
  const std::vector<Symbol>& GetSymbols() const { return symbols_; }
  void SetSymbols(std::vector<Symbol>* symbols);

  // Create a symbol for a virtual address which can't find a corresponding
  // symbol in symbol table.
  void AddUnknownSymbol(uint64_t vaddr_in_dso, const std::string& name);
  bool IsForJavaMethod() const;

 protected:
  static bool demangle_;
  static std::string vmlinux_;
  static std::string kallsyms_;
  static std::unordered_map<std::string, BuildId> build_id_map_;
  static size_t dso_count_;
  static uint32_t g_dump_id_;
  static simpleperf_dso_impl::DebugElfFileFinder debug_elf_file_finder_;

  Dso(DsoType type, const std::string& path);
  BuildId GetExpectedBuildId() const;

  virtual std::string FindDebugFilePath() const { return path_; }
  virtual std::vector<Symbol> LoadSymbolsImpl() = 0;

  DsoType type_;
  // path of the shared library used by the profiled program
  const std::string path_;
  // path of the shared library having symbol table and debug information
  // It is the same as path_, or has the same build id as path_.
  mutable std::optional<std::string> debug_file_path_;
  // File name of the shared library, got by removing directories in path_.
  std::string file_name_;
  std::vector<Symbol> symbols_;
  // unknown symbols are like [libc.so+0x1234].
  std::unordered_map<uint64_t, Symbol> unknown_symbols_;
  bool is_loaded_;
  // Used to identify current dso if it needs to be dumped.
  uint32_t dump_id_;
  // Used to assign dump_id for symbols in current dso.
  uint32_t symbol_dump_id_;
  android::base::LogSeverity symbol_warning_loglevel_;
};

const char* DsoTypeToString(DsoType dso_type);
bool GetBuildIdFromDsoPath(const std::string& dso_path, BuildId* build_id);
bool GetBuildId(const Dso& dso, BuildId& build_id);

}  // namespace simpleperf

#endif  // SIMPLE_PERF_DSO_H_
