//===- SymbolRecordMapping.cpp -----------------------------------*- C++-*-===//
//
// 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 "llvm/DebugInfo/CodeView/SymbolRecordMapping.h"

using namespace llvm;
using namespace llvm::codeview;

#define error(X)                                                               \
  if (auto EC = X)                                                             \
    return EC;

namespace {
struct MapGap {
  Error operator()(CodeViewRecordIO &IO, LocalVariableAddrGap &Gap) const {
    error(IO.mapInteger(Gap.GapStartOffset));
    error(IO.mapInteger(Gap.Range));
    return Error::success();
  }
};
}

static Error mapLocalVariableAddrRange(CodeViewRecordIO &IO,
                                       LocalVariableAddrRange &Range) {
  error(IO.mapInteger(Range.OffsetStart));
  error(IO.mapInteger(Range.ISectStart));
  error(IO.mapInteger(Range.Range));
  return Error::success();
}

Error SymbolRecordMapping::visitSymbolBegin(CVSymbol &Record) {
  error(IO.beginRecord(MaxRecordLength - sizeof(RecordPrefix)));
  return Error::success();
}

Error SymbolRecordMapping::visitSymbolEnd(CVSymbol &Record) {
  error(IO.padToAlignment(alignOf(Container)));
  error(IO.endRecord());
  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {

  error(IO.mapInteger(Block.Parent));
  error(IO.mapInteger(Block.End));
  error(IO.mapInteger(Block.CodeSize));
  error(IO.mapInteger(Block.CodeOffset));
  error(IO.mapInteger(Block.Segment));
  error(IO.mapStringZ(Block.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {

  error(IO.mapInteger(Thunk.Parent));
  error(IO.mapInteger(Thunk.End));
  error(IO.mapInteger(Thunk.Next));
  error(IO.mapInteger(Thunk.Offset));
  error(IO.mapInteger(Thunk.Segment));
  error(IO.mapInteger(Thunk.Length));
  error(IO.mapEnum(Thunk.Thunk));
  error(IO.mapStringZ(Thunk.Name));
  error(IO.mapByteVectorTail(Thunk.VariantData));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            TrampolineSym &Tramp) {

  error(IO.mapEnum(Tramp.Type));
  error(IO.mapInteger(Tramp.Size));
  error(IO.mapInteger(Tramp.ThunkOffset));
  error(IO.mapInteger(Tramp.TargetOffset));
  error(IO.mapInteger(Tramp.ThunkSection));
  error(IO.mapInteger(Tramp.TargetSection));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            SectionSym &Section) {
  uint8_t Padding = 0;

  error(IO.mapInteger(Section.SectionNumber));
  error(IO.mapInteger(Section.Alignment));
  error(IO.mapInteger(Padding));
  error(IO.mapInteger(Section.Rva));
  error(IO.mapInteger(Section.Length));
  error(IO.mapInteger(Section.Characteristics));
  error(IO.mapStringZ(Section.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            CoffGroupSym &CoffGroup) {

  error(IO.mapInteger(CoffGroup.Size));
  error(IO.mapInteger(CoffGroup.Characteristics));
  error(IO.mapInteger(CoffGroup.Offset));
  error(IO.mapInteger(CoffGroup.Segment));
  error(IO.mapStringZ(CoffGroup.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            BPRelativeSym &BPRel) {

  error(IO.mapInteger(BPRel.Offset));
  error(IO.mapInteger(BPRel.Type));
  error(IO.mapStringZ(BPRel.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            BuildInfoSym &BuildInfo) {

  error(IO.mapInteger(BuildInfo.BuildId));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            CallSiteInfoSym &CallSiteInfo) {
  uint16_t Padding = 0;

  error(IO.mapInteger(CallSiteInfo.CodeOffset));
  error(IO.mapInteger(CallSiteInfo.Segment));
  error(IO.mapInteger(Padding));
  error(IO.mapInteger(CallSiteInfo.Type));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            EnvBlockSym &EnvBlock) {

  uint8_t Reserved = 0;
  error(IO.mapInteger(Reserved));
  error(IO.mapStringZVectorZ(EnvBlock.Fields));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            FileStaticSym &FileStatic) {

  error(IO.mapInteger(FileStatic.Index));
  error(IO.mapInteger(FileStatic.ModFilenameOffset));
  error(IO.mapEnum(FileStatic.Flags));
  error(IO.mapStringZ(FileStatic.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) {

  error(IO.mapInteger(Export.Ordinal));
  error(IO.mapEnum(Export.Flags));
  error(IO.mapStringZ(Export.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            Compile2Sym &Compile2) {

  error(IO.mapEnum(Compile2.Flags));
  error(IO.mapEnum(Compile2.Machine));
  error(IO.mapInteger(Compile2.VersionFrontendMajor));
  error(IO.mapInteger(Compile2.VersionFrontendMinor));
  error(IO.mapInteger(Compile2.VersionFrontendBuild));
  error(IO.mapInteger(Compile2.VersionBackendMajor));
  error(IO.mapInteger(Compile2.VersionBackendMinor));
  error(IO.mapInteger(Compile2.VersionBackendBuild));
  error(IO.mapStringZ(Compile2.Version));
  error(IO.mapStringZVectorZ(Compile2.ExtraStrings));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            Compile3Sym &Compile3) {

  error(IO.mapEnum(Compile3.Flags));
  error(IO.mapEnum(Compile3.Machine));
  error(IO.mapInteger(Compile3.VersionFrontendMajor));
  error(IO.mapInteger(Compile3.VersionFrontendMinor));
  error(IO.mapInteger(Compile3.VersionFrontendBuild));
  error(IO.mapInteger(Compile3.VersionFrontendQFE));
  error(IO.mapInteger(Compile3.VersionBackendMajor));
  error(IO.mapInteger(Compile3.VersionBackendMinor));
  error(IO.mapInteger(Compile3.VersionBackendBuild));
  error(IO.mapInteger(Compile3.VersionBackendQFE));
  error(IO.mapStringZ(Compile3.Version));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            ConstantSym &Constant) {

  error(IO.mapInteger(Constant.Type));
  error(IO.mapEncodedInteger(Constant.Value));
  error(IO.mapStringZ(Constant.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {

  error(IO.mapInteger(Data.Type));
  error(IO.mapInteger(Data.DataOffset));
  error(IO.mapInteger(Data.Segment));
  error(IO.mapStringZ(Data.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(
    CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {

  error(IO.mapObject(DefRangeFramePointerRel.Hdr.Offset));
  error(mapLocalVariableAddrRange(IO, DefRangeFramePointerRel.Range));
  error(IO.mapVectorTail(DefRangeFramePointerRel.Gaps, MapGap()));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(
    CVSymbol &CVR,
    DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {

  error(IO.mapInteger(DefRangeFramePointerRelFullScope.Offset));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(
    CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) {

  error(IO.mapObject(DefRangeRegisterRel.Hdr.Register));
  error(IO.mapObject(DefRangeRegisterRel.Hdr.Flags));
  error(IO.mapObject(DefRangeRegisterRel.Hdr.BasePointerOffset));
  error(mapLocalVariableAddrRange(IO, DefRangeRegisterRel.Range));
  error(IO.mapVectorTail(DefRangeRegisterRel.Gaps, MapGap()));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(
    CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {

  error(IO.mapObject(DefRangeRegister.Hdr.Register));
  error(IO.mapObject(DefRangeRegister.Hdr.MayHaveNoName));
  error(mapLocalVariableAddrRange(IO, DefRangeRegister.Range));
  error(IO.mapVectorTail(DefRangeRegister.Gaps, MapGap()));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(
    CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {

  error(IO.mapObject(DefRangeSubfieldRegister.Hdr.Register));
  error(IO.mapObject(DefRangeSubfieldRegister.Hdr.MayHaveNoName));
  error(IO.mapObject(DefRangeSubfieldRegister.Hdr.OffsetInParent));
  error(mapLocalVariableAddrRange(IO, DefRangeSubfieldRegister.Range));
  error(IO.mapVectorTail(DefRangeSubfieldRegister.Gaps, MapGap()));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(
    CVSymbol &CVR, DefRangeSubfieldSym &DefRangeSubfield) {

  error(IO.mapInteger(DefRangeSubfield.Program));
  error(IO.mapInteger(DefRangeSubfield.OffsetInParent));
  error(mapLocalVariableAddrRange(IO, DefRangeSubfield.Range));
  error(IO.mapVectorTail(DefRangeSubfield.Gaps, MapGap()));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            DefRangeSym &DefRange) {

  error(IO.mapInteger(DefRange.Program));
  error(mapLocalVariableAddrRange(IO, DefRange.Range));
  error(IO.mapVectorTail(DefRange.Gaps, MapGap()));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            FrameCookieSym &FrameCookie) {

  error(IO.mapInteger(FrameCookie.CodeOffset));
  error(IO.mapInteger(FrameCookie.Register));
  error(IO.mapEnum(FrameCookie.CookieKind));
  error(IO.mapInteger(FrameCookie.Flags));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            FrameProcSym &FrameProc) {
  error(IO.mapInteger(FrameProc.TotalFrameBytes));
  error(IO.mapInteger(FrameProc.PaddingFrameBytes));
  error(IO.mapInteger(FrameProc.OffsetToPadding));
  error(IO.mapInteger(FrameProc.BytesOfCalleeSavedRegisters));
  error(IO.mapInteger(FrameProc.OffsetOfExceptionHandler));
  error(IO.mapInteger(FrameProc.SectionIdOfExceptionHandler));
  error(IO.mapEnum(FrameProc.Flags));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(
    CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) {

  error(IO.mapInteger(HeapAllocSite.CodeOffset));
  error(IO.mapInteger(HeapAllocSite.Segment));
  error(IO.mapInteger(HeapAllocSite.CallInstructionSize));
  error(IO.mapInteger(HeapAllocSite.Type));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            InlineSiteSym &InlineSite) {

  error(IO.mapInteger(InlineSite.Parent));
  error(IO.mapInteger(InlineSite.End));
  error(IO.mapInteger(InlineSite.Inlinee));
  error(IO.mapByteVectorTail(InlineSite.AnnotationData));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            RegisterSym &Register) {

  error(IO.mapInteger(Register.Index));
  error(IO.mapEnum(Register.Register));
  error(IO.mapStringZ(Register.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            PublicSym32 &Public) {

  error(IO.mapEnum(Public.Flags));
  error(IO.mapInteger(Public.Offset));
  error(IO.mapInteger(Public.Segment));
  error(IO.mapStringZ(Public.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            ProcRefSym &ProcRef) {

  error(IO.mapInteger(ProcRef.SumName));
  error(IO.mapInteger(ProcRef.SymOffset));
  error(IO.mapInteger(ProcRef.Module));
  error(IO.mapStringZ(ProcRef.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {

  error(IO.mapInteger(Label.CodeOffset));
  error(IO.mapInteger(Label.Segment));
  error(IO.mapEnum(Label.Flags));
  error(IO.mapStringZ(Label.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {
  error(IO.mapInteger(Local.Type));
  error(IO.mapEnum(Local.Flags));
  error(IO.mapStringZ(Local.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            ObjNameSym &ObjName) {

  error(IO.mapInteger(ObjName.Signature));
  error(IO.mapStringZ(ObjName.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {
  error(IO.mapInteger(Proc.Parent));
  error(IO.mapInteger(Proc.End));
  error(IO.mapInteger(Proc.Next));
  error(IO.mapInteger(Proc.CodeSize));
  error(IO.mapInteger(Proc.DbgStart));
  error(IO.mapInteger(Proc.DbgEnd));
  error(IO.mapInteger(Proc.FunctionType));
  error(IO.mapInteger(Proc.CodeOffset));
  error(IO.mapInteger(Proc.Segment));
  error(IO.mapEnum(Proc.Flags));
  error(IO.mapStringZ(Proc.Name));
  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            ScopeEndSym &ScopeEnd) {
  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {
  error(IO.mapVectorN<uint32_t>(
      Caller.Indices,
      [](CodeViewRecordIO &IO, TypeIndex &N) { return IO.mapInteger(N); }));
  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            RegRelativeSym &RegRel) {

  error(IO.mapInteger(RegRel.Offset));
  error(IO.mapInteger(RegRel.Type));
  error(IO.mapEnum(RegRel.Register));
  error(IO.mapStringZ(RegRel.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            ThreadLocalDataSym &Data) {

  error(IO.mapInteger(Data.Type));
  error(IO.mapInteger(Data.DataOffset));
  error(IO.mapInteger(Data.Segment));
  error(IO.mapStringZ(Data.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) {

  error(IO.mapInteger(UDT.Type));
  error(IO.mapStringZ(UDT.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            UsingNamespaceSym &UN) {

  error(IO.mapStringZ(UN.Name));

  return Error::success();
}

Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
                                            AnnotationSym &Annot) {

  error(IO.mapInteger(Annot.CodeOffset));
  error(IO.mapInteger(Annot.Segment));
  error(IO.mapVectorN<uint16_t>(
      Annot.Strings,
      [](CodeViewRecordIO &IO, StringRef &S) { return IO.mapStringZ(S); }));

  return Error::success();
}

RegisterId codeview::decodeFramePtrReg(EncodedFramePtrReg EncodedReg,
                                       CPUType CPU) {
  assert(unsigned(EncodedReg) < 4);
  switch (CPU) {
  // FIXME: Add ARM and AArch64 variants here.
  default:
    break;
  case CPUType::Intel8080:
  case CPUType::Intel8086:
  case CPUType::Intel80286:
  case CPUType::Intel80386:
  case CPUType::Intel80486:
  case CPUType::Pentium:
  case CPUType::PentiumPro:
  case CPUType::Pentium3:
    switch (EncodedReg) {
    case EncodedFramePtrReg::None:     return RegisterId::NONE;
    case EncodedFramePtrReg::StackPtr: return RegisterId::VFRAME;
    case EncodedFramePtrReg::FramePtr: return RegisterId::EBP;
    case EncodedFramePtrReg::BasePtr:  return RegisterId::EBX;
    }
    llvm_unreachable("bad encoding");
  case CPUType::X64:
    switch (EncodedReg) {
    case EncodedFramePtrReg::None:     return RegisterId::NONE;
    case EncodedFramePtrReg::StackPtr: return RegisterId::RSP;
    case EncodedFramePtrReg::FramePtr: return RegisterId::RBP;
    case EncodedFramePtrReg::BasePtr:  return RegisterId::R13;
    }
    llvm_unreachable("bad encoding");
  }
  return RegisterId::NONE;
}

EncodedFramePtrReg codeview::encodeFramePtrReg(RegisterId Reg, CPUType CPU) {
  switch (CPU) {
  // FIXME: Add ARM and AArch64 variants here.
  default:
    break;
  case CPUType::Intel8080:
  case CPUType::Intel8086:
  case CPUType::Intel80286:
  case CPUType::Intel80386:
  case CPUType::Intel80486:
  case CPUType::Pentium:
  case CPUType::PentiumPro:
  case CPUType::Pentium3:
    switch (Reg) {
    case RegisterId::VFRAME:
      return EncodedFramePtrReg::StackPtr;
    case RegisterId::EBP:
      return EncodedFramePtrReg::FramePtr;
    case RegisterId::EBX:
      return EncodedFramePtrReg::BasePtr;
    default:
      break;
    }
    break;
  case CPUType::X64:
    switch (Reg) {
    case RegisterId::RSP:
      return EncodedFramePtrReg::StackPtr;
    case RegisterId::RBP:
      return EncodedFramePtrReg::FramePtr;
    case RegisterId::R13:
      return EncodedFramePtrReg::BasePtr;
    default:
      break;
    }
    break;
  }
  return EncodedFramePtrReg::None;
}
