//===--- Function.h - Bytecode function for the VM --------------*- 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 "Function.h"
#include "Program.h"
#include "clang/AST/ASTLambda.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclCXX.h"

using namespace clang;
using namespace clang::interp;

Function::Function(FunctionDeclTy Source, unsigned ArgSize,
                   llvm::SmallVectorImpl<ParamDescriptor> &&ParamDescriptors,
                   bool HasThisPointer, bool HasRVO, bool IsLambdaStaticInvoker)
    : Source(Source), ParamDescriptors(std::move(ParamDescriptors)),
      ArgSize(ArgSize), Kind(FunctionKind::Normal), IsValid(false),
      IsFullyCompiled(false), HasThisPointer(HasThisPointer), HasRVO(HasRVO),
      HasBody(false), Defined(false) {

  if (const auto *F = dyn_cast<const FunctionDecl *>(Source)) {
    Variadic = F->isVariadic();
    Immediate = F->isImmediateFunction();
    Constexpr = F->isConstexpr();
    if (const auto *CD = dyn_cast<CXXConstructorDecl>(F)) {
      Virtual = CD->isVirtual();
      ExplicitThisPointer = CD->isExplicitObjectMemberFunction();
      Kind = CD->isCopyOrMoveConstructor() ? FunctionKind::CopyOrMoveCtor
                                           : FunctionKind::Ctor;
    } else if (const auto *CD = dyn_cast<CXXDestructorDecl>(F)) {
      ExplicitThisPointer = CD->isExplicitObjectMemberFunction();
      Virtual = CD->isVirtual();
      Kind = FunctionKind::Dtor;
    } else if (const auto *MD = dyn_cast<CXXMethodDecl>(F)) {
      ExplicitThisPointer = MD->isExplicitObjectMemberFunction();
      Virtual = MD->isVirtual();
      if (IsLambdaStaticInvoker) {
        Kind = FunctionKind::LambdaStaticInvoker;
        Constexpr = true;
      } else if (clang::isLambdaCallOperator(F))
        Kind = FunctionKind::LambdaCallOperator;
      else if (MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())
        Kind = FunctionKind::CopyOrMoveOperator;
    } else {
      ExplicitThisPointer = false;
      Virtual = false;
    }
  } else {
    ExplicitThisPointer = false;
    Variadic = false;
    Virtual = false;
    Immediate = false;
    Constexpr = false;
  }
}

SourceInfo Function::getSource(CodePtr PC) const {
  assert(PC >= getCodeBegin() && "PC does not belong to this function");
  assert(PC <= getCodeEnd() && "PC Does not belong to this function");
  assert(hasBody() && "Function has no body");
  unsigned Offset = PC - getCodeBegin();
  return SrcMap.findSourceForOffset(Offset);
}
