xref: /llvm-project/clang/lib/AST/ByteCode/FunctionPointer.cpp (revision db94852b9b4ca1008ef2889175fe3af51f26a5b0)
1*db94852bSTimm Baeder //===----------------------- FunctionPointer.cpp ----------------*- C++ -*-===//
2*db94852bSTimm Baeder //
3*db94852bSTimm Baeder // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*db94852bSTimm Baeder // See https://llvm.org/LICENSE.txt for license information.
5*db94852bSTimm Baeder // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*db94852bSTimm Baeder //
7*db94852bSTimm Baeder //===----------------------------------------------------------------------===//
8*db94852bSTimm Baeder 
9*db94852bSTimm Baeder #include "FunctionPointer.h"
10*db94852bSTimm Baeder 
11*db94852bSTimm Baeder namespace clang {
12*db94852bSTimm Baeder namespace interp {
13*db94852bSTimm Baeder 
14*db94852bSTimm Baeder APValue FunctionPointer::toAPValue(const ASTContext &) const {
15*db94852bSTimm Baeder   if (!Func)
16*db94852bSTimm Baeder     return APValue(static_cast<Expr *>(nullptr), CharUnits::Zero(), {},
17*db94852bSTimm Baeder                    /*OnePastTheEnd=*/false, /*IsNull=*/true);
18*db94852bSTimm Baeder 
19*db94852bSTimm Baeder   if (!Valid)
20*db94852bSTimm Baeder     return APValue(static_cast<Expr *>(nullptr),
21*db94852bSTimm Baeder                    CharUnits::fromQuantity(getIntegerRepresentation()), {},
22*db94852bSTimm Baeder                    /*OnePastTheEnd=*/false, /*IsNull=*/false);
23*db94852bSTimm Baeder 
24*db94852bSTimm Baeder   if (Func->getDecl())
25*db94852bSTimm Baeder     return APValue(Func->getDecl(), CharUnits::fromQuantity(Offset), {},
26*db94852bSTimm Baeder                    /*OnePastTheEnd=*/false, /*IsNull=*/false);
27*db94852bSTimm Baeder   return APValue(Func->getExpr(), CharUnits::fromQuantity(Offset), {},
28*db94852bSTimm Baeder                  /*OnePastTheEnd=*/false, /*IsNull=*/false);
29*db94852bSTimm Baeder }
30*db94852bSTimm Baeder 
31*db94852bSTimm Baeder void FunctionPointer::print(llvm::raw_ostream &OS) const {
32*db94852bSTimm Baeder   OS << "FnPtr(";
33*db94852bSTimm Baeder   if (Func && Valid)
34*db94852bSTimm Baeder     OS << Func->getName();
35*db94852bSTimm Baeder   else if (Func)
36*db94852bSTimm Baeder     OS << reinterpret_cast<uintptr_t>(Func);
37*db94852bSTimm Baeder   else
38*db94852bSTimm Baeder     OS << "nullptr";
39*db94852bSTimm Baeder   OS << ") + " << Offset;
40*db94852bSTimm Baeder }
41*db94852bSTimm Baeder 
42*db94852bSTimm Baeder } // namespace interp
43*db94852bSTimm Baeder } // namespace clang
44