Files
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

341 lines
11 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_function_h_
#define _BPatch_function_h_
#include <map>
#include <set>
#include <string>
#include <vector>
#include "Annotatable.h"
#include "BPatch_dll.h"
#include "BPatch_Vector.h"
#include "BPatch_Set.h"
#include "BPatch_enums.h"
#include "BPatch_type.h"
#include "BPatch_module.h"
#include "BPatch_memoryAccess_NP.h"
#include "StackMod.h"
#include "dyntypes.h"
class func_instance;
class BPatch_localVarCollection;
class BPatch_function;
class BPatch_point;
class BPatch_flowGraph;
class BPatchTranslatorBase;
class ParameterType;
class ReturnParameterType;
class BPatch_function;
namespace Dyninst {
namespace ParseAPI {
class Function;
BPATCH_DLL_EXPORT Function *convert(const BPatch_function *);
}
namespace PatchAPI {
class PatchFunction;
BPATCH_DLL_EXPORT PatchFunction *convert(const BPatch_function *);
}
}
class BPATCH_DLL_EXPORT BPatch_function :
public BPatch_sourceObj,
public Dyninst::AnnotatableSparse
{
friend class BPatch_flowGraph;
friend class BPatch_basicBlock;
friend class BPatch_asyncEventHandler;
friend class BPatch_image;
friend class BPatch_thread;
friend class BPatch_process;
friend class BPatch_binaryEdit;
friend class BPatch_addressSpace;
friend class BPatch_point;
friend Dyninst::ParseAPI::Function *Dyninst::ParseAPI::convert(const BPatch_function *);
friend Dyninst::PatchAPI::PatchFunction *Dyninst::PatchAPI::convert(const BPatch_function *);
//BPatch_process *proc;
BPatch_addressSpace *addSpace;
AddressSpace *lladdSpace;
BPatch_type *retType;
BPatch_module *mod;
BPatch_flowGraph* cfg;
bool cfgCreated;
bool liveInit;
BPatch_point* createMemInstPoint(void *addr, BPatch_memoryAccess* ma);
func_instance *func;
bool varsAndParamsValid;
private:
void constructVarsAndParams();
void identifyParamDependencies(BPatch_function* callee, void* calleeAddress);
std::map<BPatch_localVar *, BPatch_variableExpr *> local_vars;
BPatch_Vector<BPatch_localVar *> params;
public:
//dynC internal use only
bool hasParamDebugInfo();
public:
virtual ~BPatch_function();
// The following are for internal use by the library only:
func_instance *lowlevel_func() const { return func; }
BPatch_process *getProc() const;
BPatch_addressSpace *getAddSpace() const { return addSpace; }
BPatch_function(BPatch_addressSpace *_addSpace, func_instance *_func,
BPatch_module *mod = NULL);
BPatch_function(BPatch_addressSpace *_addSpace, func_instance *_func,
BPatch_type * _retType,
BPatch_module *);
bool getSourceObj(BPatch_Vector<BPatch_sourceObj *> &);
BPatch_sourceObj *getObjParent();
BPatch_localVarCollection * localVariables;
BPatch_localVarCollection * funcParameters;
void setReturnType(BPatch_type * _retType){retType = _retType;}
void setModule(BPatch_module *module) { if (this->mod == NULL) this->mod = module;}
void removeCFG() { cfg = NULL; }
void getUnresolvedControlTransfers(BPatch_Vector<BPatch_point *> &unresolvedCF);
void getAbruptEndPoints(BPatch_Vector<BPatch_point *> &abruptEnds);
void getCallerPoints(BPatch_Vector<BPatch_point*>& callerPoints);
void getAllPoints(BPatch_Vector<BPatch_point*>& allPoints);
void getEntryPoints(BPatch_Vector<BPatch_point *> &entryPoints);
void getExitPoints(BPatch_Vector<BPatch_point *> &entryPoints);
void getCallPoints(BPatch_Vector<BPatch_point *> &entryPoints);
bool setHandlerFaultAddrAddr(Dyninst::Address addr, bool set);
bool removeInstrumentation(bool useInsertionSet);
bool parseNewEdge(Dyninst::Address source, Dyninst::Address target);
void relocateFunction();
bool getSharedFuncs(std::set<BPatch_function*> &funcs);
void addParam(Dyninst::SymtabAPI::localVar *lvar);
// void addParam(const char * _name, BPatch_type *_type, int _linenum,
// long _frameOffset, int _reg = -1,
// BPatch_storageClass _sc = BPatch_storageFrameOffset);
void fixupUnknown(BPatch_module *);
// This isn't so much for internal use only, but it *should*
// remain undocumented for now.
bool containsSharedBlocks();
// End of functions for internal use only
// For users of the library:
// BPatch_function::getName
// Returns <demangled> name of function
char * getName(char *s, int len);
// String interface to mangled name
std::string getName();
std::string getMangledName();
std::string getDemangledName();
std::string getTypedName();
bool getNames(std::vector<std::string> &names);
bool getDemangledNames(std::vector<std::string> &names);
bool getMangledNames(std::vector<std::string> &names);
bool getTypedNames(std::vector<std::string> &names);
// BPatch_function::getMangledName
// Returns mangled name of function, same as getName for non-c++ mutatees
char * getMangledName(char *s, int len);
// BPatch_function::getTypedName
// Returns demanged name of function (with type string), may be empty
char * getTypedName(char *s, int len);
// BPatch_function::getNames
// Adds all names of the function (inc. weak symbols) to the
// provided vector. Names are represented as const char *s,
// and do not require cleanup by the user.
bool getNames(BPatch_Vector<const char *> &names);
// BPatch_function::getMangledNames
// Adds all mangled names of the function (inc. weak symbols) to
// the provided vector. Names are represented as const char *s,
// and do not require cleanup by the user.
bool getMangledNames(BPatch_Vector<const char *> &names);
// BPatch_function::getBaseAddr
// Returns base address of function
void * getBaseAddr(void);
// BPatch_function::getReturnType
// Returns the <BPatch_type> return type of this function
BPatch_type * getReturnType();
// BPatch_function::getModule
// Returns the BPatch_module to which this function belongs
BPatch_module * getModule();
// BPatch_function::getParams
// Returns a vector of BPatch_localVar, representing this function's parameters
BPatch_Vector<BPatch_localVar *> * getParams();
// BPatch_function::getVars
// Returns a vector of local variables in this functions
BPatch_Vector<BPatch_localVar *> * getVars();
// BPatch_function::findPoint
// Returns a vector of inst points, corresponding to the given BPatch_procedureLocation
BPatch_Vector<BPatch_point *> * findPoint(const BPatch_procedureLocation loc);
// BPatch_function::findPoint
// Returns a vector of inst points, corresponding to the given set of op codes
BPatch_Vector<BPatch_point *> * findPoint(const BPatch_Set<BPatch_opCode>& ops);
BPatch_Vector<BPatch_point *> * findPoint(const std::set<BPatch_opCode>& ops);
// BPatch_function::findPoint
//
// Returns a BPatch_point that corresponds with the provided address. Returns NULL
// if the address does not correspond with an instruction.
BPatch_point * findPoint(Dyninst::Address addr);
// BPatch_function::findLocalVar
// Returns a BPatch_localVar, if a match for <name> is found
BPatch_localVar * findLocalVar(const char * name);
// BPatch_function::findLocalParam
// Returns a BPatch_localVar, if a match for <name> is found
BPatch_localVar * findLocalParam(const char * name);
// BPatch_function::findVariable
// Returns a set of variables matching <name> at the scope of this function
// -- or global scope, if nothing found in this scope
BPatch_Vector<BPatch_variableExpr *> * findVariable(const char *name);
bool findVariable(const char *name, BPatch_Vector<BPatch_variableExpr*> &vars);
// BPatch_function::getVariables
// This returns false, and should probably not exist. See getVars.
// is this defined, what variables should be returned??
// FIXME (delete me)
bool getVariables(BPatch_Vector<BPatch_variableExpr *> &vect);
// BPatch_function::getModuleName
// Returns name of module this function belongs to
char * getModuleName(char *name, int maxLen);
// BPatch_function::isInstrumentable
//
// Returns true if the function is instrumentable.
bool isInstrumentable();
// BPatch_function::isSharedLib
// Returns true if this function lives in a shared library
bool isSharedLib();
// BPatch_function::getCFG
//
// method to create the control flow graph for the function
BPatch_flowGraph* getCFG();
const char * addName(const char *name, bool isPrimary = true, bool isMangled = false);
// Return native pointer to the function.
// Allocates and returns a special type of BPatch_variableExpr.
// Get all functions that share a block (or any code, but it will
// always be a block) with this function.
// Get the underlying ParseAPI Function
operator Dyninst::ParseAPI::Function *() const;
// Get the underlying PatchAPI Function
operator Dyninst::PatchAPI::PatchFunction *() const;
bool getAddressRange(void * &start, void * &end);
bool getAddressRange(Dyninst::Address &start, Dyninst::Address &end);
unsigned int getFootprint();
BPatch_variableExpr *getFunctionRef();
bool findOverlapping(BPatch_Vector<BPatch_function *> &funcs);
// Add stack modifications
bool addMods(std::set<StackMod*>);
};
#endif /* _BPatch_function_h_ */