Files
TheRock/rocm-systems/projects/rocprofiler-systems/external/dyninst/dyninstAPI/h/BPatch_snippet.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

608 lines
19 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_snippet_h_
#define _BPatch_snippet_h_
#include <string>
#include "BPatch_dll.h"
#include "BPatch_Vector.h"
#include "BPatch_sourceObj.h"
#include "BPatch_type.h"
#include "BPatch_module.h"
//#include "BPatch_addressSpace.h"
//#include "BPatch_function.h"
#include "BPatch_callbacks.h"
#include "BPatch_instruction.h" // for register type
#include "BPatch_enums.h"
#include "dyncompat/shared_ptr.hpp"
class AstNode;
// Don't include the boost shared_ptr library
class BPatch_snippet;
typedef dyncompat::shared_ptr<AstNode> AstNodePtr;
namespace Dyninst {
namespace PatchAPI {
class Snippet;
typedef dyncompat::shared_ptr<Snippet> SnippetPtr;
BPATCH_DLL_EXPORT SnippetPtr convert(const BPatch_snippet *);
}
}
class AstNode;
class BPatch_process;
class BPatch_function;
class BPatch_point;
class BPatch_addressSpace;
class int_variable;
class mapped_object;
typedef enum {
BPatch_lt,
BPatch_eq,
BPatch_gt,
BPatch_le,
BPatch_ne,
BPatch_ge,
BPatch_and,
BPatch_or
} BPatch_relOp;
typedef enum {
BPatch_assign,
BPatch_plus,
BPatch_minus,
BPatch_divide,
BPatch_times,
BPatch_mod,
BPatch_ref,
BPatch_fieldref,
BPatch_seq,
BPatch_xor,
BPatch_bit_and, // not supported yet
BPatch_bit_or, // not supported yet
BPatch_bit_xor, // not supported yet
BPatch_left_shift, // not supported yet
BPatch_right_shift // not supported yet
} BPatch_binOp;
// for backwards compatability
#define BPatch_addr BPatch_address
typedef enum {
BPatch_negate,
BPatch_address,
BPatch_deref
} BPatch_unOp;
class BPATCH_DLL_EXPORT BPatch_snippet {
friend class BPatch_process;
friend class BPatch_binaryEdit;
friend class BPatch_addressSpace;
friend class BPatch_thread;
friend class BPatch_arithExpr;
friend class BPatch_boolExpr;
friend class BPatch_funcCallExpr;
friend class BPatch_variableExpr;
friend class BPatch_ifExpr;
friend class BPatch_ifMachineConditionExpr;
friend class BPatch_sequence;
friend class BPatch_insnExpr;
friend class BPatch_stopThreadExpr;
friend class BPatch_shadowExpr;
friend class BPatch_utilExpr;
friend AstNodePtr generateArrayRef(const BPatch_snippet &lOperand,
const BPatch_snippet &rOperand);
friend AstNodePtr generateFieldRef(const BPatch_snippet &lOperand,
const BPatch_snippet &rOperand);
friend AstNodePtr generateVariableBase(const BPatch_snippet &lOperand);
friend Dyninst::PatchAPI::SnippetPtr convert(const BPatch_snippet *snip);
public:
int PDSEP_astMinCost(); // This will go away too
// BPatch_snippet::BPatch_snippet
// Default constructor
BPatch_snippet();
BPatch_snippet(const AstNodePtr& ast);
// BPatch_snippet::BPatch_snippet
// Copy constructor
public: BPatch_snippet(const BPatch_snippet &src);
public:
//DynC internal use only
// BPatch_snippet::getType
// Returns the type of the underlying AST
BPatch_type * getType();
public:
// BPatch_snippet:operator=
// Assign one BPatch_snippet to another
BPatch_snippet & operator=(const BPatch_snippet &src);
// BPatch_snippet::~BPatch_snippet
// Destructor, decrements reference count to snippet, deleting when none are left
virtual ~BPatch_snippet();
// BPatch_snippet::is_trivial
// allows users to check to see if
// a snippet operation failed (leaving ast NULL)
bool is_trivial();
// BPatch_snippet::checkTypesAtPoint
// Type checking for inserting a particular
// snippet at a particular point
//
// Currently: check return exprs against the existence
// of return values
// Called at insertion time, but can be used to check in advance
bool checkTypesAtPoint(BPatch_point* p) const;
// protected:
//AstNodePtr *ast_wrapper;
AstNodePtr ast_wrapper;
};
class BPATCH_DLL_EXPORT BPatch_arithExpr: public BPatch_snippet {
public:
// BPatch_arithExpr::BPatch_arithExpr (Binary Arithmetic Operation)
//
BPatch_arithExpr(BPatch_binOp op,
const BPatch_snippet &lOperand,
const BPatch_snippet &rOperand);
// BPatch_arithExpr::BPatch_arithExpr (Unary Arithmetic Operation)
//
BPatch_arithExpr(BPatch_unOp op, const BPatch_snippet &lOperand);
};
class BPATCH_DLL_EXPORT BPatch_boolExpr : public BPatch_snippet {
public:
// BPatch_boolExpr::BPatch_boolExpr
// Creates a representation of boolean operation
BPatch_boolExpr(BPatch_relOp op, const BPatch_snippet &lOperand,
const BPatch_snippet &rOperand);
};
class BPATCH_DLL_EXPORT BPatch_constExpr : public BPatch_snippet {
public:
// BPatch_constExpr::BPatch_constExpr
// Creates a representation of a (signed int) value
BPatch_constExpr(signed int value);
// Creates a representation of an (unsigned int) value
BPatch_constExpr(unsigned int value);
// Creates a representation of a (signed long) value
BPatch_constExpr(signed long value);
// Creates a representation of an (unsigned long) value
BPatch_constExpr(unsigned long value);
// Creates a representation of an (unsigned long long) value
BPatch_constExpr(unsigned long long value);
// BPatch_constExpr::BPatch_constExpr
// Creates a representation of a (char *) value
BPatch_constExpr(const char *value);
// BPatch_constExpr::BPatch_constExpr
// Creates a representation of a (void *) value
BPatch_constExpr(const void *value);
// BPatch_constExpr::BPatch_constExpr
// Creates a representation of a (long long) value
BPatch_constExpr(long long value);
// Should _always_ have a default constructor. This
// one produces a 0
BPatch_constExpr() : BPatch_snippet() {}
};
class BPATCH_DLL_EXPORT BPatch_whileExpr : public BPatch_snippet {
public:
// BPatch_whileExpr::BPatch_whileExpr (while loop)
BPatch_whileExpr(const BPatch_snippet &condition,
const BPatch_snippet &body);
};
class BPATCH_DLL_EXPORT BPatch_funcCallExpr : public BPatch_snippet {
public:
// BPatch_funcCallExpr::BPatch_funcCallExpr
// Creates a representation of a function call
BPatch_funcCallExpr(const BPatch_function& func,
const BPatch_Vector<BPatch_snippet *> &args);
};
class BPATCH_DLL_EXPORT BPatch_ifExpr : public BPatch_snippet {
public:
// BPatch_ifExpr::BPatch_ifExpr
// Creates a conditional expression "if <conditional> tClause;"
BPatch_ifExpr(const BPatch_boolExpr &conditional,
const BPatch_snippet &tClause);
// BPatch_ifExpr::BPatch_ifExpr
// Creates a conditional expression
// "if <conditional> tClause; else fClause;"
BPatch_ifExpr(const BPatch_boolExpr &conditional,
const BPatch_snippet &tClause,
const BPatch_snippet &fClause);
};
class BPATCH_DLL_EXPORT BPatch_nullExpr : public BPatch_snippet {
public:
// BPatch_nullExpr::BPatch_nullExpr
// Creates a null snippet that can be used as a placeholder.
BPatch_nullExpr();
};
class BPATCH_DLL_EXPORT BPatch_paramExpr : public BPatch_snippet {
public:
// BPatch_paramExpr::BPatch_paramExpr
// Represents a parameter of a function (used in creating funcCallExpr)
// n is the index of the parameter that should be retrieved
// loc indicates whether the parameter lookup will be added at the call,
// at the function's entry point, or whether Dyninst should guess
// based on the instPoint type, which is error-prone and deprecated
BPatch_paramExpr(int n, BPatch_ploc loc=BPatch_ploc_guess);
};
class BPATCH_DLL_EXPORT BPatch_retExpr : public BPatch_snippet {
public:
// BPatch_retExpr::BPatch_retExpr
// Represents the return value from the function in which the
// snippet is inserted
BPatch_retExpr();
};
class BPATCH_DLL_EXPORT BPatch_retAddrExpr : public BPatch_snippet {
public:
// BPatch_retAddrExpr::BPatch_retAddrExpr
// Represents the return address from the function in which the
// snippet is inserted
BPatch_retAddrExpr();
};
class BPATCH_DLL_EXPORT BPatch_registerExpr : public BPatch_snippet {
public:
friend class BPatch_addressSpace;
// BPatch_registerExpr::BPatch_registerExpr
// Represents the return value from the function in which the
// snippet is inserted
BPatch_registerExpr(BPatch_register reg);
BPatch_registerExpr(Dyninst::MachRegister reg);
};
class BPATCH_DLL_EXPORT BPatch_sequence : public BPatch_snippet {
public:
// BPatch_sequence::BPatch_sequence
// Represents a sequence of statements
BPatch_sequence(const BPatch_Vector<BPatch_snippet *> &items);
};
class BPATCH_DLL_EXPORT BPatch_variableExpr : public BPatch_snippet
{
friend class BPatch_process;
friend class BPatch_addressSpace;
friend class BPatch_binaryEdit;
friend class BPatch_image;
friend class BPatch_function;
std::string name;
BPatch_addressSpace *appAddSpace;
AddressSpace *lladdrSpace;
void *address;
int size;
BPatch_point *scope;
bool isLocal;
BPatch_type *type;
int_variable *intvar;
AddressSpace *getAS();
// Used to get expressions for the components of a structure
// Used to get function pointers
BPatch_variableExpr(const char *in_name,
BPatch_addressSpace *in_addSpace,
AddressSpace *as,
AstNodePtr ast_wrapper_,
BPatch_type *type, void* in_address);
// Used to get forked copies of variable expressions
// Used by malloc & malloc_by_type
BPatch_variableExpr(BPatch_addressSpace *in_addSpace,
AddressSpace *as,
void *in_address,
int in_register, BPatch_type *type,
BPatch_storageClass storage = BPatch_storageAddr,
BPatch_point *scp = NULL);
// Used for locals (naturally)
BPatch_variableExpr(BPatch_addressSpace *in_addSpace,
AddressSpace *as,
BPatch_localVar *lv, BPatch_type *type,
BPatch_point *scp);
// BPatch_variableExpr(const char *name, BPatch_addressSpace *in_addSpace,
// AddressSpace *ll_addSpace, void *in_address,
// BPatch_type *type);
// Used by findOrCreateVariable
BPatch_variableExpr(BPatch_addressSpace *in_addSpace,
AddressSpace *ll_addSpace, int_variable *iv,
BPatch_type *type);
public:
static BPatch_variableExpr* makeVariableExpr(BPatch_addressSpace* in_addSpace,
int_variable* v,
BPatch_type* type);
static BPatch_variableExpr* makeVariableExpr(BPatch_addressSpace* in_addSpace,
AddressSpace* in_llAddSpace,
std::string name,
void* offset,
BPatch_type* type);
public:
// Public functions for use by users of the library:
// BPatch_variableExpr::getSize
// Returns the size (in bytes) of this variable
unsigned int getSize() const;
// BPatch_variableExpr::getType
// Returns the type of this variable
const BPatch_type * getType();
// BPatch_variableExpr::setType
// Sets the type of this variable
// XXX -- should this really be public?
bool setType(BPatch_type *t);
// BPatch_variableExpr::setSize
// Sets the size of this variable
// XXX -- should this really be public?
bool setSize(int sz);
// BPatch_variableExpr::readValue
// Read the value of a variable in a thread's address space.
// <dst> is assumed to be the same size as the variable.
bool readValue(void *dst);
// BPatch_variableExpr::readValue
// Read the value of a variable in a thread's address space.
// Will read <len> bytes into <dst>
bool readValue(void *dst, int len);
// BPatch_variableExpr::writeValue
// Write a value into a variable in a thread's address space.
// variable is assumed to be the same size as the <dst>.
// returns false if the type info isn't available (i.e. we don't know the size)
bool writeValue(const void *src, bool saveWorld=false);
// BPatch_variableExpr::writeValue
// Write a value into a variable in a thread's address space.
// Will write <len> bytes from <src> into variable
bool writeValue(const void *src, int len,bool saveWorld=false);
// BPatch_variableExpr::getName
// Returns the symbol table name for this variable
const char * getName();
// BPatch_variableExpr::getBaseAddr
// Returns base address of this variable in the target's address space
void * getBaseAddr();
// BPatch_variableExpr::getComponents
// return variable expressions for all of the fields in a struct/union
BPatch_Vector<BPatch_variableExpr *> * getComponents();
};
class BPATCH_DLL_EXPORT BPatch_breakPointExpr : public BPatch_snippet {
public:
// BPatch_breakPointExpr::BPatch_breakPointExpr
// Creates a representation of a break point in the target process
BPatch_breakPointExpr();
};
// VG(11/05/01): This nullary snippet will return the effective
// address of a memory access when inserted at an instrumentation
// point that is a memory access. In other words, the instruction at
// the point where it is inserted is the one to get effective address
// for. Furthermore, there must be memory access information about
// the inst. point; this basically means that the point must have been
// created using a method that attaches that info to the point -
// e.g. using findPoint(const std::set<BPatch_opCode>& ops) from
// BPatch_function.
// VG(7/31/02): Since x86 can have 2 addresses per instruction, there is
// now parameter for the constructor indicating which of these you want.
// It defaults to the 1st access (#0).
// VG(8/14/02): added conditional parameter
class BPATCH_DLL_EXPORT BPatch_effectiveAddressExpr : public BPatch_snippet
{
public:
// BPatch_effectiveAddressExpr:: BPatch_effectiveAddressExpr
// Construct a snippet representing an effective address.
BPatch_effectiveAddressExpr(int _which = 0, int size = 8);
};
// Number of bytes moved
class BPATCH_DLL_EXPORT BPatch_bytesAccessedExpr : public BPatch_snippet
{
public:
// BPatch_bytesAccessedExpr::BPatch_bytesAccessedExpr
// Construct a snippet representing the number of bytes accessed.
BPatch_bytesAccessedExpr(int _which = 0);
};
// VG(8/11/2): It is possible to have a more general expression, say
// machineConditionExpr, then have this reimplemented as ifExpr(machineConditionExpr, ...),
// and have an optimization (fast path) for that case using the specialized
// AST that supports this class. Memory instrumentation has no need for a standalone
// machineConditionExpr, so that remains TBD...
class BPATCH_DLL_EXPORT BPatch_ifMachineConditionExpr : public BPatch_snippet {
public:
// BPatch_ifMachineConditionExpr::BPatch_ifMachineConditionExpr
//
BPatch_ifMachineConditionExpr(const BPatch_snippet &tClause);
};
class BPATCH_DLL_EXPORT BPatch_threadIndexExpr : public BPatch_snippet {
public:
//
// BPatch_threadIndexExpr::BPatch_threadIndexExpr
BPatch_threadIndexExpr();
};
class BPATCH_DLL_EXPORT BPatch_tidExpr : public BPatch_snippet {
public:
//
// BPatch_tidExpr::BPatch_tidExpr
BPatch_tidExpr(BPatch_process *proc);
};
class BPatch_instruction;
typedef enum {
BPatch_noInterp,
BPatch_interpAsTarget,
BPatch_interpAsReturnAddr,
} BPatch_stInterpret;
class BPATCH_DLL_EXPORT BPatch_shadowExpr : public BPatch_snippet {
public:
// BPatch_stopThreadExpr
// This snippet type stops the thread that executes it. It
// evaluates a calculation snippet and triggers a callback to the
// user program with the result of the calculation and a pointer to
// the BPatch_point at which the snippet was inserted
BPatch_shadowExpr(bool entry,
const BPatchStopThreadCallback &cb,
const BPatch_snippet &calculation,
bool useCache = false,
BPatch_stInterpret interp = BPatch_noInterp);
};
class BPATCH_DLL_EXPORT BPatch_stopThreadExpr : public BPatch_snippet {
public:
// BPatch_stopThreadExpr
// This snippet type stops the thread that executes it. It
// evaluates a calculation snippet and triggers a callback to the
// user program with the result of the calculation and a pointer to
// the BPatch_point at which the snippet was inserted
BPatch_stopThreadExpr(const BPatchStopThreadCallback &cb,
const BPatch_snippet &calculation,
bool useCache = false,
BPatch_stInterpret interp = BPatch_noInterp);
// for internal use in conjunction with memory emulation and defensive
// mode analysis
BPatch_stopThreadExpr(
const BPatchStopThreadCallback &cb,
const BPatch_snippet &calculation,
const mapped_object &obj,
bool useCache = false,
BPatch_stInterpret interp = BPatch_noInterp);
};
class BPATCH_DLL_EXPORT BPatch_originalAddressExpr : public BPatch_snippet
{
public:
// BPatch_originalAddressExpr
// Construct a snippet representing the original address of an
// instruction
BPatch_originalAddressExpr();
};
class BPATCH_DLL_EXPORT BPatch_actualAddressExpr : public BPatch_snippet
{
public:
// BPatch_actualAddressExpr
// Construct a snippet representing the actual (relocated) address
// where the snippet was executed.
BPatch_actualAddressExpr();
};
class BPATCH_DLL_EXPORT BPatch_dynamicTargetExpr : public BPatch_snippet
{
public:
// BPatch_dynamicTargetExpr
// Construct a snippet to calculate the target of a
// dynamic control transfer instruction
BPatch_dynamicTargetExpr();
};
class BPATCH_DLL_EXPORT BPatch_scrambleRegistersExpr : public BPatch_snippet
{
public:
// BPatch_scrambleRegistersExpr
// Set all GPR to flag value.
BPatch_scrambleRegistersExpr();
};
#endif /* _BPatch_snippet_h_ */