/*
 * Copyright (C) 2021 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 SRC_PROFILING_SYMBOLIZER_BREAKPAD_PARSER_H_
#define SRC_PROFILING_SYMBOLIZER_BREAKPAD_PARSER_H_

#include <optional>
#include <string>
#include <vector>

#include "perfetto/base/status.h"
#include "perfetto/ext/base/string_view.h"

namespace perfetto {
namespace profiling {

// The BreakpadParser class is used to parse a breakpad file and store data on
// symbols so that a given address can be used to query a symbol. The class is
// instantiated with the |file_path| of the file to be parsed. Breakpad file
// format:
// https://chromium.googlesource.com/breakpad/breakpad/+/master/docs/symbol_files.md
// Usage:
//
// BreakpadParser parser("file.breakpad");
// parser.ParseFile();
// std::string symbol = parser.GetSymbol(addr);
class BreakpadParser {
 public:
  struct Symbol {
    // The address where a function starts.
    uint64_t start_address = 0;
    // The length in bytes of the function's instructions.
    size_t function_size = 0;
    // The human-readable name for the function signature.
    std::string symbol_name;
  };

  explicit BreakpadParser(const std::string& file_path);

  BreakpadParser(const BreakpadParser& other) = delete;
  BreakpadParser& operator=(const BreakpadParser& other) = delete;

  // Fills in |symbols_| by parsing the breakpad file given.
  // Returns true if it is able to parse the entire file specified by
  // |file_path_|. Returns false if the parsing fails.
  bool ParseFile();

  // Parses from  a string instead of a file.
  bool ParseFromString(const std::string& file_contents);

  // Returns the function name corresponding to |address| as a string. The
  // search is log(N) on the number of functions in the binary. |address| is the
  // relative offset from the start of the binary.
  std::optional<std::string> GetSymbol(uint64_t address) const;

  const std::vector<Symbol>& symbols_for_testing() const { return symbols_; }

 private:
  // Parses the given string and creates a new Symbol object if it is a FUNC
  // record. Returns an ok status if it was successfully able to add to the
  // |symbols_| or if the string is not a FUNC record. Return a fail status on
  // parsing errors on FUNC record.
  base::Status ParseIfFuncRecord(base::StringView current_line);

  std::vector<Symbol> symbols_;
  const std::string file_path_;
};

}  // namespace profiling
}  // namespace perfetto

#endif  // SRC_PROFILING_SYMBOLIZER_BREAKPAD_PARSER_H_
