do not use struct function pointers elsewhere, use them only in case

when polymorphysm needed
This commit is contained in:
2020-02-03 15:04:09 +04:00
parent b79db14d0c
commit 810ce7519d
15 changed files with 609 additions and 749 deletions
+17 -28
View File
@@ -29,15 +29,11 @@ typedef struct pst_callee_info {
typedef struct pst_call_site_param {
list_node node; // uplink. !!! must be first !!!
// methods
void (*set_location) (pst_call_site_param* param, Dwarf_Op* expr, size_t exprlen);
// fields
Dwarf_Die* param; // reference to parameter DIE in callee (DW_AT_call_parameter)
char* name; // name of parameter if present (DW_AT_name)
pst_dwarf_expr location; // DWARF stack containing location expression
uint64_t value; // parameter's value
bool allocated; // whether this object was allocated or not
Dwarf_Die* param; // reference to parameter DIE in callee (DW_AT_call_parameter)
char* name; // name of parameter if present (DW_AT_name)
pst_dwarf_expr location; // DWARF stack containing location expression
uint64_t value; // parameter's value
bool allocated; // whether this object was allocated or not
} pst_call_site_param;
void pst_call_site_param_init(pst_call_site_param* param);
@@ -49,18 +45,10 @@ void pst_call_site_param_fini(pst_call_site_param* param);
// DW_TAG_call_site
// -----------------------------------------------------------------------------------
typedef struct pst_call_site {
list_node node; // uplink. !!! must be first !!!
hash_node tgt_node;
hash_node org_node;
list_node node; // uplink to list of call-sites
hash_node tgt_node; // uplink to call-site by node dictionary
hash_node org_node; // uplink to call-site by origin dictionary
// methods
pst_call_site_param* (*add_param) (pst_call_site* site);
void (*del_param) (pst_call_site* site, pst_call_site_param* p);
pst_call_site_param* (*next_param) (pst_call_site* site, pst_call_site_param* p);
pst_call_site_param* (*find_param) (pst_call_site* site, pst_dwarf_expr* expr);
bool (*handle_dwarf) (pst_call_site* site, Dwarf_Die* die);
// fields
uint64_t target; // pointer to callee function's (it's Low PC + base address)
char* origin; // name of callee function
Dwarf_Die* die; // DIE of function for which this call site has parameters
@@ -72,19 +60,14 @@ void pst_call_site_init(pst_call_site* site, pst_context* context, uint64_t targ
pst_call_site* pst_call_site_new(pst_context* context, uint64_t target, const char* origin);
void pst_call_site_fini(pst_call_site* site);
pst_call_site_param* pst_call_site_find(pst_call_site* site, pst_dwarf_expr* expr);
bool pst_call_site_handle_dwarf(pst_call_site* site, Dwarf_Die* child);
typedef struct __pst_function pst_function;
// -----------------------------------------------------------------------------------
// storage for all of function's call sites
// -----------------------------------------------------------------------------------
typedef struct pst_call_site_storage {
// methods
bool (*handle_dwarf) (pst_call_site_storage* storage, Dwarf_Die* result, pst_function* info);
pst_call_site* (*add_call_site) (pst_call_site_storage* storage, uint64_t target, const char* origin);
void (*del_call_site) (pst_call_site_storage* storage, pst_call_site* site);
pst_call_site* (*find_call_site) (pst_call_site_storage* storage, pst_function* callee);
pst_call_site* (*next_call_site) (pst_call_site_storage* storage, pst_call_site* st);
// fields
pst_context* ctx;
list_head call_sites; // Call-Site definitions
hash_head cs_to_target; // map pointer to caller to call-site
@@ -96,5 +79,11 @@ void pst_call_site_storage_init(pst_call_site_storage* storage, pst_context* ctx
pst_call_site_storage* pst_call_site_storage_new(pst_context* ctx);
void pst_call_site_storage_fini(pst_call_site_storage* storage);
bool pst_call_site_storage_handle_dwarf(pst_call_site_storage* storage, Dwarf_Die* result, pst_function* info);
pst_call_site* pst_call_site_storage_find(pst_call_site_storage* storage, pst_function* callee);
pst_call_site* pst_call_site_storage_add(pst_call_site_storage* storage, uint64_t target, const char* origin);
void pst_call_site_storage_del(pst_call_site_storage* storage, pst_call_site* st);
void pst_call_site_storage_del(pst_call_site_storage* storage, pst_call_site* st);
#endif /* FRAMEWORK_DWARF_CALL_SITE_H_ */