//===- Writer.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 "Writer.h"
#include "llvm/BinaryFormat/Wasm.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/LEB128.h"
#include "llvm/Support/raw_ostream.h"

namespace llvm {
namespace objcopy {
namespace wasm {

using namespace object;
using namespace llvm::wasm;

Writer::SectionHeader Writer::createSectionHeader(const Section &S,
                                                  size_t &SectionSize) {
  SectionHeader Header;
  raw_svector_ostream OS(Header);
  OS << S.SectionType;
  bool HasName = S.SectionType == WASM_SEC_CUSTOM;
  SectionSize = S.Contents.size();
  if (HasName)
    SectionSize += getULEB128Size(S.Name.size()) + S.Name.size();
  // Pad the LEB value out to 5 bytes to make it a predictable size, and
  // match the behavior of clang.
  encodeULEB128(SectionSize, OS, 5);
  if (HasName) {
    encodeULEB128(S.Name.size(), OS);
    OS << S.Name;
  }
  // Total section size is the content size plus 1 for the section type and
  // 5 for the LEB-encoded size.
  SectionSize = SectionSize + 1 + 5;
  return Header;
}

size_t Writer::finalize() {
  size_t ObjectSize = sizeof(WasmMagic) + sizeof(WasmVersion);
  SectionHeaders.reserve(Obj.Sections.size());
  // Finalize the headers of each section so we know the total size.
  for (const Section &S : Obj.Sections) {
    size_t SectionSize;
    SectionHeaders.push_back(createSectionHeader(S, SectionSize));
    ObjectSize += SectionSize;
  }
  return ObjectSize;
}

Error Writer::write() {
  size_t TotalSize = finalize();
  Out.reserveExtraSpace(TotalSize);

  // Write the header.
  Out.write(Obj.Header.Magic.data(), Obj.Header.Magic.size());
  uint32_t Version;
  support::endian::write32le(&Version, Obj.Header.Version);
  Out.write(reinterpret_cast<const char *>(&Version), sizeof(Version));

  // Write each section.
  for (size_t I = 0, S = SectionHeaders.size(); I < S; ++I) {
    Out.write(SectionHeaders[I].data(), SectionHeaders[I].size());
    Out.write(reinterpret_cast<const char *>(Obj.Sections[I].Contents.data()),
              Obj.Sections[I].Contents.size());
  }

  return Error::success();
}

} // end namespace wasm
} // end namespace objcopy
} // end namespace llvm
