//===-- ObjectFileJIT.cpp ---------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "llvm/ADT/StringRef.h"

#include "ObjectFileJIT.h"

#include "lldb/Core/ArchSpec.h"
#include "lldb/Core/DataBuffer.h"
#include "lldb/Core/DataBufferHeap.h"
#include "lldb/Core/Debugger.h"
#include "lldb/Core/FileSpecList.h"
#include "lldb/Core/Log.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/ModuleSpec.h"
#include "lldb/Core/PluginManager.h"
#include "lldb/Core/RangeMap.h"
#include "lldb/Core/Section.h"
#include "lldb/Core/StreamFile.h"
#include "lldb/Core/StreamString.h"
#include "lldb/Core/Timer.h"
#include "lldb/Core/UUID.h"
#include "lldb/Host/FileSpec.h"
#include "lldb/Host/Host.h"
#include "lldb/Symbol/ObjectFile.h"
#include "lldb/Target/Platform.h"
#include "lldb/Target/Process.h"
#include "lldb/Target/SectionLoadList.h"
#include "lldb/Target/Target.h"

#ifndef __APPLE__
#include "Utility/UuidCompatibility.h"
#endif

using namespace lldb;
using namespace lldb_private;

void ObjectFileJIT::Initialize() {
  PluginManager::RegisterPlugin(GetPluginNameStatic(),
                                GetPluginDescriptionStatic(), CreateInstance,
                                CreateMemoryInstance, GetModuleSpecifications);
}

void ObjectFileJIT::Terminate() {
  PluginManager::UnregisterPlugin(CreateInstance);
}

lldb_private::ConstString ObjectFileJIT::GetPluginNameStatic() {
  static ConstString g_name("jit");
  return g_name;
}

const char *ObjectFileJIT::GetPluginDescriptionStatic() {
  return "JIT code object file";
}

ObjectFile *ObjectFileJIT::CreateInstance(const lldb::ModuleSP &module_sp,
                                          DataBufferSP &data_sp,
                                          lldb::offset_t data_offset,
                                          const FileSpec *file,
                                          lldb::offset_t file_offset,
                                          lldb::offset_t length) {
  // JIT'ed object file is backed by the ObjectFileJITDelegate, never
  // read from a file
  return NULL;
}

ObjectFile *ObjectFileJIT::CreateMemoryInstance(const lldb::ModuleSP &module_sp,
                                                DataBufferSP &data_sp,
                                                const ProcessSP &process_sp,
                                                lldb::addr_t header_addr) {
  // JIT'ed object file is backed by the ObjectFileJITDelegate, never
  // read from memory
  return NULL;
}

size_t ObjectFileJIT::GetModuleSpecifications(
    const lldb_private::FileSpec &file, lldb::DataBufferSP &data_sp,
    lldb::offset_t data_offset, lldb::offset_t file_offset,
    lldb::offset_t length, lldb_private::ModuleSpecList &specs) {
  // JIT'ed object file can't be read from a file on disk
  return 0;
}

ObjectFileJIT::ObjectFileJIT(const lldb::ModuleSP &module_sp,
                             const ObjectFileJITDelegateSP &delegate_sp)
    : ObjectFile(module_sp, NULL, 0, 0, DataBufferSP(), 0), m_delegate_wp() {
  if (delegate_sp) {
    m_delegate_wp = delegate_sp;
    m_data.SetByteOrder(delegate_sp->GetByteOrder());
    m_data.SetAddressByteSize(delegate_sp->GetAddressByteSize());
  }
}

ObjectFileJIT::~ObjectFileJIT() {}

bool ObjectFileJIT::ParseHeader() {
  // JIT code is never in a file, nor is it required to have any header
  return false;
}

ByteOrder ObjectFileJIT::GetByteOrder() const { return m_data.GetByteOrder(); }

bool ObjectFileJIT::IsExecutable() const { return false; }

uint32_t ObjectFileJIT::GetAddressByteSize() const {
  return m_data.GetAddressByteSize();
}

Symtab *ObjectFileJIT::GetSymtab() {
  ModuleSP module_sp(GetModule());
  if (module_sp) {
    std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
    if (m_symtab_ap.get() == NULL) {
      m_symtab_ap.reset(new Symtab(this));
      std::lock_guard<std::recursive_mutex> symtab_guard(
          m_symtab_ap->GetMutex());
      ObjectFileJITDelegateSP delegate_sp(m_delegate_wp.lock());
      if (delegate_sp)
        delegate_sp->PopulateSymtab(this, *m_symtab_ap);
      // TODO: get symbols from delegate
      m_symtab_ap->Finalize();
    }
  }
  return m_symtab_ap.get();
}

