//===- AbstractCallSite.h - Abstract call sites -----------------*- 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 // //===----------------------------------------------------------------------===// // // This file defines the AbstractCallSite class, which is a is a wrapper that // allows treating direct, indirect, and callback calls the same. // //===----------------------------------------------------------------------===// #ifndef LLVM_IR_ABSTRACTCALLSITE_H #define LLVM_IR_ABSTRACTCALLSITE_H #include "llvm/IR/Constants.h" #include "llvm/IR/Function.h" #include "llvm/IR/InstrTypes.h" #include "llvm/IR/Value.h" #include <cassert> namespace llvm { class Argument; class Use; /// AbstractCallSite /// /// An abstract call site is a wrapper that allows to treat direct, /// indirect, and callback calls the same. If an abstract call site /// represents a direct or indirect call site it behaves like a stripped /// down version of a normal call site object. The abstract call site can /// also represent a callback call, thus the fact that the initially /// called function (=broker) may invoke a third one (=callback callee). /// In this case, the abstract call site hides the middle man, hence the /// broker function. The result is a representation of the callback call, /// inside the broker, but in the context of the original call to the broker. /// /// There are up to three functions involved when we talk about callback call /// sites. The caller (1), which invokes the broker function. The broker /// function (2), that will invoke the callee zero or more times. And finally /// the callee (3), which is the target of the callback call. /// /// The abstract call site will handle the mapping from parameters to arguments /// depending on the semantic of the broker function. However, it is important /// to note that the mapping is often partial. Thus, some arguments of the /// call/invoke instruction are mapped to parameters of the callee while others /// are not. class AbstractCallSite { … }; /// Apply function Func to each CB's callback call site. template <typename UnaryFunction> void forEachCallbackCallSite(const CallBase &CB, UnaryFunction Func) { … } /// Apply function Func to each CB's callback function. template <typename UnaryFunction> void forEachCallbackFunction(const CallBase &CB, UnaryFunction Func) { … } } // end namespace llvm #endif // LLVM_IR_ABSTRACTCALLSITE_H