Files
TheRock/rocm-systems/projects/rocprofiler-systems/external/dyninst/dyninstAPI/h/BPatch_point.h
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

289 lines
8.9 KiB
C++

/*
* See the dyninst/COPYRIGHT file for copyright information.
*
* We provide the Paradyn Tools (below described as "Paradyn")
* on an AS IS basis, and do not warrant its validity or performance.
* We reserve the right to update, modify, or discontinue this
* software at any time. We shall have no obligation to supply such
* updates or modifications or any other form of support to you.
*
* By your use of Paradyn, you understand and agree that we (or any
* other person or entity with proprietary rights in Paradyn) are
* under no obligation to provide either maintenance services,
* update services, notices of latent defects, or correction of
* defects for Paradyn.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _BPatch_point_h_
#define _BPatch_point_h_
#include <string>
#include <vector>
#include "BPatch_dll.h"
#include "BPatch_Vector.h"
#include "BPatch_Set.h"
#include "BPatch_enums.h"
#include "dyntypes.h"
class instPoint;
class BPatch_thread;
class BPatch_image;
class BPatch_function;
class BPatch_memoryAccess;
class BPatchSnippetHandle;
class BPatch_basicBlock;
class BPatch_basicBlockLoop;
class BPatch_point;
class BPatch_process;
class BPatch_frame;
class BPatch_edge;
class BPatch_snippet;
class BPatch_addressSpace;
class AddressSpace;
class BPatch_register;
#include "Instruction.h"
namespace Dyninst {
namespace PatchAPI {
class Instance;
class Point;
typedef dyncompat::shared_ptr<Instance> InstancePtr;
BPATCH_DLL_EXPORT Point *convert(const BPatch_point *, BPatch_callWhen);
}
}
/*
* Provide these definitions for backwards compatability.
*
*/
#define BPatch_entry BPatch_locEntry
#define BPatch_exit BPatch_locExit
#define BPatch_subroutine BPatch_locSubroutine
#define BPatch_longJump BPatch_locLongJump
#define BPatch_allLocations BPatch_locAllLocations
/* #define BPatch_instruction BPatch_locInstruction */
#define BPatch_arbitrary BPatch_locInstruction
/* VG(09/17/01) Added memory access pointer */
/* VG(11/06/01) Moved constructor to implementation file because it
needs to link instPoint back pointer (and we don't want to include
that here) */
class BPATCH_DLL_EXPORT BPatch_point {
friend class BPatch_process;
friend class BPatch_binaryEdit;
friend class BPatch_addressSpace;
friend class BPatch_image;
friend class BPatch_function;
friend class BPatch_basicBlock;
friend class BPatch_basicBlockLoop;
friend class BPatch_flowGraph; // Access to setLoop
friend class BPatch_asyncEventHandler;
friend class BPatch_edge;
friend class BPatch_snippet;
friend Dyninst::PatchAPI::Point *Dyninst::PatchAPI::convert(const BPatch_point *, BPatch_callWhen);
private:
BPatch_addressSpace *addSpace;
AddressSpace *lladdSpace;
BPatch_function *func;
BPatch_basicBlockLoop *loop;
// We have a disconnect between how BPatch represents a point
// (e.g., an instruction) and how the internals represent a point
// (e.g., pre-instruction). We handle this here with a secondary
// instPoint that is defined to be the "after" equivalent.
instPoint *point;
instPoint *secondaryPoint;
BPatch_procedureLocation pointType;
BPatch_memoryAccess *memacc;
// Instruction constructor...
BPatch_point(BPatch_addressSpace *_addSpace, BPatch_function *_func,
instPoint *_point, instPoint *_secondary,
BPatch_procedureLocation _pointType,
AddressSpace *as);
// Edge constructor...
BPatch_point(BPatch_addressSpace *_addSpace, BPatch_function *_func,
BPatch_edge *_edge, instPoint *_point, AddressSpace *as);
void setLoop(BPatch_basicBlockLoop *l);
// We often create a point with the arbitrary point type,
// and later need to override it to a specific type (e.g., loop entry)
void overrideType(BPatch_procedureLocation loc) { pointType = loc; }
// a snippet used in monitoring of dynamic calls
// maybe we want BPatchSnippetHandle here
Dyninst::PatchAPI::InstancePtr dynamic_point_monitor_func;
instPoint *getPoint() const {return point;}
instPoint *getPoint(BPatch_callWhen when) const;
// If we're edge inst
BPatch_edge *edge_;
void recordSnippet(BPatch_callWhen, BPatch_snippetOrder,
BPatchSnippetHandle*);
bool removeSnippet(BPatchSnippetHandle* handle);
void attachMemAcc(BPatch_memoryAccess *memacc);
AddressSpace *getAS();
private:
BPatch_Vector<BPatchSnippetHandle *> preSnippets;
BPatch_Vector<BPatchSnippetHandle *> postSnippets;
BPatch_Vector<BPatchSnippetHandle *> allSnippets;
public:
//~BPatch_point() { delete memacc; };
// Internal functions, DO NOT USE.
// Hack to get edge information. DO NOT USE.
BPatch_edge *edge() const { return edge_; }
bool isReturnInstruction();
static BPatch_procedureLocation convertInstPointType_t(int intType);
instPoint *llpoint() { return point; }
Dyninst::Address getCallFallThroughAddr();
bool patchPostCallArea();
// End internal functions
//Added for DynC...
BPatch_addressSpace * getAddressSpace();
// Get the loop ID
BPatch_basicBlockLoop * getLoop();
// BPatch_point::getPointType
//
BPatch_procedureLocation getPointType();
// BPatch_point::getFunction
// Returns function to which this point belongs
BPatch_function * getFunction();
// BPatch_point::getCalledFunction
// Returns a BPatch_function representing the function being called at this point.
// If this point is not a call site, returns NULL.
BPatch_function * getCalledFunction();
std::string getCalledFunctionName();
// BPatch_point::getBlock
// Returns block to which this point belongs if such a block exists
// For example, function entry points do not have blocks associated with them.
BPatch_basicBlock * getBlock();
// BPatch_point::getAddress
// Returns the address of this point in the mutatee
void * getAddress();
// BPatch_point::getMemoryAccess
//
const BPatch_memoryAccess * getMemoryAccess();
Dyninst::InstructionAPI::Instruction getInsnAtPoint();
// BPatch_point::getCurrentSnippets
//
// to get all current snippets at this point
const BPatch_Vector<BPatchSnippetHandle *> getCurrentSnippets();
// BPatch_point::getCurrentSnippets
//
// to get all current snippets as defined by when at this point
const BPatch_Vector<BPatchSnippetHandle *> getCurrentSnippets(BPatch_callWhen when);
// BPatch_point::getLiveRegisters
//
// Get Live registers at this point
bool getLiveRegisters(std::vector<BPatch_register> &liveRegs);
// BPatch_point::isDynamic
//
// isDynamic() returns true if this is a dynamic call site
// (eg a call site where a func call is made via func ptr)
bool isDynamic();
// BPatch_point::monitorCalls
//
// monitorCalls(BPatch_function *cbFuncInUserLibrary)
// Applies only to dynamic call sites (returns false if this BPatch_point
// is not a dynamic call site). Inserts a call to the user-written function
// cbFuncInUserLibrary(), which must exist in a user defined library,
// at this call site. cbFuncInUserLibrary must adhere to the prototype:
// void cbFuncInUserLibrary(void *callee_address, void *callSite_address).
//
// Returns handle on success, NULL on failure
void * monitorCalls(BPatch_function *f = NULL);
// BPatch_point::stopMonitoring
// If this point as a dynamic call site, was being monitored, turns off monitoring
// <handle> is the handle returned my monitorCalls()
bool stopMonitoring();
// BPatch_point::getDisplacedInstructions
// Returns the instructions to be relocated when instrumentation is inserted
// at this point. Returns the number of bytes taken up by these instructions.
int getDisplacedInstructions(int maxSize, void *insns);
// BPatch_point::usesTrap_NP
// Returns true if this point is or would be instrumented with a trap, rather
// than a jump to the base tramp, false otherwise. On platforms that do not
// use traps (everything other than x86), it always returns false;
bool usesTrap_NP();
};
#endif /* _BPatch_point_h_ */