diff --git a/pinpoint/safegcc/safe-diagnostic.h b/pinpoint/safegcc/safe-diagnostic.h new file mode 100644 index 0000000..3577020 --- /dev/null +++ b/pinpoint/safegcc/safe-diagnostic.h @@ -0,0 +1,9 @@ +#include + +#ifndef SAFEGCC_DIAGNOSTIC_H +#define SAFEGCC_DIAGNOSTIC_H + +#include +#include + +#endif diff --git a/pinpoint/spslr_error.h b/pinpoint/spslr_error.h new file mode 100644 index 0000000..54c8d62 --- /dev/null +++ b/pinpoint/spslr_error.h @@ -0,0 +1,8 @@ +#pragma once +#include + +#define spslr_fatal_loc(loc, fmt, ...) \ + fatal_error((loc), "[spslr_pinpoint] " fmt, ##__VA_ARGS__) + +#define spslr_fatal(fmt, ...) \ + spslr_fatal_loc(UNKNOWN_LOCATION, fmt, ##__VA_ARGS__) diff --git a/pinpoint/stage0/on_finish_type.cpp b/pinpoint/stage0/on_finish_type.cpp index 73154a6..077d4b4 100644 --- a/pinpoint/stage0/on_finish_type.cpp +++ b/pinpoint/stage0/on_finish_type.cpp @@ -1,6 +1,14 @@ #include +#include void on_finish_type(void* plugin_data, void* user_data) { + tree t = (tree)plugin_data; + TargetType* type = TargetType::find_mutable(t); + if (!type) + return; + + if (!type->fetch_fields()) + spslr_fatal("on_finish_type failed to fetch fields of target \"%s\"", type->name().c_str()); } diff --git a/pinpoint/stage0/stage0.h b/pinpoint/stage0/stage0.h index 8c30a1f..8847a36 100644 --- a/pinpoint/stage0/stage0.h +++ b/pinpoint/stage0/stage0.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include #include #include @@ -38,13 +39,16 @@ public: bool valid() const; bool fields() const; - - bool fetch_fields(); + std::string name() const; static void add(tree t); static std::size_t count(); static const TargetType* find(tree t); // O(n) static const TargetType* find(UID uid); // O(1) +private: + friend void on_finish_type(void*, void*); + bool fetch_fields(); + static TargetType* find_mutable(tree t); }; void on_register_attributes(void* plugin_data, void* user_data); diff --git a/pinpoint/stage0/target.cpp b/pinpoint/stage0/target.cpp index bc8aaba..4cabf08 100644 --- a/pinpoint/stage0/target.cpp +++ b/pinpoint/stage0/target.cpp @@ -30,9 +30,23 @@ bool TargetType::fields() const { return (m_flags & FLAG_FIELDS) != 0; } -bool TargetType::fetch_fields() { - // TODO - return false; +std::string TargetType::name() const { + const char* error_name = ""; + const char* anonymous_name = ""; + + if (!valid()) + return { error_name }; + + tree name_tree = TYPE_NAME(m_main_variant); + if (!name_tree) + return { anonymous_name }; + + if (TREE_CODE(name_tree) == TYPE_DECL && DECL_NAME(name_tree)) + return { IDENTIFIER_POINTER(DECL_NAME(name_tree)) }; + else if (TREE_CODE(name_tree) == IDENTIFIER_NODE) + return { IDENTIFIER_POINTER(name_tree) }; + + return { anonymous_name }; } void TargetType::add(tree t) { @@ -64,6 +78,19 @@ const TargetType* TargetType::find(tree t) { return nullptr; } +TargetType* TargetType::find_mutable(tree t) { + tree main_variant = get_record_main_variant(t); + if (!main_variant) + return nullptr; + + for (auto& [uid, target] : targets) { + if (lang_hooks.types_compatible_p(main_variant, target.m_main_variant)) + return ⌖ + } + + return nullptr; +} + const TargetType* TargetType::find(UID uid) { auto it = targets.find(uid); if (it == targets.end()) @@ -72,3 +99,8 @@ const TargetType* TargetType::find(UID uid) { return &it->second; } +bool TargetType::fetch_fields() { + // TODO + return false; +} +