diff --git a/pinpoint/CMakeLists.txt b/pinpoint/CMakeLists.txt index b6711c4..a4afc01 100644 --- a/pinpoint/CMakeLists.txt +++ b/pinpoint/CMakeLists.txt @@ -10,3 +10,4 @@ target_include_directories(spslr_pinpoint PRIVATE ${GCC_PLUGIN_PATH}/include ${C add_subdirectory(stage0) add_subdirectory(stage1) +add_subdirectory(final) diff --git a/pinpoint/final/CMakeLists.txt b/pinpoint/final/CMakeLists.txt new file mode 100644 index 0000000..cb8a344 --- /dev/null +++ b/pinpoint/final/CMakeLists.txt @@ -0,0 +1,2 @@ +target_sources(spslr_pinpoint PRIVATE on_finish_unit.cpp) +target_include_directories(spslr_pinpoint PRIVATE .) diff --git a/pinpoint/final/final.h b/pinpoint/final/final.h new file mode 100644 index 0000000..539e432 --- /dev/null +++ b/pinpoint/final/final.h @@ -0,0 +1,3 @@ +#pragma once + +void on_finish_unit(void* plugin_data, void* user_data); diff --git a/pinpoint/final/on_finish_unit.cpp b/pinpoint/final/on_finish_unit.cpp new file mode 100644 index 0000000..cdd1c33 --- /dev/null +++ b/pinpoint/final/on_finish_unit.cpp @@ -0,0 +1,15 @@ +#include +#include + +#include + +void on_finish_unit(void* plugin_data, void* user_data) { + /* + TODO + The result lbasename(...) is not unique (e.g., "file.c" and "sub/file.c") + Calculate UID for compilation unit -> hash(main_input_filename) + Add UID symbol to CU -> __spslr_cu_ + Then dump accumulated data for finalizer + */ + std::cout << "Finishing unit \"" << lbasename(main_input_filename) << "\"" << std::endl; +} diff --git a/pinpoint/pinpoint.cpp b/pinpoint/pinpoint.cpp index 8eeb892..25072d1 100644 --- a/pinpoint/pinpoint.cpp +++ b/pinpoint/pinpoint.cpp @@ -5,6 +5,7 @@ #include #include +#include int plugin_is_GPL_compatible; @@ -37,5 +38,9 @@ int plugin_init(struct plugin_name_args* plugin_info, struct plugin_gcc_version* asm_offset_pass_info.pos_op = PASS_POS_INSERT_AFTER; register_callback(plugin_info->base_name, PLUGIN_PASS_MANAGER_SETUP, nullptr, &asm_offset_pass_info); + // Final stage -> dump accumulated information + + register_callback(plugin_info->base_name, PLUGIN_FINISH_UNIT, on_finish_unit, NULL); + return 0; } diff --git a/pinpoint/stage0/on_finish_decl.cpp b/pinpoint/stage0/on_finish_decl.cpp index e4bc5bb..c67d257 100644 --- a/pinpoint/stage0/on_finish_decl.cpp +++ b/pinpoint/stage0/on_finish_decl.cpp @@ -1,8 +1,6 @@ -#include // TODO #include #include -#include static std::list pins; @@ -73,11 +71,7 @@ static void on_static_var(tree var) { pinpoint_fatal("on_static_var failed to get symbol of static variable"); pin.symbol = std::string{ symbol }; - pins.emplace_back(std::move(pin)); - - // TODO - std::cout << "Pinned: \"" << symbol << "\" (" << lbasename(main_input_filename) << ")" << std::endl; } void on_finish_decl(void* plugin_data, void* user_data) {