Global variable finder in pinpoint plugin
This commit is contained in:
parent
3b49742f87
commit
631fab7431
@ -1,5 +1,6 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <final.h>
|
#include <final.h>
|
||||||
|
#include <stage0.h>
|
||||||
|
|
||||||
#include <safe-input.h>
|
#include <safe-input.h>
|
||||||
|
|
||||||
@ -11,5 +12,12 @@ void on_finish_unit(void* plugin_data, void* user_data) {
|
|||||||
Add UID symbol to CU -> __spslr_cu_<uid>
|
Add UID symbol to CU -> __spslr_cu_<uid>
|
||||||
Then dump accumulated data for finalizer
|
Then dump accumulated data for finalizer
|
||||||
*/
|
*/
|
||||||
std::cout << "Finishing unit \"" << lbasename(main_input_filename) << "\"" << std::endl;
|
|
||||||
|
std::cout << "Finishing unit \"" << lbasename(main_input_filename) << "\" ..." << std::endl;
|
||||||
|
|
||||||
|
for (const DataPin& dpin : dpins()) {
|
||||||
|
std::cout << " Data pin at symbol \"" << dpin.symbol << "\":" << std::endl;
|
||||||
|
for (const DataPin::Component& c : dpin.components)
|
||||||
|
std::cout << " offset " << c.offset << " (level " << c.level << ") -> target " << c.target << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,48 +8,41 @@ const std::list<DataPin>& dpins() {
|
|||||||
return pins;
|
return pins;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static bool compile_datapin(tree type, DataPin& pin, std::size_t offset = 0, std::size_t level = 0) {
|
||||||
struct DataPin {
|
bool res = false;
|
||||||
struct Component {
|
|
||||||
std::size_t offset;
|
|
||||||
std::size_t level;
|
|
||||||
UID target;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::string symbol;
|
const TargetType* relevant = TargetType::find(type);
|
||||||
std::list<Component> components;
|
if (relevant) {
|
||||||
};
|
pin.components.push_back(DataPin::Component{
|
||||||
*/
|
.offset = offset,
|
||||||
|
.level = level,
|
||||||
|
.target = relevant->uid()
|
||||||
|
});
|
||||||
|
|
||||||
/*
|
res = true;
|
||||||
bool type_matches(tree t, hash_set<tree> *target_types)
|
|
||||||
{
|
|
||||||
if (!t) return false;
|
|
||||||
t = TYPE_MAIN_VARIANT(t);
|
|
||||||
|
|
||||||
if (target_types->contains(t))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (TREE_CODE(t) == RECORD_TYPE || TREE_CODE(t) == UNION_TYPE)
|
|
||||||
{
|
|
||||||
for (tree field = TYPE_FIELDS(t); field; field = TREE_CHAIN(field))
|
|
||||||
{
|
|
||||||
if (TREE_CODE(field) == FIELD_DECL)
|
|
||||||
{
|
|
||||||
tree ftype = TREE_TYPE(field);
|
|
||||||
if (type_matches(ftype, target_types))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
if (TREE_CODE(type) != RECORD_TYPE /* && TREE_CODE(type) != UNION_TYPE */)
|
||||||
}
|
return res;
|
||||||
*/
|
|
||||||
|
|
||||||
static bool compile_datapin(tree type, DataPin& pin) {
|
for (tree field = TYPE_FIELDS(type); field; field = TREE_CHAIN(field)) {
|
||||||
// TODO
|
if (TREE_CODE(field) != FIELD_DECL)
|
||||||
return true;
|
continue;
|
||||||
|
|
||||||
|
std::size_t field_offset;
|
||||||
|
bool field_bitfield;
|
||||||
|
|
||||||
|
if (!field_info(field, &field_offset, nullptr, &field_bitfield))
|
||||||
|
pinpoint_fatal("compile_datapin failed to get field info");
|
||||||
|
|
||||||
|
if (field_bitfield)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
tree field_type = TREE_TYPE(field);
|
||||||
|
res = (res || compile_datapin(field_type, pin, offset + field_offset, level + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void on_static_var(tree var) {
|
static void on_static_var(tree var) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user