diff --git a/pinpoint/final/on_finish_unit.cpp b/pinpoint/final/on_finish_unit.cpp index f7b638e..a69d7b7 100644 --- a/pinpoint/final/on_finish_unit.cpp +++ b/pinpoint/final/on_finish_unit.cpp @@ -4,18 +4,40 @@ #include #include +#include #include +#include + +unsigned char cu_uid_md5[16]; +char cu_uid_hex[33]; + +static const unsigned char* calculate_cu_uid_md5() { + if (!main_input_filename) + return nullptr; + + md5_buffer(main_input_filename, strlen(main_input_filename), cu_uid_md5); + return cu_uid_md5; +} + +static const char* calculate_cu_uid_hex() { + const unsigned char* digest = calculate_cu_uid_md5(); + if (!digest) + return nullptr; + + for (int i = 0; i < 16; ++i) + sprintf(cu_uid_hex + 2*i, "%02x", digest[i]); + + cu_uid_hex[32] = '\0'; + return cu_uid_hex; +} 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 - */ + const char* cu_uid = calculate_cu_uid_hex(); + if (!cu_uid) + pinpoint_fatal("on_finish_unit failed to calculate compilation unit UID"); std::cout << "Finishing unit \"" << lbasename(main_input_filename) << "\" ..." << std::endl; + std::cout << " Unit UID is 0x" << cu_uid << std::endl; for (const auto& [uid, target] : TargetType::all()) std::cout << " Target " << uid << " -> \"" << target.name() << "\" (" << target.size() << ")" << std::endl; diff --git a/pinpoint/safegcc/safe-md5.h b/pinpoint/safegcc/safe-md5.h new file mode 100644 index 0000000..8341cb1 --- /dev/null +++ b/pinpoint/safegcc/safe-md5.h @@ -0,0 +1,8 @@ +#include + +#ifndef SAFEGCC_MD5_H +#define SAFEGCC_MD5_H + +#include + +#endif