/*
 * Copyright (C) 2019 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.
 */

#include "src/traceconv/symbolize_profile.h"

#include <vector>

#include "perfetto/base/logging.h"
#include "perfetto/trace_processor/trace_processor.h"

#include "src/profiling/symbolizer/breakpad_symbolizer.h"
#include "src/profiling/symbolizer/local_symbolizer.h"
#include "src/profiling/symbolizer/symbolize_database.h"
#include "src/profiling/symbolizer/symbolizer.h"

#include "protos/perfetto/trace/trace.pbzero.h"
#include "protos/perfetto/trace/trace_packet.pbzero.h"
#include "src/traceconv/utils.h"

namespace perfetto {
namespace trace_to_text {

// Ingest profile, and emit a symbolization table for each sequence. This can
// be prepended to the profile to attach the symbol information.
int SymbolizeProfile(std::istream* input, std::ostream* output) {
  std::unique_ptr<profiling::Symbolizer> symbolizer;
  const char* breakpad_dir = getenv("BREAKPAD_SYMBOL_DIR");
  if (breakpad_dir == nullptr) {
    symbolizer = profiling::LocalSymbolizerOrDie(
        profiling::GetPerfettoBinaryPath(), getenv("PERFETTO_SYMBOLIZER_MODE"));
  } else {
    symbolizer.reset(new profiling::BreakpadSymbolizer(breakpad_dir));
  }

  if (!symbolizer)
    PERFETTO_FATAL("No symbolizer selected");
  trace_processor::Config config;
  std::unique_ptr<trace_processor::TraceProcessor> tp =
      trace_processor::TraceProcessor::CreateInstance(config);

  if (!ReadTraceUnfinalized(tp.get(), input))
    PERFETTO_FATAL("Failed to read trace.");

  tp->Flush();

  SymbolizeDatabase(
      tp.get(), symbolizer.get(),
      [output](const std::string& trace_proto) { *output << trace_proto; });

  tp->NotifyEndOfFile();
  return 0;
}

}  // namespace trace_to_text
}  // namespace perfetto
