aboutsummaryrefslogtreecommitdiff
path: root/src/entity.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/entity.cpp')
-rw-r--r--src/entity.cpp50
1 files changed, 41 insertions, 9 deletions
diff --git a/src/entity.cpp b/src/entity.cpp
index ce27da3f2..802b381f9 100644
--- a/src/entity.cpp
+++ b/src/entity.cpp
@@ -43,8 +43,9 @@ enum EntityFlag : u64 {
EntityFlag_NoAlias = 1ull<<9,
EntityFlag_TypeField = 1ull<<10,
EntityFlag_Value = 1ull<<11,
+ EntityFlag_BitFieldField = 1ull<<12,
-
+ EntityFlag_NoCapture = 1ull<<13, // #no_capture
EntityFlag_PolyConst = 1ull<<15,
EntityFlag_NotExported = 1ull<<16,
@@ -59,7 +60,7 @@ enum EntityFlag : u64 {
EntityFlag_ProcBodyChecked = 1ull<<21,
EntityFlag_CVarArg = 1ull<<22,
-
+ EntityFlag_NoBroadcast = 1ull<<23,
EntityFlag_AnyInt = 1ull<<24,
EntityFlag_Disabled = 1ull<<25,
@@ -84,8 +85,6 @@ enum EntityFlag : u64 {
EntityFlag_Require = 1ull<<50,
EntityFlag_ByPtr = 1ull<<51, // enforce parameter is passed by pointer
- EntityFlag_OldForOrSwitchValue = 1ull<<52,
-
EntityFlag_Overridden = 1ull<<63,
};
@@ -105,6 +104,7 @@ enum ParameterValueKind {
ParameterValue_Constant,
ParameterValue_Nil,
ParameterValue_Location,
+ ParameterValue_Expression,
ParameterValue_Value,
};
@@ -134,9 +134,7 @@ enum EntityConstantFlags : u32 {
enum ProcedureOptimizationMode : u8 {
ProcedureOptimizationMode_Default,
ProcedureOptimizationMode_None,
- ProcedureOptimizationMode_Minimal,
- ProcedureOptimizationMode_Size,
- ProcedureOptimizationMode_Speed,
+ ProcedureOptimizationMode_FavorSize,
};
@@ -209,9 +207,11 @@ struct Entity {
CommentGroup *comment;
} Constant;
struct {
+ Ast *type_expr; // only used for some variables within procedure bodies
Ast *init_expr; // only used for some variables within procedure bodies
i32 field_index;
i32 field_group_index;
+ u8 bit_field_bit_size;
ParameterValue param_value;
@@ -222,11 +222,14 @@ struct Entity {
Ast * foreign_library_ident;
String link_name;
String link_prefix;
+ String link_suffix;
String link_section;
CommentGroup *docs;
CommentGroup *comment;
bool is_foreign;
bool is_export;
+ bool is_global;
+ bool is_rodata;
} Variable;
struct {
Type * type_parameter_specialization;
@@ -241,6 +244,7 @@ struct Entity {
Ast * foreign_library_ident;
String link_name;
String link_prefix;
+ String link_suffix;
DeferredProcedure deferred_procedure;
struct GenProcsData *gen_procs;
@@ -249,8 +253,10 @@ struct Entity {
bool is_foreign : 1;
bool is_export : 1;
bool generated_from_polymorphic : 1;
- bool target_feature_disabled : 1;
- String target_feature;
+ bool entry_point_only : 1;
+ bool has_instrumentation : 1;
+ bool is_memcpy_like : 1;
+ bool uses_branch_location : 1;
} Procedure;
struct {
Array<Entity *> entities;
@@ -264,6 +270,7 @@ struct Entity {
Scope *scope;
} ImportName;
struct {
+ Ast *decl;
Slice<String> paths;
String name;
i64 priority_index;
@@ -331,6 +338,9 @@ gb_internal Entity *alloc_entity(EntityKind kind, Scope *scope, Token token, Typ
entity->token = token;
entity->type = type;
entity->id = 1 + global_entity_id.fetch_add(1);
+ if (token.pos.file_id) {
+ entity->file = thread_safe_get_ast_file_from_id(token.pos.file_id);
+ }
return entity;
}
@@ -476,3 +486,25 @@ gb_internal Entity *strip_entity_wrapping(Ast *expr) {
Entity *e = entity_from_expr(expr);
return strip_entity_wrapping(e);
}
+
+
+gb_internal bool is_entity_local_variable(Entity *e) {
+ if (e == nullptr) {
+ return false;
+ }
+ if (e->kind != Entity_Variable) {
+ return false;
+ }
+ if (e->Variable.is_global) {
+ return false;
+ }
+ if (e->scope == nullptr) {
+ return true;
+ }
+ if (e->flags & (EntityFlag_ForValue|EntityFlag_SwitchValue|EntityFlag_Static)) {
+ return false;
+ }
+
+ return ((e->scope->flags &~ ScopeFlag_ContextDefined) == 0) ||
+ (e->scope->flags & ScopeFlag_Proc) != 0;
+}