/*
 * 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 <string>
#include <vector>

#include "perfetto/base/status.h"
#include "perfetto/ext/base/optional.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.
  base::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_
