xref: /llvm-project/clang/lib/AST/ByteCode/FunctionPointer.cpp (revision db94852b9b4ca1008ef2889175fe3af51f26a5b0)
1 //===----------------------- FunctionPointer.cpp ----------------*- C++ -*-===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "FunctionPointer.h"
10 
11 namespace clang {
12 namespace interp {
13 
14 APValue FunctionPointer::toAPValue(const ASTContext &) const {
15   if (!Func)
16     return APValue(static_cast<Expr *>(nullptr), CharUnits::Zero(), {},
17                    /*OnePastTheEnd=*/false, /*IsNull=*/true);
18 
19   if (!Valid)
20     return APValue(static_cast<Expr *>(nullptr),
21                    CharUnits::fromQuantity(getIntegerRepresentation()), {},
22                    /*OnePastTheEnd=*/false, /*IsNull=*/false);
23 
24   if (Func->getDecl())
25     return APValue(Func->getDecl(), CharUnits::fromQuantity(Offset), {},
26                    /*OnePastTheEnd=*/false, /*IsNull=*/false);
27   return APValue(Func->getExpr(), CharUnits::fromQuantity(Offset), {},
28                  /*OnePastTheEnd=*/false, /*IsNull=*/false);
29 }
30 
31 void FunctionPointer::print(llvm::raw_ostream &OS) const {
32   OS << "FnPtr(";
33   if (Func && Valid)
34     OS << Func->getName();
35   else if (Func)
36     OS << reinterpret_cast<uintptr_t>(Func);
37   else
38     OS << "nullptr";
39   OS << ") + " << Offset;
40 }
41 
42 } // namespace interp
43 } // namespace clang
44