bool ObjectFileJIT::IsStripped() {
  return false; // JIT code that is in a module is never stripped
}

void ObjectFileJIT::CreateSections(SectionList &unified_section_list) {
  if (!m_sections_ap.get()) {
    m_sections_ap.reset(new SectionList());
    ObjectFileJITDelegateSP delegate_sp(m_delegate_wp.lock());
    if (delegate_sp) {
      delegate_sp->PopulateSectionList(this, *m_sections_ap);
      unified_section_list = *m_sections_ap;
    }
  }
}

void ObjectFileJIT::Dump(Stream *s) {
  ModuleSP module_sp(GetModule());
  if (module_sp) {
    std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
    s->Printf("%p: ", static_cast<void *>(this));
    s->Indent();
    s->PutCString("ObjectFileJIT");

    ArchSpec arch;
    if (GetArchitecture(arch))
      *s << ", arch = " << arch.GetArchitectureName();

    s->EOL();

    SectionList *sections = GetSectionList();
    if (sections)
      sections->Dump(s, NULL, true, UINT32_MAX);

    if (m_symtab_ap.get())
      m_symtab_ap->Dump(s, NULL, eSortOrderNone);
  }
}

bool ObjectFileJIT::GetUUID(lldb_private::UUID *uuid) {
  // TODO: maybe get from delegate, not needed for first pass
  return false;
}

uint32_t ObjectFileJIT::GetDependentModules(FileSpecList &files) {
  // JIT modules don't have dependencies, but they could
  // if external functions are called and we know where they are
  files.Clear();
  return 0;
}

lldb_private::Address ObjectFileJIT::GetEntryPointAddress() {
  return Address();
}

lldb_private::Address ObjectFileJIT::GetHeaderAddress() { return Address(); }

ObjectFile::Type ObjectFileJIT::CalculateType() { return eTypeJIT; }

ObjectFile::Strata ObjectFileJIT::CalculateStrata() { return eStrataJIT; }

bool ObjectFileJIT::GetArchitecture(ArchSpec &arch) {
  ObjectFileJITDelegateSP delegate_sp(m_delegate_wp.lock());
  if (delegate_sp)
    return delegate_sp->GetArchitecture(arch);
  return false;
}

//------------------------------------------------------------------
// PluginInterface protocol
//------------------------------------------------------------------
lldb_private::ConstString ObjectFileJIT::GetPluginName() {
  return GetPluginNameStatic();
}

uint32_t ObjectFileJIT::GetPluginVersion() { return 1; }

bool ObjectFileJIT::SetLoadAddress(Target &target, lldb::addr_t value,
                                   bool value_is_offset) {
  size_t num_loaded_sections = 0;
  SectionList *section_list = GetSectionList();
  if (section_list) {
    const size_t num_sections = section_list->GetSize();
    // "value" is an offset to apply to each top level segment
    for (size_t sect_idx = 0; sect_idx < num_sections; ++sect_idx) {
      // Iterate through the object file sections to find all
      // of the sections that size on disk (to avoid __PAGEZERO)
      // and load them
      SectionSP section_sp(section_list->GetSectionAtIndex(sect_idx));
      if (section_sp && section_sp->GetFileSize() > 0 &&
          section_sp->IsThreadSpecific() == false) {
        if (target.GetSectionLoadList().SetSectionLoadAddress(
                section_sp, section_sp->GetFileAddress() + value))
          ++num_loaded_sections;
      }
    }
  }
  return num_loaded_sections > 0;
}

size_t ObjectFileJIT::ReadSectionData(const lldb_private::Section *section,
                                      lldb::offset_t section_offset, void *dst,
                                      size_t dst_len) const {
  lldb::offset_t file_size = section->GetFileSize();
  if (section_offset < file_size) {
    size_t src_len = file_size - section_offset;
    if (src_len > dst_len)
      src_len = dst_len;
    const uint8_t *src =
        ((uint8_t *)(uintptr_t)section->GetFileOffset()) + section_offset;

    memcpy(dst, src, src_len);
    return src_len;
  }
  return 0;
}

size_t ObjectFileJIT::ReadSectionData(
    const lldb_private::Section *section,
    lldb_private::DataExtractor &section_data) const {
  if (section->GetFileSize()) {
    const void *src = (void *)(uintptr_t)section->GetFileOffset();

    DataBufferSP data_sp(
        new lldb_private::DataBufferHeap(src, section->GetFileSize()));
    if (data_sp) {
      section_data.SetData(data_sp, 0, data_sp->GetByteSize());
      section_data.SetByteOrder(GetByteOrder());
      section_data.SetAddressByteSize(GetAddressByteSize());
      return section_data.GetByteSize();
    }
  }
  section_data.Clear();
  return 0;
}
