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