From 631fab7431a919674df4d9ad76bb4c0b6214c473 Mon Sep 17 00:00:00 2001 From: York Jasper Niebuhr Date: Sun, 26 Oct 2025 00:17:06 +0200 Subject: [PATCH] Global variable finder in pinpoint plugin --- pinpoint/final/on_finish_unit.cpp | 10 ++++- pinpoint/stage0/on_finish_decl.cpp | 65 +++++++++++++----------------- 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/pinpoint/final/on_finish_unit.cpp b/pinpoint/final/on_finish_unit.cpp index cdd1c33..c87645b 100644 --- a/pinpoint/final/on_finish_unit.cpp +++ b/pinpoint/final/on_finish_unit.cpp @@ -1,5 +1,6 @@ #include #include +#include #include @@ -11,5 +12,12 @@ void on_finish_unit(void* plugin_data, void* user_data) { Add UID symbol to CU -> __spslr_cu_ 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; + } } diff --git a/pinpoint/stage0/on_finish_decl.cpp b/pinpoint/stage0/on_finish_decl.cpp index c67d257..43c65a4 100644 --- a/pinpoint/stage0/on_finish_decl.cpp +++ b/pinpoint/stage0/on_finish_decl.cpp @@ -8,48 +8,41 @@ const std::list& dpins() { return pins; } -/* -struct DataPin { - struct Component { - std::size_t offset; - std::size_t level; - UID target; - }; +static bool compile_datapin(tree type, DataPin& pin, std::size_t offset = 0, std::size_t level = 0) { + bool res = false; - std::string symbol; - std::list components; -}; -*/ + const TargetType* relevant = TargetType::find(type); + if (relevant) { + pin.components.push_back(DataPin::Component{ + .offset = offset, + .level = level, + .target = relevant->uid() + }); -/* -bool type_matches(tree t, hash_set *target_types) -{ - if (!t) return false; - t = TYPE_MAIN_VARIANT(t); + res = true; + } - if (target_types->contains(t)) - return true; + if (TREE_CODE(type) != RECORD_TYPE /* && TREE_CODE(type) != UNION_TYPE */) + return res; - 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; - } - } - } + for (tree field = TYPE_FIELDS(type); field; field = TREE_CHAIN(field)) { + if (TREE_CODE(field) != FIELD_DECL) + continue; - return false; -} -*/ + std::size_t field_offset; + bool field_bitfield; -static bool compile_datapin(tree type, DataPin& pin) { - // TODO - return true; + 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) {