mirror of
https://github.com/odin-lang/Odin.git
synced 2026-01-08 14:03:14 +00:00
Add frontend stuff instrumentation tooling
//+no-instrumentation @(no_instrumentation) @(instrumentation_enter) @(instrumentation_exit)
This commit is contained in:
@@ -2581,6 +2581,9 @@ gb_internal void generate_minimum_dependency_set(Checker *c, Entity *start) {
|
||||
str_lit("multi_pointer_slice_expr_error"),
|
||||
);
|
||||
|
||||
add_dependency_to_set(c, c->info.instrumentation_enter_entity);
|
||||
add_dependency_to_set(c, c->info.instrumentation_exit_entity);
|
||||
|
||||
generate_minimum_dependency_set_internal(c, start);
|
||||
|
||||
|
||||
@@ -3414,8 +3417,38 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) {
|
||||
}
|
||||
return true;
|
||||
} else if (name == "entry_point_only") {
|
||||
if (value != nullptr) {
|
||||
error(value, "'%.*s' expects no parameter", LIT(name));
|
||||
}
|
||||
ac->entry_point_only = true;
|
||||
return true;
|
||||
} else if (name == "no_instrumentation") {
|
||||
ExactValue ev = check_decl_attribute_value(c, value);
|
||||
if (ev.kind == ExactValue_Invalid) {
|
||||
ac->no_instrumentation = Instrumentation_Disabled;
|
||||
} else if (ev.kind == ExactValue_Bool) {
|
||||
if (ev.value_bool) {
|
||||
ac->no_instrumentation = Instrumentation_Disabled;
|
||||
} else {
|
||||
ac->no_instrumentation = Instrumentation_Enabled;
|
||||
}
|
||||
} else {
|
||||
error(value, "Expected either a boolean or no parameter for '%.*s'", LIT(name));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
} else if (name == "instrumentation_enter") {
|
||||
if (value != nullptr) {
|
||||
error(value, "'%.*s' expects no parameter", LIT(name));
|
||||
}
|
||||
ac->instrumentation_enter = true;
|
||||
return true;
|
||||
} else if (name == "instrumentation_exit") {
|
||||
if (value != nullptr) {
|
||||
error(value, "'%.*s' expects no parameter", LIT(name));
|
||||
}
|
||||
ac->instrumentation_exit = true;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -6216,6 +6249,17 @@ gb_internal void check_parsed_files(Checker *c) {
|
||||
GB_ASSERT(c->info.entity_queue.count.load(std::memory_order_relaxed) == 0);
|
||||
GB_ASSERT(c->info.definition_queue.count.load(std::memory_order_relaxed) == 0);
|
||||
|
||||
TIME_SECTION("check instrumentation calls");
|
||||
{
|
||||
if ((c->info.instrumentation_enter_entity != nullptr) ^
|
||||
(c->info.instrumentation_exit_entity != nullptr)) {
|
||||
Entity *e = c->info.instrumentation_enter_entity;
|
||||
if (!e) e = c->info.instrumentation_exit_entity;
|
||||
error(e->token, "Both @(instrumentation_enter) and @(instrumentation_exit) must be defined");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TIME_SECTION("add untyped expression values");
|
||||
// Add untyped expression values
|
||||
for (UntypedExprInfo u = {}; mpsc_dequeue(&c->global_untyped_queue, &u); /**/) {
|
||||
|
||||
Reference in New Issue
Block a user