//===-- InstrumentationRuntime.cpp ----------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===---------------------------------------------------------------------===//

#include "lldb/Target/InstrumentationRuntime.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/ModuleList.h"
#include "lldb/Core/PluginManager.h"
#include "lldb/Target/Process.h"
#include "lldb/Utility/RegularExpression.h"
#include "lldb/lldb-private.h"

using namespace lldb;
using namespace lldb_private;

void InstrumentationRuntime::ModulesDidLoad(
    lldb_private::ModuleList &module_list, lldb_private::Process *process,
    InstrumentationRuntimeCollection &runtimes) {
  for (auto &cbs : PluginManager::GetInstrumentationRuntimeCallbacks()) {
    InstrumentationRuntimeType type = cbs.get_type_callback();
    if (runtimes.find(type) == runtimes.end())
      runtimes[type] = cbs.create_callback(process->shared_from_this());
  }
}

void InstrumentationRuntime::ModulesDidLoad(
    lldb_private::ModuleList &module_list) {
  if (IsActive())
    return;

  if (GetRuntimeModuleSP()) {
    Activate();
    return;
  }

  module_list.ForEach([this](const lldb::ModuleSP module_sp) {
    const FileSpec &file_spec = module_sp->GetFileSpec();
    if (!file_spec)
      return IterationAction::Continue;

    const RegularExpression &runtime_regex = GetPatternForRuntimeLibrary();
    if (MatchAllModules() ||
        runtime_regex.Execute(file_spec.GetFilename().GetCString()) ||
        module_sp->IsExecutable()) {
      if (CheckIfRuntimeIsValid(module_sp)) {
        SetRuntimeModuleSP(module_sp);
        Activate();
        if (!IsActive())
          SetRuntimeModuleSP({}); // Don't cache module if activation failed.
        return IterationAction::Stop;
      }
    }

    return IterationAction::Continue;
  });
}

lldb::ThreadCollectionSP
InstrumentationRuntime::GetBacktracesFromExtendedStopInfo(
    StructuredData::ObjectSP info) {
  return std::make_shared<ThreadCollection>();
}
