1 //===--- Function.h - Bytecode function for the VM --------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
12 #include "clang/AST/Decl.h"
13 #include "clang/AST/DeclCXX.h"
14 #include "clang/Basic/Builtins.h"
16 using namespace clang
;
17 using namespace clang::interp
;
19 Function::Function(Program
&P
, const FunctionDecl
*F
, unsigned ArgSize
,
20 llvm::SmallVectorImpl
<PrimType
> &&ParamTypes
,
21 llvm::DenseMap
<unsigned, ParamDescriptor
> &&Params
,
22 llvm::SmallVectorImpl
<unsigned> &&ParamOffsets
,
23 bool HasThisPointer
, bool HasRVO
)
24 : P(P
), Loc(F
->getBeginLoc()), F(F
), ArgSize(ArgSize
),
25 ParamTypes(std::move(ParamTypes
)), Params(std::move(Params
)),
26 ParamOffsets(std::move(ParamOffsets
)), HasThisPointer(HasThisPointer
),
27 HasRVO(HasRVO
), Variadic(F
->isVariadic()) {}
29 Function::ParamDescriptor
Function::getParamDescriptor(unsigned Offset
) const {
30 auto It
= Params
.find(Offset
);
31 assert(It
!= Params
.end() && "Invalid parameter offset");
35 SourceInfo
Function::getSource(CodePtr PC
) const {
36 assert(PC
>= getCodeBegin() && "PC does not belong to this function");
37 assert(PC
<= getCodeEnd() && "PC Does not belong to this function");
38 assert(hasBody() && "Function has no body");
39 unsigned Offset
= PC
- getCodeBegin();
40 using Elem
= std::pair
<unsigned, SourceInfo
>;
41 auto It
= llvm::lower_bound(SrcMap
, Elem
{Offset
, {}}, llvm::less_first());
42 assert(It
!= SrcMap
.end());
46 bool Function::isVirtual() const {
47 if (const auto *M
= dyn_cast
<CXXMethodDecl
>(F
))
48 return M
->isVirtual();
52 bool Function::needsRuntimeArgPop(const ASTContext
&Ctx
) const {
55 return Ctx
.BuiltinInfo
.hasCustomTypechecking(getBuiltinID());